GDB工具使用教程_函数调用栈(call stack)探密

我们知道,通常一个程序的运行,不外乎是A函数调用B,B函数调用C等等,等所有的调用都完成后,整个程序的运行也就ok了。在这个过程中,每当有新的函数调用,系统都会把该函数的一些信息,包括函数的参数,以及一些寄存器的值等,保存到调用栈(call stack)上。等该函数运行完成后,这些信息再从调用栈上弹出(pop)。如下图所示,是一个完整的调用栈:

在上图中,整体叫做调用栈(call stack),每一行叫做一桢(frame)。我们来看看桢信息的组成有哪些:

  • (1)桢号:调用栈中对桢的一个编号,从0开始,依次增大
  • (2)PC:Program counter寄存器,指向当前桢中下一条要执行的指令的地址
  • (3)函数名:当前桢中被调用的函数的名字
  • (4)参数及传入的值:当前桢中被调用的函数在调用时传入的参数及其值
  • (5)源码位置:当前桢执行到的源码位置,格式为 file:linenum

    这里还有一点需要说明,不知道细心的读者朋友有没有发现,foo那一桢没有PC的地址,GDB通过这样来标示该桢是当前正在执行到的桢,因此我们通过看调用栈的信息,便可得知程序执行到哪里了。

    读者朋友有没有觉得原来函数调用的过程还有这么多信息可以知道啊,下面我就开始介绍一些GDB命令,通过这些命令你便可以查看到上面介绍的这些信息,甚至更加详细的信息。
    1. 查看调用栈信息:(具体信息的内容,与上面第二部分中介绍的相同)

  • (1)backtrace: 显示程序的调用栈信息,可以用bt缩写
  • (2)backtrace n: 显示程序的调用栈信息,只显示栈顶n桢(frame)
  • (3)backtrace -n: 显示程序的调用栈信息,只显示栈底部n桢(frame)
  • (4)set backtrace limit n: 设置bt显示的最大桢层数
  • (5)whereinfo stack:都是bt的别名,功能一样

    2. 查看桢信息:

  • (1)frame n: 查看第n桢的信息, frame可以用f缩写
  • (2)frame addr: 查看pc地址为addr的桢的相关信息
  • (3)up n: 查看当前桢上面第n桢的信息
  • (4)down n: 查看当前桢下面第n桢的信息

    3. 查看更加详细的信息:

  • (1)info frameinfo frame n或者info frame addr

    查看指定桢的详细信息,关于详细信息的内容,这里有必要做一个介绍,如下图所示:

    上图中显示的信息有:
    a. 当前桢的地址: 0xbffff400
    b. 当前桢PC: eip = 0×8048516
    c. 当前桢函数: bar (test.cpp:16)
    d. caller(调用者)桢的PC: saved eip 0×8048535
    e. caller桢的地址: called by frame at 0xbffff420
    f. callee(被调用者)桢的地址: caller of frame at 0xbffff3e0
    g. 源代码所用的程序的语言(c/c++): source language c++
    h. 当前桢的参数的地址及值: Arglist at 0xbffff3f8, args: name=0×8048621 “jessie”, myname=0x804861c “jack”
    i. 当前相中局部变量的地址:Locals at 0xbffff3f8, Previous frame’s sp is 0xbffff400
    k. 当前桢中存储的寄存器: Saved registers: ebp at 0xbffff3f8, eip at 0xbffff3fc

  • (2)info args:查看当前桢中的参数
  • (3)info locals:查看当前桢中的局部变量
  • (4)info catch:查看当前桢中的异常处理器(exception handlers)

from:http://www.wuzesheng.com/?p=1409

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用GDB查看函数调用,你可以按照以下步骤进行操作: 1. 首先,启动GDB并加载你的程序。你可以使用以下命令:`gdb <your_program>`。 2. 在GDB中,你可以使用`backtrace`命令或简写的`bt`命令来查看函数调用。这将显示当前函数调用的顺序以及每个函数的输入参数和局部变量。例如,你可以输入`bt`命令来查看函数调用。 3. 如果你想查看更详细的信息,你可以使用`frame`命令或简写的`f`命令,后跟帧号。帧号从0开始,表示最新的函数调用。例如,你可以输入`f 0`命令来查看最新的函数调用的详细信息。 4. 如果你想查看特定函数的调用,你可以使用`up`命令或简写的`u`命令来向上移动到上一个函数调用。例如,你可以输入`u`命令来查看上一个函数调用的详细信息。 总结起来,使用GDB查看函数调用的步骤如下: 1. 启动GDB并加载你的程序。 2. 使用`bt`命令查看函数调用。 3. 使用`f`命令和帧号查看特定函数调用的详细信息。 4. 使用`u`命令向上移动到上一个函数调用。 希望这些信息对你有帮助!\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [GDB使用技巧(3)——查看信息](https://blog.csdn.net/li_wen01/article/details/105223367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用的查看](https://blog.csdn.net/qq_37375427/article/details/85226496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [GDB入门教程之查看函数调用](https://blog.csdn.net/qq_39107832/article/details/119206954)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值