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 xyz
或b printf
。)
你正在寻找run
命令,它只运行程序而不查找其中的任何符号。
在GDB中使用help start
和help 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 - 未来共享库加载时的断点的主要内容,如果未能解决你的问题,请参考以下文章