我有一个想调试的汇编程序。如果这个程序是用符号汇编的,我可以直接在那个位置设置一个断点_start
,然后告诉 GDB 运行它,它就会立即中断,因为_start
可执行文件的定义就是从那里开始的。
但是,假设这个程序的符号被剥离了。那么,由于该符号不再存在,就无法设置断点了_start
。虽然我可以仔细检查可执行文件的头文件来找到定义的程序起始位置,但我已经非常熟悉这个操作了,所以我希望 GDB 能提供“以单步模式运行”的选项。然而,我在网上找不到任何关于如何做到这一点的信息。
我有一个想调试的汇编程序。如果这个程序是用符号汇编的,我可以直接在那个位置设置一个断点_start
,然后告诉 GDB 运行它,它就会立即中断,因为_start
可执行文件的定义就是从那里开始的。
但是,假设这个程序的符号被剥离了。那么,由于该符号不再存在,就无法设置断点了_start
。虽然我可以仔细检查可执行文件的头文件来找到定义的程序起始位置,但我已经非常熟悉这个操作了,所以我希望 GDB 能提供“以单步模式运行”的选项。然而,我在网上找不到任何关于如何做到这一点的信息。
stepi
和nexti
(si
和ni
)用于按汇编指令(而不是源代码行)单步执行。用于
layout asm
在单步执行时显示反汇编(TUI 模式),和/或类似和的常用命令
disas
x /i
用于
starti
在执行第一条用户空间指令之前启动暂停的进程。这通常位于
_start
动态链接器的位置,而不是可执行文件自身的_start
(ELF 入口点),除非它是静态可执行文件。因此,您可能实际上想要做的是
info file
(在此之后starti
,进程存在,并且内核选择了一个基地址,因此 GDB 打印的地址可以是实际的绝对地址。GDB 默认禁用从其内部启动的进程的 ASLR,因此 Linux 始终选择0x555...
PIE 可执行文件。)然后使用数字地址在那里设置一个断点。
b *address
例如在 x86-64 Arch GNU/Linux 上(删除了一些冗余内容):
在 TUI 模式下,即使 GDB 终端处于某种模式,普通的左键单击和单击+拖动无法像平常一样进行选择,您也可以按住 Shift 键来使鼠标选择正常工作。(我使用的是 Konsole,KDE 的 xterm 等效程序。)
我猜测其中大部分也适用于 Windows 和 macOS。