gdb查看函数调用栈
2015-08-05 14:56
375 查看
我们知道,通常一个程序的运行,不外乎是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)where, info 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 frame、info frame n或者info frame
addr
查看指定桢的详细信息,关于详细信息的内容,这里有必要做一个介绍,如下图所示:
上图中显示的信息有:
a. 当前桢的地址: 0xbffff400
b. 当前桢PC: eip = 0x8048516
c. 当前桢函数: bar (test.cpp:16)
d. caller桢的PC: saved eip 0x8048535
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=0x8048621 “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
在上图中,整体叫做调用栈(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)where, info 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 frame、info frame n或者info frame
addr
查看指定桢的详细信息,关于详细信息的内容,这里有必要做一个介绍,如下图所示:
上图中显示的信息有:
a. 当前桢的地址: 0xbffff400
b. 当前桢PC: eip = 0x8048516
c. 当前桢函数: bar (test.cpp:16)
d. caller桢的PC: saved eip 0x8048535
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=0x8048621 “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
相关文章推荐
- cocos2d lua 设置触摸回调
- HDU 4104 Discount
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- POJ 2002 Squares
- java中设置JButton的背景图片,并在它上面显示文字
- ImportError: No module named setuptools 解决方案
- HDU 1269 迷宫城堡(求是否只有一个强连通分量)
- Linux下出现Read-only file system的解决办法
- android中UDP编程的注意事项
- js事件绑定的方法
- 南邮 OJ 1381 Friends
- NSNotificationCenter学习
- Android文字图像识别并翻译的简单实现
- 完美网络 SDUT 2506
- JavaScript学习笔记
- java多态的理解
- Session的SqlServer模式的配置
- HDU1874(Bellman-Ford,SPFA)
- Mysql explain
- Android判断APP是否在运行