GDB backtrace命令你知道吗
(gdb) backtrace [-full] [n] 其中,用 [ ] 括起来的参数为可选项,它们的含义分别为:
注意,当调试多线程程序时,该命令仅用于打印当前线程中所有栈帧的信息。如果想要打印所有线程的栈帧信息,应执行 thread apply all backtrace 命令。基于以上对 frame 和 backtrace 命令的介绍,这里以调试如下 C 语言程序为例,给大家演示这 2 个命令的作用。
~/demo/main.c 文件中,并已编译为可供 GDB 调试的 main.exe 可执行文件。在此基础上,进行如下调试:
(gdb) b 3 Breakpoint 1 at 0x4004cf: file main.c, line 3. (gdb) r Starting program: ~/demo/main.exe Breakpoint 1, func (num=5) at main.c:3 3 if(num==1){ (gdb) c Continuing. Breakpoint 1, func (num=4) at main.c:3 3 if(num==1){ (gdb) p num $1 = 4 (gdb) backtrace <-- 打印所有的栈帧信息 #0 func (num=4) at main.c:3 #1 0x00000000004004e9 in func (num=5) at main.c:6 #2 0x0000000000400508 in main () at main.c:12 (gdb) info frame <-- 打印当前栈帧的详细信息 Stack level 0, frame at 0x7fffffffe240: <-- 栈帧编号 0,地址 0x7fffffffe240 rip = 0x4004cf in func (main.c:3); saved rip 0x4004e9 <-- 函数的存储地址 0x4004cf,调用它的函数地址为 0x4004e9 called by frame at 0x7fffffffe260 <-- 当前栈帧的上一级栈帧(编号 1 的栈帧)的地址为 0x7fffffffe260 source language c. Arglist at 0x7fffffffe230, args: num=4 <-- 函数参数的地址和值 Locals at 0x7fffffffe230, Previous frame's sp is 0x7fffffffe240 <--函数内部局部变量的存储地址 Saved registers: <-- 栈帧内部存储的寄存器 rbp at 0x7fffffffe230, rip at 0x7fffffffe238 (gdb) info args <-- 打印当前函数参数的值 num = 4 (gdb) info locals <-- 打印当前函数内部局部变量的信息(这里没有) No locals. (gdb) up <-- 查看编号为 1 的栈帧 #1 0x00000000004004e9 in func (num=5) at main.c:6 6 return num*func(num-1); (gdb) frame 1 <-- 当编号为 1 的栈帧作为当前栈帧 #1 0x00000000004004e9 in func (num=5) at main.c:6 6 return num*func(num-1); (gdb) info frame <-- 打印 1 号栈帧的详细信息 Stack level 1, frame at 0x7fffffffe260: rip = 0x4004e9 in func (main.c:6); saved rip 0x400508 called by frame at 0x7fffffffe280, caller of frame at 0x7fffffffe240 <--上一级栈帧地址为 0x7fffffffe280,下一级栈帧地址为 0x7fffffffe240 source language c. Arglist at 0x7fffffffe250, args: num=5 Locals at 0x7fffffffe250, Previous frame's sp is 0x7fffffffe260 Saved registers: rbp at 0x7fffffffe250, rip at 0x7fffffffe258 (gdb)
(编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |