正在gdb中转储内存-如何在运行时选择文件名

正在gdb中转储内存-如何在运行时选择文件名,gdb,Gdb,我正在运行一个对文件进行处理的程序。 我希望能够为程序提供多个文件,通过使用gdb附加到程序,我希望在代码中的某个点为每个文件获得内存转储。我希望每个文件的转储都转到与输入文件具有相同文件名的文件(可能在格式化它之后,比如添加后缀) 因此,假设我有一个名为HereIsTheFileName(char*filename)的函数和另一个名为DumpThisMemoryRegion(void*startAddr,void*endAddr)的函数,我想执行如下操作: 要获取环境变量的文件名,请执行以下操

我正在运行一个对文件进行处理的程序。 我希望能够为程序提供多个文件,通过使用gdb附加到程序,我希望在代码中的某个点为每个文件获得内存转储。我希望每个文件的转储都转到与输入文件具有相同文件名的文件(可能在格式化它之后,比如添加后缀)

因此,假设我有一个名为HereIsTheFileName(char*filename)的函数和另一个名为DumpThisMemoryRegion(void*startAddr,void*endAddr)的函数,我想执行如下操作:

要获取环境变量的文件名,请执行以下操作:

  • 在此处断开文件名
  • 命令1
  • 设置$filename=malloc(strlen(filename)+1)
  • 调用memcpy($filename,filename,strlen(filename)+1)
  • 结束
然后将内存转储到我先前保存的文件名:

  • 断开此内存区域
  • 命令2
  • 追加二进制内存“%s.memory”%$filename startAddr endAddr
  • 结束
(我甚至愿意接受文件名的原样,不设置格式,如果这是最困难的部分)

但是,除了append/dump命令的exlicit文件名之外,我无法让gdb接受任何内容。当我运行“追加二进制内存$filename…”时,我在文件“/workdir/$filename”中得到了输出。 有没有办法让gdb在运行时选择文件名


谢谢

我不知道如何让append接受一个运行时文件名,但你总是可以通过将整个内容写入一个文件,然后使用日志记录来获取该文件的来源来进行欺骗

通过将其放入~/.gdbinit

define reallyappend
  printf "using gdbtmp.log to dump memory to file %s\n", $arg0
  set logging file gdbtmp.log
  set logging overwrite on
  set logging redirect on
  set logging on
  printf "append binary memory %s 0x%x 0x%x", $arg0, $arg1, $arg2
  set logging off
  set logging redirect off
  set logging overwrite off
  source gdbtmp.log
end
您可以改用reallyappend函数,例如

(gdb) set $filename = "somethingruntimegenerated"
(gdb) reallyappend $filename startAddr endAddr

我不知道日志记录在“命令”环境中是否正常工作,但您至少可以试一试。

我不知道如何使append接受运行时文件名,但您总是可以通过将整个内容写入一个文件,然后使用日志记录来获取该文件,从而进行一些欺骗

通过将其放入~/.gdbinit

define reallyappend
  printf "using gdbtmp.log to dump memory to file %s\n", $arg0
  set logging file gdbtmp.log
  set logging overwrite on
  set logging redirect on
  set logging on
  printf "append binary memory %s 0x%x 0x%x", $arg0, $arg1, $arg2
  set logging off
  set logging redirect off
  set logging overwrite off
  source gdbtmp.log
end
您可以改用reallyappend函数,例如

(gdb) set $filename = "somethingruntimegenerated"
(gdb) reallyappend $filename startAddr endAddr

我不知道日志记录在“命令”环境中是否正常工作,但您至少可以试一试。

是的,您不能在这里使用变量作为filename参数。 我能提供的最好的建议是写一个脚本 设置所有断点并设置“append”命令,以及 使用文本编辑或awk和sed在中设置文件名
脚本。

是的,这里不能使用变量作为filename参数。 我能提供的最好的建议是写一个脚本 设置所有断点并设置“append”命令,以及 使用文本编辑或awk和sed在中设置文件名 剧本