【问题标题】:how to force gdb to stop right after the start of program execution?如何强制gdb在程序执行开始后立即停止?
【发布时间】:2017-12-01 10:11:24
【问题描述】:

我尝试在每个有意义的函数上设置断点,但程序在到达其中任何一个之前退出。有没有办法让程序从一开始就以逐步模式运行,这样我就可以看到发生了什么?

如果 /usr/bin/id 很重要,我正在尝试调试它(我们有自定义插件,但它行为不端)

附:开始命令在这里对我不起作用(应该是评论,但我没有足够的代表)

【问题讨论】:

标签: debugging gdb


【解决方案1】:

获取程序入口点地址并在该地址插入断点。

一种方法是创建信息文件,例如“入口点:0x4045a4”。然后执行“break *0x4045a4”。运行程序后立即停止。

从这里开始,您可以使用单步说明(如 step 或 stepi)继续。

您没有说明您要调试的系统。如果代码在只读内存中,您可能需要使用硬件断点 (hbreak),前提是该系统支持它们。

【讨论】:

  • set break 命令似乎至少在 GDB 7.7.1 中做了其他事情——它需要一个子命令而不是地址。也许,你的意思是break *0x4045a4
  • 当然。休息不设置休息。固定答案。
  • 在 Fedora 27 上,这适用于 Xorg which is exempted from building as PIE etc,但它不适用于大多数二进制文件,例如gnome-shell。 “无法插入断点 1。无法访问地址 0x2540 处的内存”。 break _start 虽然通常会起作用(对于 C 代码,我猜如果动态链接器不会首先崩溃)。
【解决方案2】:

使用start 命令

“start”命令相当于在主过程开始时设置一个临时断点,然后调用“run”命令。

例如

带有调试信息 ma​​in 的程序,用法如下:main arg1 arg2

gdb main
(gdb) start arg1 arg2

【讨论】:

  • 这只有在程序有 main 符号时才有效。如果您正在调试一个不起作用的程序集。
【解决方案3】:

您可以在running 程序之后输入record full。这将记录所有指令并使其可以重播/返回。

对于 main 函数,您需要在到达断点之前键入 this,以便您可以通过 break _start 设置更早的一个 -> _start 是一个始终在标准 main 函数之前调用的函数。 (显然只适用于 gcc 编译器或类似的)

然后continue 到主断点并执行reverse-stepi 正好返回一条指令

有关录制的更多信息请看这里:link

【讨论】:

    猜你喜欢
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    相关资源
    最近更新 更多