1

我想调试一个我没有符号文件的应用程序。我知道如果我缺少必要的调试信息,就必须在汇编级别进行调试。由于我没有调试符号,我不能直接在方法名称上设置断点,但是我仍然应该能够在地址上设置断点。

所以我只是尝试在入口地址上设置一个断点,这就是我所做的:

user@MacBookAir$ gdb
(gdb) file someexecutable
(gdb) info file

最后一个命令返回以下入口点: 在此处输入图像描述

得到地址后,我简单地说:

(gdb) break *0x0000000100119ec8
(gdb) run

不幸的是,目标应用程序启动时没有在入口点中断,所以我再次尝试,但这次我确实在入口点地址之后的几个地址上设置了断点 - 没有成功。

下一次尝试是尝试Igor Skochinsky在这个问题中发布的解决方案(在 GDB 中的第一条机器代码指令处停止)来设置断点:

(gdb) b _start
(gdb) b start

但是这两个命令都导致了相同的错误:

没有加载符号表。使用“文件”命令。

嗯,是的,显然我需要调试符号才能正常工作。然后我想也许它只是显示了一个不正确的入口点地址,所以我用命令验证了它:

user@MacBookAir$ otool -l someexecutable

并收到以下输出: 在此处输入图像描述

所以它似乎与 GDB 返回的入口点相同。现在我不知道我还能尝试什么。:) 也许你们知道我还能尝试什么。任何帮助将不胜感激。如果有不清楚的地方或者我错过了一些重要信息,请留下简短的评论。

4

1 回答 1

2

对我来说,这看起来像是 GDB 中的一个错误。我猜 ASLR 会将二进制文件重新定位到另一个地址,但 GDB 不会移动断点。我建议以下之一:

  1. 禁用 ASLR:set disable-aslr on
  2. 设置环境变量DYLD_NO_PIE=1
  3. MH_PIE从可执行文件的标头中删除标志
  4. 将入口点修补到 0xCC。一旦中断,您可以将其修补回原始字节。
于 2013-04-16T17:27:09.130 回答