GDB - 未来共享库加载时的断点挂起

Koi*_*nos 0 assembly gdb

我正在尝试在 GDB 中运行一个非常简单的链接文件。

我做了以下操作:

(gdb) break _start
Breakpoint 1 at 0x4000b0
(gdb) start
Function "main" not defined.
**Make breakpoint pending on future shared library load? (y or [n]) ?**
Run Code Online (Sandbox Code Playgroud)

但是,标签_start不在任何共享库中,而只是在生成可执行文件的汇编代码中。为什么GDB会问这个?

Pet*_*des 5

GDBstart命令在 的开头设置断点main,然后运行程序。大概你的程序没有main符号。

仔细阅读错误信息,它说Function "main" not defined. The Breakpoint at _startis already set;如果这是问题所在,您会在该命令之后看到提示,并且不会看到数字地址。(尝试使用b xyzb printf。)


您正在寻找run命令,该命令运行程序而不查找其中的任何符号。

在 GDB 中使用help starthelp run来看看它们的作用。

或在线文档:https://sourceware.org/gdb/onlinedocs/gdb/Starting.html

  • run:只是启动程序,没有添加新的断点。
  • startmain:在before中设置一次性断点run。对于编译的 C/C++ 或定义main并使用标准 CRT 启动文件的手写 asm 很有用。这就是您尝试使用的。
  • starti: 在进程的第一条 asm 指令处停止。对于没有符号的 PIE 可执行文件特别有用,如果在启用 ASLR 的情况下运行它,则在 ASLR 选择入口点数字地址之前才知道它。(GDB 默认行为是禁用 ASLR)。

starti是一个相对较新的功能;在此之前,一种常见的黑客方法是使用b *0,这会在进程启动后、任何指令执行之前立即导致错误。 在 GDB 中的第一条机器代码指令处停止