我正在运行一个对文件进行处理的程序。 我希望能够为程序提供多个文件,并通过附加gdb,我希望在代码中的某个点为每个文件获取内存转储。我希望每个文件的转储转到与输入文件具有相同文件名的文件(可能稍微格式化后,添加后缀)
假设我有一个名为HereIsTheFileName(char * filename)的函数,另一个函数叫做DumpThisMemoryRegion(void * startAddr,void * endAddr),我想做类似以下的事情:
获取环境变量的文件名:
然后将内存转储到我之前保存的文件名:
(我甚至会满足于文件名,没有格式化,如果事实证明这是困难的部分)
但是,除了append / dump命令的外显文件名之外,我无法接受gdb接受任何内容。当我运行“追加二进制内存$ filename ...”时,我得到了文件“/ workdir / $ filename”中的输出。 有没有办法让gdb在运行时选择文件名?
谢谢!
答案 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来设置文件名 脚本。