在 Linux 上编码 C++ 时,我使用 Eclipse CDT。进入 C/C++ OS 函数时,我可以看到汇编程序,但考虑到文件都存储在 /usr/include/ 中,我认为调试器会进入 C/C++ 的每一行。
那么,有什么方法可以在 Linux 上调试 C++ 并允许您进入操作系统功能的 C/C++ 吗?
在 Linux 上编码 C++ 时,我使用 Eclipse CDT。进入 C/C++ OS 函数时,我可以看到汇编程序,但考虑到文件都存储在 /usr/include/ 中,我认为调试器会进入 C/C++ 的每一行。
那么,有什么方法可以在 Linux 上调试 C++ 并允许您进入操作系统功能的 C/C++ 吗?
是的,您可以在 Linux 下使用 gdb(GNU 调试器)来完成。该界面非常粗鲁,但它确实可以完成工作。一个小例子:首先,启动 gdb。
gdb your_program
那么,你就在其中。
....
Reading symbols from foobar...done.
(gdb) start # begin the debug session
...
(gdb) disas # show the disassembly code of the current function (main)
.... # lot of asm
0x00000000004007d4 <+17>: call 0x400440 <malloc@plt>
0x00000000004007d9 <+22>: mov QWORD PTR [rax],0x0
0x00000000004007e0 <+29>: push rax
... # lot of asm
(gdb) break *0x4007d4 # set a break point at the address of the call malloc
Breakpoint 2 at 0x4007d4
(gdb) run # run until breakpoint
...
Breakpoint 2, 0x00000000004007d4 in main () # the breakpoint has been reached
=> 0x00000000004007d4 <main+17>: e8 67 fc ff ff call 0x400440 <malloc@plt>
(gdb) si # step into the malloc
0x0000000000400440 in malloc@plt ()
=> 0x0000000000400440 <malloc@plt+0>: ff 25 92 11 20 00 jmp QWORD PTR [rip+0x201192] # 0x6015d8 <malloc@got.plt> # you see code from malloc now
(gdb) ni # next instruction in malloc
...
(gdb) finish # quit the current function, actually malloc
(gdb)
但是,您将无法轻松显示相应的高级源代码。您能做的最好的事情就是同时阅读库/内核代码。
例如,您可以在此处从 glibc(GNU 标准 C 库)中读取 malloc 的代码malloc/malloc.c
。