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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]) ?**

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

答案

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

仔细阅读错误信息,它说Function "main" not defined. _start的断点已经设定;如果那是你在该命令后看到提示的问题,并且不会看到数字地址。 (尝试使用b xyzb printf。)


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

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

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

  • run:刚启动该程序,没有添加新的断点。
  • start:在main之前在run设置一次性断点。对编译的C / C ++或手写的asm有用,它定义了main并使用标准的CRT启动文件。这是你试图使用的。
  • starti:停止在该过程的第一个asm指令。对于没有符号的PIE可执行文件特别有用,如果在ASLR启用后运行它,则直到ASLR选择它之后才知道入口点数字地址。 (GDB默认行为是禁用ASLR)。

starti是一个相对较新的功能;在此之前,一个常见的黑客是使用b *0,这会在任何指令执行之前在进程启动后立即导致错误。 Stopping at the first machine code instruction in GDB

以上是关于GDB - 未来共享库加载时的断点的主要内容,如果未能解决你的问题,请参考以下文章

GDB 跳过共享库断点

需要在 GDB 中加载共享库的调试符号

gdb无法断点一例问题的解决

如何在共享库中的确切行号上设置断点?

如何使用 GDB 调试共享对象库中的函数?

关闭在 GDB 中设置断点的确认 [重复]