Debugging GDB没有在第一条机器代码指令处停止,该指令带有break\u start或info files入口点地址

Debugging GDB没有在第一条机器代码指令处停止,该指令带有break\u start或info files入口点地址,debugging,gdb,reverse-engineering,Debugging,Gdb,Reverse Engineering,我想调试一个没有符号文件的应用程序。我知道,如果我缺少必要的调试信息,就有必要在程序集级别进行调试。因为我没有调试符号,所以我不能直接在方法名上设置断点,但是我仍然应该能够在地址上设置断点 所以我只是尝试在入口地址上设置一个断点,这就是我所做的: user@MacBookAir$ gdb (gdb) file someexecutable (gdb) info file 最后一个命令返回以下入口点: 拿到地址后,我简单地说: (gdb) break *0x0000000100119ec8 (

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

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

user@MacBookAir$ gdb
(gdb) file someexecutable
(gdb) info file
最后一个命令返回以下入口点:

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

(gdb) break *0x0000000100119ec8
(gdb) run
不幸的是,目标应用程序启动时没有在入口点中断,因此我再次尝试,但这次我在入口点地址之后的几个地址上设置了断点,但没有成功

下一次尝试是尝试他在这个问题()中发布的解决方案来设置断点:

(gdb) b _start
(gdb) b start
但这两个命令都会导致相同的错误:

未加载任何符号表。使用“文件”命令

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

user@MacBookAir$ otool -l someexecutable
并收到以下输出:

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

这在我看来像是GDB中的一个bug。我猜ASLR会将二进制文件重新定位到另一个地址,但GDB不会移动断点。我建议采取以下措施之一:

  • 禁用ASLR:
    将禁用ASLR设置为on
  • 设置环境变量
    DYLD\u NO\u PIE=1
  • 从可执行文件的头中删除
    MH_PIE
    标志
  • 将入口点修补为0xCC。一旦它中断,您可以将其修补回原始字节

  • 很高兴看到你来帮我提问题!正如您所建议的,我试图禁用ASLR或设置env-var,但不幸的是,这些都不起作用(它仍然“跳过”断点)。对于后两种选择,我必须做一些研究,因为我对达尔文双星不太熟悉,明天我会尝试一下,如果我有任何进展,我会向你汇报。:)不幸的是,这些解决方案对我都不起作用。不过,我现在要结束这个项目,因为我取消了这个项目的工作。无论如何,谢谢。我没有在GDB7.7.1、GCC4.8和HelloWorld中复制:address和symbol方法都有效。可执行文件是如何生成的?什么是GDB版本?