Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356112
  • 博文数量: 83
  • 博客积分: 5322
  • 博客等级: 中校
  • 技术积分: 1057
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-11 11:27
个人简介

爱生活,爱阅读

文章分类

全部博文(83)

文章存档

2015年(1)

2013年(1)

2012年(80)

2011年(1)

分类: LINUX

2012-09-19 22:08:43

3.如何使用调用栈?

调用栈是有控制程序执行流的栈帧的存储位置。当调用函数时,将创建一个栈帧,用于告诉计算机在该函数调用结束时,如何将控制权交给调用函数。栈帧也是局部边变量与函数参数的存储位置。我们可以查看这些栈帧,以确定我们的程序时如何运行的。找出当前栈帧之下的栈帧列表是通过backtrace命令实现的

3.1如何获得栈帧?

使用gdb命令backtrace。在下面的栈帧列表中,我们可以看到我们当前位于func2()内,该函数时由func1()调用,而func1()是由main()调用的。

(gdb) backtrace

#0  func2 (x=30) at test.c:5

#1  0x80483e6 in func1 (a=30) at test.c:10

#2  0x8048414 in main (argc=1, argv=0xbffffaf4) at test.c:19

#3  0x40037f5c in __libc_start_main () from /lib/libc.so.6

(gdb)

3.2 如何改变栈帧?

使用gdb 命令frame。注意,在上述的栈帧列表中,每一个帧旁边均标识一个数字。将你希望进入的栈帧对应的数字作为frame的参数。

(gdb) frame 2

#2  0x8048414 in main (argc=1, argv=0xbffffaf4) at test.c:19

19        x = func1(x);

(gdb)

3.3如何检查栈帧?

为了查看当前栈帧的内容,有三个有用的gdb命令。Info frame命令显示当前栈帧的信息。Infor locals 显示栈帧局部变量列表以及其在当前栈帧的值。Info args显示参数列表的值。

(gdb) info frame

Stack level 2, frame at 0xbffffa8c:

 eip = 0x8048414 in main (test.c:19); saved eip 0x40037f5c

 called by frame at 0xbffffac8, caller of frame at 0xbffffa5c

 source language c.

 Arglist at 0xbffffa8c, args: argc=1, argv=0xbffffaf4

 Locals at 0xbffffa8c, Previous frame's sp is 0x0

 Saved registers:

  ebp at 0xbffffa8c, eip at 0xbffffa90

(gdb) info locals

x = 30

s = 0x8048484 "Hello World!\n"

(gdb) info args

argc = 1

argv = (char **) 0xbffffaf4

 

阅读(1207) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

itisthinktime2012-09-20 09:14:19

Bean_lee: 这些命令都可以用简写
bt  = backtreace
fr 2 = frame 2

如果不能用简写的话,gdb 就比较要命了.....
是的,在没有歧义的情况下都可以简写。
我平时用这些你调试命令也都是简写的,这是从国外一篇文章翻译过来,为的是提高下英语啊。

Bean_lee2012-09-19 22:27:25

这些命令都可以用简写
bt  = backtreace
fr 2 = frame 2

如果不能用简写的话,gdb 就比较要命了