GDB将断点放在第一条指令上
当我打字时:GDB将断点放在第一条指令上,gdb,Gdb,当我打字时: gdb mybinary mybinary是一个可执行的饼图(位置标识代码) 我得到一个gdb提示。二进制文件未完全加载到内存中。我为什么这么说?这是因为我们在这一步不知道主要入口点的地址 有时可以键入反汇编main,但在我的情况下,二进制文件不包含调试信息 如果类型为“run”,则加载程序将程序加载到内存中,然后程序运行 我应该怎么做才能强制gdb只运行加载程序并中断main中的第一条指令。可能吗 谢谢 可能吗 当然。以下是一种方法: $ echo "int main() {
gdb mybinary
mybinary是一个可执行的饼图(位置标识代码)
我得到一个gdb提示。二进制文件未完全加载到内存中。我为什么这么说?这是因为我们在这一步不知道主要入口点的地址
有时可以键入反汇编main,但在我的情况下,二进制文件不包含调试信息
如果类型为“run”,则加载程序将程序加载到内存中,然后程序运行
我应该怎么做才能强制gdb只运行加载程序并中断main中的第一条指令。可能吗
谢谢
可能吗
当然。以下是一种方法:
$ echo "int main() { return 0; }" | gcc -xc -
$ gdb -q ./a.out
Reading symbols from ./a.out...(no debugging symbols found)...done.
(gdb) x/i &main
0x5fa <main>: push %rbp
您现在可以看到二进制文件已重新定位,并且可以在main
上设置断点
(gdb) b main
Breakpoint 1 at 0x5555555545fe
(gdb) c
Continuing.
Stopped due to shared library event:
Inferior loaded /lib/x86_64-linux-gnu/libc.so.6
(gdb) c
Continuing.
Breakpoint 1, 0x00005555555545fe in main ()
瞧
可能吗
当然。以下是一种方法:
$ echo "int main() { return 0; }" | gcc -xc -
$ gdb -q ./a.out
Reading symbols from ./a.out...(no debugging symbols found)...done.
(gdb) x/i &main
0x5fa <main>: push %rbp
您现在可以看到二进制文件已重新定位,并且可以在main
上设置断点
(gdb) b main
Breakpoint 1 at 0x5555555545fe
(gdb) c
Continuing.
Stopped due to shared library event:
Inferior loaded /lib/x86_64-linux-gnu/libc.so.6
(gdb) c
Continuing.
Breakpoint 1, 0x00005555555545fe in main ()
瞧。在现代GDB中,
start
在main和runs中设置一个临时断点。该命令是在过去几年中添加的,可能是因为PIE可执行文件变得越来越普遍
start
对饼图可执行文件有效,避免了在run
之后才知道main
的实际地址的问题,只要main
在其符号表中,GDB就可以按名称找到它
如果没有,您只能使用
starti
在运行任何用户空间指令之前停止,如您的问题标题所示。(或者@Employed Russian建议在solib events 1上设置stop可以帮助您在某个有趣的地方停下来,即使是在一个精简的二进制文件中。)在现代GDB中,start
在main和runs中设置一个临时断点。该命令是在过去几年中添加的,可能是因为PIE可执行文件变得越来越普遍
start
对饼图可执行文件有效,避免了在run
之后才知道main
的实际地址的问题,只要main
在其符号表中,GDB就可以按名称找到它
如果没有,您只能使用
starti
在运行任何用户空间指令之前停止,如您的问题标题所示。(或者@Employed Russian建议在solib events 1上设置stop可以帮助您在某个有趣的地方停下来,即使是在一个精简的二进制文件中。)执行动态重定位的@Bob5421代码的可能副本在动态加载程序中:ld linux.so.2
执行动态重定位的@Bob5421代码在动态加载程序中:ld linux.so.2
。