Linux环境下的堆栈--调试C程序

完整的调试过程,跟踪堆栈变化,32位下。

注意64位和此不同。

 

a.c代码:

#include <stdio.h>   
int main()  
{  
    AFunc(5,6);
    return 0;
}  

int BFunc(int i,int j)
{
	int m = 1;
	int n = 2;
	m = i;
	n = j; 
	return m;
}
       

int AFunc(int i,int j)
{
    int m = 3;
    int n = 4;     
    m = i;
    n = j;
    BFunc(m,n);
    return 8;
}


编译加上调试信息

#gcc  -g  -o  a a.c

 

要调试C程序,在编译时,必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:

    > cc -g hello.c -o hello
    > g++ -g hello.cpp -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。

启动gdb

#gdb a

 

增加断点

#break *main

运行

#run

步入

#s     进入的单步执行

如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish
#finsh

#n    不进入的单步执行

查看数组的值
有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:
int *array = (int *) malloc (len * sizeof (int));
于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:
#p *array@len
如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。

 

whatis 命令可以显示某个变量的类型
(gdb) whatis p
type = int *

 

查看汇编

#disas

#bt 查看栈帧

#f 0查看第0帧

#f 1查看第1帧

#f N查看第N帧

之后查看寄存器

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值