我正在尝试在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为什么问这个?
答案 0 :(得分:4)
GDB start
命令在main
的开头设置一个断点,然后运行程序。大概您的程序没有main
符号。
仔细阅读错误消息,指出Function "main" not defined.
处的断点已设置;如果那是问题,您会在 that 命令之后看到提示,并且不会看到数字地址。 (尝试使用_start
或b xyz
。)
您正在寻找b printf
命令,该命令只是运行该程序而不在其中寻找任何符号。
在GDB中使用run
和help start
来查看它们的作用。
或在线文档:https://sourceware.org/gdb/onlinedocs/gdb/Starting.html
help run
:仅启动程序,没有添加新的断点。run
:在start
之前的main
中设置一个一次性断点。对于已编译的C / C ++或定义run
并使用标准CRT启动文件的手写asm很有用。这就是您尝试使用的方式。main
:在该过程的第一个asm指令处停止。对于不带符号的PIE可执行文件特别有用,如果启用了ASLR,则在ASLR选择它之前,入口点数字地址才是已知的。 (GDB的默认行为是禁用ASLR)。 starti
是一个相对较新的功能;在此之前,一种常见的技巧是使用starti
,这会在流程开始后,任何指令执行之前立即导致错误。 Stopping at the first machine code instruction in GDB