我想调试一个我没有符号文件的应用程序。我知道如果我缺少必要的调试信息,就必须在汇编级别进行调试。由于我没有调试符号,因此无法直接在方法名称上设置断点,但我仍然可以在地址上设置断点。
所以我只是试着在入口地址上设置一个断点,这就是我所做的:
user@MacBookAir$ gdb
(gdb) file someexecutable
(gdb) info file
最后一个命令返回以下入口点:
收到地址后,我只是说:
(gdb) break *0x0000000100119ec8
(gdb) run
不幸的是,目标应用程序在入口点没有突破时启动,所以我再次尝试了,但这次我在入口点地址后面的几个地址上设置了断点 - 没有成功。
下一次尝试是尝试Igor Skochinsky的解决方案,他在此问题(Stopping at the first machine code instruction in GDB)中发布以设置断点:
(gdb) b _start
(gdb) b start
但是这两个命令都导致了同样的错误:
未加载符号表。使用“file”命令。
好吧,显然我需要调试符号才能正常工作。然后我想也许它只显示了一个不正确的入口点地址,所以我用命令验证它:
user@MacBookAir$ otool -l someexecutable
并收到以下输出:
所以它似乎与GDB返回的入口点相同。现在我不知道还能尝试什么。 :) 也许你们知道我还能尝试什么。任何帮助将非常感谢。如果某些事情不清楚,或者我错过了一些重要信息,请留下简短的评论。
答案 0 :(得分:1)
这看起来像GDB中的一个错误。我猜测ASLR将二进制文件重定位到另一个地址,但GDB不会移动断点。我建议以下之一:
set disable-aslr on
DYLD_NO_PIE=1
MH_PIE
标志