0

我想获得我的程序“./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

并且不会进一步执行。

为什么会出现这个错误?我应该怎么做才能获得我的程序的整个跟踪列表?可能我应该使用其他工具吗?我没有任何想法。

4

1 回答 1

1

无法访问地址 0x6b980000 处的内存 为什么会出现此错误?

该错误意味着 GDB 试图访问内存0x6b980000,但不能(它告诉了你很多 ;-)

很可能你的目标处理器(它是哪个处理器?)缺少硬件单步(或者 GDB 不知道如何使用它),所以为了执行ni,GDB 在它认为是下一条指令的地方设置了一个临时断点。如果 GDB 犯了错误,或者如果指令在 GDB 无法写入的内存中(例如内核的一部分),那么您就输了。

我应该怎么做才能获得我的程序的整个跟踪列表?

整个跟踪在实践中很少有用——指令太多,单步执行的开销太大。也许您应该放弃这种方法,而改用分而治之的调试方式?

更新:

“整个跟踪在实践中很少有用”——即使程序被混淆了?

是的,尤其是在程序被混淆的情况下。

该程序也可以使用反调试技术。制作一个在调试器下表现不同的程序非常简单,您可能会花费数小时查看与实际程序操作无关的整个跟踪:

if (running_under_debugger()) {
  compute_one_million_digits_of_pi();
} else {
  do_something_useful();
}
于 2012-04-18T03:41:29.460 回答