扩展GDB变量以在循环中使用(使用dprintf)?

时间:2016-05-09 11:19:15

标签: gdb

我想通过打印出已执行的每一行来跟踪函数的执行情况 - 在gdb中,我可以使用dprintf来执行此操作。由于它是一个很大的功能(从myFile.cpp的第113行到第200行),我想出了以下循环来在函数的每一行设置dprintf类型断点:

set $n=113
while ($n<200)
dprintf myFile.cpp:$n, " myFile:testF %d\n", $n
set $n=$n+1
end

当涉及设置 dprintf样式断点时,这实际上有效:

(gdb) info br
Num     Type           Disp Enb Address    What
1       dprintf        keep y   0x080a7272 in namespace::myFile::testFunc(int&) 
                                           at /path/to/myFile.cpp:113
        printf " myFile:testF %d\n", $n
2       dprintf        keep y   0x080a727d in namespace::myFile::testFunc(int&) 
                                           at /path/to/myFile.cpp:114
        printf " myFile:testF %d\n", $n
...

...但是,如果对于相应的dprintf格式字符串不起作用,因为gdb变量$n未扩展为数字字符串,这就是我想要的

那么有没有办法扩展$n变量,这样dprintf最终会像:printf " myFile:testF %d\n", 113printf " myFile:testF %d\n", 114等等?

1 个答案:

答案 0 :(得分:3)

好吧,结果发现eval函数(https://unix.stackexchange.com/questions/151502/how-to-save-the-result-of-printf-to-a-variable-in-gdb)有助于解决这个问题 - 循环应该像这样重写:

set $n=113
while ($n<200)
eval "dprintf myFile.cpp:%d, \" myFile:testF %d\"", $n, $n
set $n=$n+1
end

gdb中运行此操作会产生dprintf个断点,例如:

1       dprintf        keep y   0x080a7272 in namespace::myFile::testFunc(int&) 
                                           at /path/to/myFile.cpp:113
        printf " myFile:testF 113"

......依此类推 - 我猜 - 这就是我所需要的......