您的位置:首页 > 运维架构 > Linux

Linux环境下调试C程序

2016-03-18 14:36 274 查看
  编译加上调试信息

  #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帧

  之后查看寄存器也会查看对应的寄存器

  #i r

  之后也会查看对应寄存器内容

  #x/40xw $esp

  查看堆栈底

  #x/40xw $ebp

  #FormatImgID_0#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: