【问题标题】:Dumping memory in gdb - how to choose the file name at run time在 gdb 中转储内存 - 如何在运行时选择文件名
【发布时间】:2009-08-10 12:51:35
【问题描述】:

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

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

获取文件名到环境变量:

  • 打破 HereIsTheFileName
  • 命令 1
  • 设置 $filename = malloc(strlen(filename) + 1)
  • 调用 memcpy($filename, filename, strlen(filename) + 1)
  • 结束

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

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

(我什至会按原样选择文件名,不进行格式化,如果这被证明是困难的部分)

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

谢谢!

【问题讨论】:

    标签: gdb


    【解决方案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
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 2012-06-11
        • 2013-11-16
        • 1970-01-01
        • 2022-10-17
        相关资源
        最近更新 更多