我想获得我的程序的完整跟踪列表“./myprog” - 我有GDB 7.0-ubuntu(我的架构的新版本不存在)。 我的GDB脚本(“./ trace_list.gdb”):
gdb -q -x ./trace_list.gdb
file ./myprog
set print address off
display/x $r0
display/x $r1
display/x $r2
display/x $r3
display/x $r4
display/x $r5
display/x $r6
display/x $r7
display/x $r8
display/x $r9
display/x $r10
display/x $r11
display/x $r12
display/x $sp
display/x $lr
display/x $fps
b *0x323d0
set logging on
run
while 1
x/i $pc
ni
end
quit
它在某些时刻有效。 然后写道:
"./trace_list.gdb":26: Error in sourced command file:
Cannot access memory at address 0x6b980000
并且不会进一步执行。
为什么会出现此错误? 我该怎么做才能获得我的程序的整个跟踪列表?可能是我应该使用其他工具?我什么都不知道。
答案 0 :(得分:1)
无法访问地址0x6b980000处的内存 为什么会出现这种错误?
该错误意味着GDB试图访问0x6b980000
的内存,但不能(它告诉你那么多; - )
很可能你的目标处理器(它是哪个处理器?)缺少硬件单步(或者GDB不知道如何使用它),所以为了执行ni
,GDB设置一个临时断点它认为是下一个指令。如果GDB出错,或者指令在GDB无法写入的内存中(例如内核的一部分),则会丢失。
如何获取程序的整个跟踪列表?
整个跟踪在实践中很少有用 - 只有太多的指令,单步的开销太大了。也许您应该放弃这种方法,而是使用divide-and-conquer debugging代替?
更新
“整个痕迹在实践中很少有用” - 即使程序被混淆了吗?
是的,特别是如果程序被混淆了。
该计划也可能采用反调试技术。在调试器下制作一个行为不同的程序非常简单,你可能花费数小时查看与实际程序操作无关的整个跟踪:
if (running_under_debugger()) {
compute_one_million_digits_of_pi();
} else {
do_something_useful();
}