首页 > 其他分享 >【gdb】向上或向下切换函数堆栈帧

【gdb】向上或向下切换函数堆栈帧

时间:2023-10-15 10:55:49浏览次数:34  
标签:func3 10 int test gdb 切换 堆栈

向上或向下切换函数堆栈帧

1. 例子:

#include <stdio.h>

int func1(int a)
{
        return 2 * a;
}

int func2(int a)
{
        int c = 0;
        c = 2 * func1(a);
        return c;
}

int func3(int a)
{
        int c = 0;
        c = 2 * func2(a);
        return c;
}

int main(void)
{
        printf("%d\n", func3(10));
        return 0;
 }

输出:

用gdb调试程序时,当程序暂停后,可以用“up n”或“down n”命令向上或向下选择函数堆栈帧,其中n是层数。以上面程序为例:

(gdb) b test.c:5
Breakpoint 1 at 0x40053d: file test.c, line 5.
(gdb) r
Starting program: /home/nanxiao/test

Breakpoint 1, func1 (a=10) at test.c:5
5               return 2 * a;
(gdb) bt
#0  func1 (a=10) at test.c:5
#1  0x0000000000400560 in func2 (a=10) at test.c:11
#2  0x0000000000400586 in func3 (a=10) at test.c:18
#3  0x000000000040059e in main () at test.c:24
(gdb) frame 2
#2  0x0000000000400586 in func3 (a=10) at test.c:18
18              c = 2 * func2(a);
(gdb) up 1
#3  0x000000000040059e in main () at test.c:24
24              printf("%d\n", func3(10));
(gdb) down 2
#1  0x0000000000400560 in func2 (a=10) at test.c:11
11              c = 2 * func1(a);

可以看到程序断住后,先执行“frame 2”命令,切换到fun3函数。接着执行“up 1”命令,此时会切换到main函数,也就是会往外层的堆栈帧移动一层。反之,当执行“down 2”命令后,又会向内层堆栈帧移动二层。如果不指定n,则n默认为1. 还有“up-silently n”和“down-silently n”这两个命令,与“up n”和“down n”命令区别在于,切换堆栈帧后,不会打印信息,仍以上面程序为例:

(gdb) up
#2  0x0000000000400586 in func3 (a=10) at test.c:18
18              c = 2 * func2(a);
(gdb) bt
#0  func1 (a=10) at test.c:5
#1  0x0000000000400560 in func2 (a=10) at test.c:11
#2  0x0000000000400586 in func3 (a=10) at test.c:18
#3  0x000000000040059e in main () at test.c:24
(gdb) up-silently
(gdb) i frame
Stack level 3, frame at 0x7fffffffe5a0:
 rip = 0x40059e in main (test.c:24); saved rip = 0x7ffff7a35ec5
 caller of frame at 0x7fffffffe590
 source language c.
 Arglist at 0x7fffffffe590, args:
 Locals at 0x7fffffffe590, Previous frame's sp is 0x7fffffffe5a0
 Saved registers:
  rbp at 0x7fffffffe590, rip at 0x7fffffffe598

可以看到从func3切换到main函数堆栈帧时,并没有打印出相关信息。

 

参考资料

1. 向上或向下切换函数堆栈帧

标签:func3,10,int,test,gdb,切换,堆栈
From: https://www.cnblogs.com/sunbines/p/17765366.html

相关文章

  • 【Linux 基础】gcc、g++多版本间的切换
    在make时可能出现版本过高的问题,因此需要进行版本切换。gcc多版本间的切换(g++配置方法一样,gcc换为g++即可)系统:ubuntu18方法:根据需要同步设置gcc与g++间的版本号1.gcc安装(多版本) sudoapt-getupdate sudoapt-getinstallgcc##安装最新版本,此处为7 sudoapt-getinstall......
  • ubuntu18.04环境下编译支持debuginfod的gdb
    ubuntu18.04环境下编译支持debuginfod的gdb介绍Ubuntu22.10版本才默认安装debuginfod,对于之前的发行版都需要手动配置。gdb从10.1版本才开始支持debuginfod,而Ubuntu旧的发行版里gdb都低于10.1版本。另外,debuginfod被包含在elfutils里面,且从elfutils-0.178版本后才支持,而Ubuntu......
  • 关于堆栈的讲解(我见过的最经典的) 转载
    关于堆栈的讲解(我见过的最经典的)转载 转:https://blog.csdn.net/yingms/article/details/53188974这是一篇转发的文章,我对他进行了格式化而已,原文出处不详。一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自......
  • 第三方IDE使用gdb调试Qt实现pretty print
      直接使用gdb调试Qt应用时,Qt的一些数据类型没法友好的显示出来,而qtcreator可以很好的展示出来,qtcreator也是通过gdb来调试的,在展示数据时,其实是gdb通过python脚本来处理后显示的,这些python脚本位于/usr/share/qtcreator/debugger这个位置(ubuntu20.04)。gdb在启动时,会自动在某......
  • 【网站公告】切换微信扫码登录所使用的服务号
    大家好,我们计划于10月14日(周六)上午切换微信扫码登录所使用的服务号,由“i博客园”切换到“博客园Cnblogs”,切换后首次微信扫码登录需要先关注新服务号,由此给您带来麻烦,请您谅解。也可以现在提前关注新服务号“博客园Cnblogs”,以下是新服务号的二维码:另外,欢迎您关注园子的微信公......
  • 本地有多个node切换不同版本node方法
    1.在当前使用的node版本,进行你要切换node版本的设置和配置npmconfigsetprefix"F:\node14\node_global"npmconfigsetcache"F:\node14\node_cache"假如你当前使用的是node14,这里就写node18,当前使用的是node18,这里就写node14。当然具体的路径名称根据你本地安装路径来配......
  • JavaScript的工作原理:引擎、运行时和调用堆栈
    概述几乎每个人都已经听说过V8引擎这个概念,大多数人都知道JavaScript是单线程的,或者它使用的是回调队列。在本文中,我们将详细介绍这些概念,并解释JavaScript实际运行的方式。通过了解这些详细信息,你将能够正确地利用其所提供的API编写更好的、非阻塞的应用,这些应用正确地利用了......
  • JS 堆栈跟踪
    堆栈跟踪APIV8中抛出的所有内部错误在创建时都会捕获堆栈跟踪。可以通过非标准error.stack属性从JavaScript访问此堆栈跟踪。V8还具有各种钩子,用于控制堆栈跟踪的收集和格式化方式,以及允许自定义错误也收集堆栈跟踪。本文档概述了V8的JavaScript堆栈跟踪API。functio......
  • 关于CAN工作模式的切换以及CAN2的使用
    1、关于CAN工作模式的切换CH32的CAN有3种工作模式:初始化模式、睡眠模式和正常模式3种模式。只能在初始化模式下修改CAN_BTIMR的SILM和LBKM位配置来选择一种测试模式,测试模式有3种:静默模式,环回模式,静默环回模式。若要切换工作模式,需要对寄存器CAN_CTLR中的SLEEP或INRQ位......
  • pytest接口测试中使用 base-url进行环境切换
    pytest-base-url是pytest的第三方插件,主要用来帮助我们进行切换测试环境地址,其中配置方法存在两种,一种直接在命令行中进行添加url参数  命令行参数传入 命令行参数传入,这里需要在我们需要传入的测试用例中,提前加入base-url的参数名称,方便后续命令行时好直接传入参数,也就......