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

时间:2009-08-10 12:51:36

标签: gdb

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

假设我有一个名为HereIsTheFileName(char * filename)的函数,另一个函数叫做DumpThisMemoryRegion(void * startAddr,void * endAddr),我想做类似以下的事情:

获取环境变量的文件名:

  • break HereIsTheFileName
  • 命令1
  • 设置$ filename = malloc(strlen(filename)+ 1)
  • 调用memcpy($ filename,filename,strlen(filename)+ 1)

然后将内存转储到我之前保存的文件名:

  • break DumpThisMemoryRegion
  • 命令2
  • 追加二进制内存“%s.memory”%$ filename startAddr endAddr

(我甚至会满足于文件名,没有格式化,如果事实证明这是困难的部分)

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

谢谢!

2 个答案:

答案 0 :(得分:1)

我不知道如何使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

你可以使用函数realappend,例如

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

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

答案 1 :(得分:0)

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