我想通过打印出已执行的每一行来跟踪函数的执行情况 - 在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", 113
,printf " myFile:testF %d\n", 114
等等?
答案 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"
......依此类推 - 我猜 - 这就是我所需要的......