(gdb) frame spec
该命令可以将 spec 参数指定的栈帧选定为当前栈帧。spec 参数的值,常用的指定方法有 3 种:(gdb) up n
其中 n 为整数,默认值为 1。该命令表示在当前栈帧编号(假设为 m)的基础上,选定 m+n 为编号的栈帧作为新的当前栈帧。(gdb) down n
其中 n 为整数,默认值为 1。该命令表示在当前栈帧编号(假设为 m)的基础上,选定 m-n 为编号的栈帧作为新的当前栈帧。(gdb) info frame
该命令会依次打印出当前栈帧的如下信息:info args
命令查看当前函数各个参数的值;使用info locals
命令查看当前函数中各局部变量的值。
(gdb) backtrace [-full] [n]
其中,用 [ ] 括起来的参数为可选项,它们的含义分别为:thread apply all backtrace
命令。#include <stdio.h> int func(int num){ if(num==1){ return 1; }else{ return num*func(num-1); } } int main () { int n = 5; int result = func(n); printf("%d! = %d",n,result); return 0; }不难发现,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)
本文链接:http://task.lmcjl.com/news/16465.html