如何在GDB的帮助下获取整个程序列表?

时间:2012-04-17 09:28:13

标签: gdb trace

我想获得我的程序的完整跟踪列表“./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

并且不会进一步执行。

为什么会出现此错误? 我该怎么做才能获得我的程序的整个跟踪列表?可能是我应该使用其他工具?我什么都不知道。

1 个答案:

答案 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();
}