通过产看栈信息,我们可以了解栈内帧的编号或地址,通过选择帧我们可以移动到指定的帧内去产看信息。
1、查看栈信息
产看函数调用栈的几个函数
bt
显示所有的函数调用栈帧的信息,每个帧一行。
bt n
显示栈定的n个帧信息。
bt -n
显示栈底的n个帧信息。
bt full
显示栈中所有帧的完全信息如:函数参数,本地变量
bt full n
用发同上。
bt full -n
例如:
(gdb) bt
#0 get_net_ipaddr (s=5, ifr=0xbfffe7ec, ipaddr=0xbfffe88c "192.168.1.200") at netif.c:67
#1 0x080491e2 in netinf_get (dev=0x8049a60 "eth0", ipaddr=0xbfffe88c "192.168.1.200", isup=0xbfffe844,
netmask=0xbfffe86c "\325I\024", hwaddr=0xbfffe84c "\001") at netif.c:296
#2 0x08048813 in main () at netif.c:34
(gdb) bt full
#0 get_net_ipaddr (s=5, ifr=0xbfffe7ec, ipaddr=0xbfffe88c "192.168.1.200") at netif.c:67
err = 0
#1 0x080491e2 in netinf_get (dev=0x8049a60 "eth0", ipaddr=0xbfffe88c "192.168.1.200", isup=0xbfffe844,
netmask=0xbfffe86c "\325I\024", hwaddr=0xbfffe84c "\001") at netif.c:296
s = 5
err = 0
ifr = {ifr_ifrn = {ifrn_name = "eth0", '\000'
sa_data = "\000\000\300\250\001\310\000\000\000\000\000\000\000"}, ifru_dstaddr = {sa_family = 2,
sa_data = "\000\000\300\250\001\310\000\000\000\000\000\000\000"}, ifru_broadaddr = {sa_family = 2,
ifru_newname = "\002\000\000\000\300\250\001\310\000\000\000\000\000\000\000",
ifru_data = 0x2
}}#2 0x08048813 in main () at netif.c:34
err = 1
isup = 0
ipaddr = "192.168.1.200\000\004\b\270\350\377\277\245\324\025\000\060\340\021\000\273\231\004\b"
2、选择帧
只有查看所选择帧内的信息是合法的,如果要查看指定帧内的信息,首先要移动到指定帧。
frame n
f n
通过帧编号来选择帧,帧编号可以通过bt来查看。
f addr
通过帧地址来选择帧,帧编号可以通过bt来查看。
up n
在栈中向上移动n个帧。即向着最外层移动n个帧。
down n
与 up 反方向移动n个帧。
up-silently n
down-silently n
在栈中移动n个帧,但是不打印信息。
3、查看帧内信息
frame
f
打印帧内函数的信息。
info frame
info f
打印帧的信息。
例如:
(gdb) info frame
Stack level 1, frame at 0xbfffe820: //被选帧的地址
eip = 0x80491e2 in netinf_get (netif.c:296); saved eip 0x8048813
called by frame at 0xbfffe8c0, caller of frame at 0xbfffe7b0 //调用帧和被调用帧的地址
source language c.
Arglist at 0xbfffe818, args: dev=0x8049a60 "eth0", ipaddr=0xbfffe88c "192.168.1.200", isup=0xbfffe844,
netmask=0xbfffe86c "\325I\024", hwaddr=0xbfffe84c "\001" //变量地址
Locals at 0xbfffe818, Previous frame's sp is 0xbfffe820
Saved registers:
ebp at 0xbfffe818, eip at 0xbfffe81c //保存的寄存器值地址
info frame addr
info f addr
打印通过addr指定帧的信息。
例如: info f 0x08048813
info args
打印函数变量的值。
info locals
打印本地变量的信息。
info catch