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#
#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#
相关文章推荐
- linux下挂载移动硬盘
- Lesson 6 SDL扩展库的使用和加载其他格式的图片
- linux 运行级别与chkconfig
- u-boot向linux内核传递启动参数(详细)
- Linux文件夹分析
- Linux之getopt
- Linux查看与修改时区、时间的命令
- 升级CentOS自带的JDK
- ARM Linux 3.x的设备树(Device Tree)
- linux awk命令详解
- Linux下FTP服务器的搭建
- 诡异的解决了诡异的错误---Win10+Kali linux 2.0 双系统 以及 grub 修复(上)
- Linux软连接和硬链接
- linux学习杂记
- Linux C Programing - Arguments(2)
- LINUX下动态库调用静态库的方法
- Linux C Programing - Terminal(1)
- Linux下autoconf
- Linux串口编程(中断方式和select方式)
- 《鸟哥的Linux私房菜:基础学习篇》读书笔记之第一部分