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