ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

调试:显示栈帧(待添加例子)

2021-07-22 14:02:57  阅读:266  来源: 互联网

标签:full backtrace frame 函数调用 bt 添加 sum 栈帧 调试


当我们阅读代码和查找BUG时,往往有一个烦恼。就是我们不知道函数的调用顺序。而这些函数调用顺序对应我们理解程序结构,程序运行过程是很有帮助的。

那么问题是:程序的调用过程往往是很复杂的,而且可能是多层嵌套,跨文件调用的。这时候如果靠人工去查找,这将是一件非常大工作量的事情。GDB中有办法帮助我们做到查看函数调用的过程吗?

首先我们需要知道,函数调用信息存放在哪?只有知道函数调用信息,我们才能进行信息提取这一步。
关于函数的信息都存放在栈中

在这里插入图片描述
函数调用栈的查看

  • backtrace:查看函数调用的顺序(函数调用栈的信息)
  • frame N:切换到栈编号为N的上下文中
  • info frame:查看当前函数调用的栈帧信息

info命令的其他使用方式:

在这里插入图片描述

backtrace

backtrace命令可以在遇到端点而暂停执行时显示栈帧。该命令简写为bt。此外,backtrace的别名还有whereinfo stack(简写为info s

格式:

  • 显示所有栈帧:
backtrace
bt
  • 只显示开头N个栈帧:
backtrace N
bt N
  • 只显示最后N个栈帧:
backtrace -N
bt -N
  • 不仅显示bt,还要显示局部变量,N和上面的相同
backtrace full
backtrace full N
backtrace full -N
bt full
bt full N
bt full -N

例子

在这里插入图片描述
从外到内显示3个栈帧,以及其局部变量
在这里插入图片描述
显示栈帧之后,就可以看出程序在何处停止(即断点的位置)以及程序的调用路径

例子

//frame.c
#include <stdio.h>


int sum(int n)
{
    int ret = 0;

    if( n > 0 )
    {
        ret = n + sum(n-1);
    }

    return ret;
}


int main()
{
    int s = 0;

    s = sum(10);

    printf("sum = %d\n", s);

    return 0;
}
  1. 设置断点:设置到递归结束标志的位置
2.(gdb) start
3.The program being debugged has been started already.
4.Start it from the beginning? (y or n) y
5.
6.Temporary breakpoint 4 at 0x80483f9: file frame.c, line 19.
7.Starting program: /home/delphi/workspace/test.out 
8.
9.Temporary breakpoint 4, main () at frame.c:19
10.19       int s = 0;
11.(gdb) break sum if n==0   < --------------设置sum函数中, n==0 时的数据断点。
12.Breakpoint 5 at 0x80483ca: file frame.c, line 6.
13.(gdb) info break    < --------------- 查看断点信息
14.Num     Type           Disp Enb Address    What
15.5       breakpoint     keep y   0x080483ca in sum at frame.c:6
16. stop only if n==0
  1. 查看函数调用过程

标签:full,backtrace,frame,函数调用,bt,添加,sum,栈帧,调试
来源: https://blog.csdn.net/zhizhengguan/article/details/118997132

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有