加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

GDB backtrace命令你知道吗

发布时间:2021-05-11 13:18:24 所属栏目:语言 来源:互联网
导读:backtrace 命令用于打印当前调试环境中所有栈帧的信息,常用的语法格式如下: (gdb) backtrace [-full] [n] 其中,用 [ ] 括起来的参数为可选项,它们的含义分别为: n:一个整数值,当为正整数时,表示打印最里层的 n 个栈帧的信息;n 为负整数时,那么表示

backtrace 命令用于打印当前调试环境中所有栈帧的信息,常用的语法格式如下:

(gdb) backtrace [-full] [n]

其中,用 [ ] 括起来的参数为可选项,它们的含义分别为:
  • n:一个整数值,当为正整数时,表示打印最里层的 n 个栈帧的信息;n 为负整数时,那么表示打印最外层 n 个栈帧的信息;
  • -full:打印栈帧信息的同时,打印出局部变量的值。

除此之外,backtrace 命令还有其它可选参数,感兴趣的读者可自行前往 GDB 官网查看。

注意,当调试多线程程序时,该命令仅用于打印当前线程中所有栈帧的信息。如果想要打印所有线程的栈帧信息,应执行thread apply all backtrace命令。

基于以上对 frame 和 backtrace 命令的介绍,这里以调试如下 C 语言程序为例,给大家演示这 2 个命令的作用。

		
  1. #include <stdio.h>
  2. int func(int num){
  3. if(num==1){
  4. return 1;
  5. }else{
  6. return num*func(num-1);
  7. }
  8. }
  9. int main ()
  10. {
  11. int n = 5;
  12. int result = func(n);
  13. printf("%d! = %d",n,result);
  14. return 0;
  15. }
不难发现,func() 是一个递归函数。该程序存储在~/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)

篇幅有限,这里不再做更多的命令演示,读者可自行验证其它命令格式的用法。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读