一、用gdb调试程序
Linux中包含一个很强大的调试工具GDB,可以用它来调试C、C++程序。 要使用GDB进行调试,在编译程序的时候需要加入-g选项。
使用流程
(1)gcc -g test.c -o test
(2) 启动gdb:gdb test
(3)在main函数处设置断点:break main
(4)运行程序:run
/*此程序实现累加求和
gcc -g test.c -o test
./test 3
结果为6=1+2+3
*/
#include <stdio.h>/* 用于printf*/
#include <stdlib.h>/*用于malloc*/
/* 声明函数sum()为static int类型 */
static int sum(int value);
/* 用于控制输入输出的结构 */
struct inout{
int value;
int result;
};
int main(int argc, char *argv[]){
struct inout *io = (struct inout*)malloc(sizeof(struct inout)); /*申请内存*/
if(NULL == io) /*判断是否成功*/
{
printf("申请内存失败\n"); /*打印失败信息*/
return -1; /*返回-1*/
}
if(argc !=2) /*判断输入参数是否正确*/
{
printf("参数输入错误!\n"); /*打印失败信息*/
return -1; /*返回-1*/
}
io->value = *argv[1]-'0'; /* 获得输入的参数 */
io->result = sum(io->value); /* 对value进行累加求和 */
printf("你输入的值为:%d,计算结果为:%d\n",io->value,io->result);
return 0;
}
/* 累加求和函数 */
static int sum(int value){
int result = 0;
int i = 0;
for(i=0;i<=value;i++) /* 循环计算累加值 */
result += i;
return result; /*返回结果*/
}
1、启动gdb
(1) gdb test
或 (2) gdb
file test
2、设置输入参数的值: set args 参数值1 参数值2 ....
如set args 3 表示向可执行文件test传入的参数值为3
查看参数值: show args
3、列出可执行文件对应的源文件的代码: list 开始的行号 或 list 函数名 或 list line1,line2 (列出line1-line2之间的代码)
如 list 7 ,表示从第7行开始列出代码,每次按Enter键后顺序向下列出代码。
4、设置断点:GDB会在执行该位置的代码之前停下来
break 行号
break 文件名:行号 //在指定文件的指定行添加断点
break 函数名 //在某函数的入口处添加断点
如 b 38 ,在第38行设置断点。
info break //查看所有设置的断点
delete 断点编号 //删除某个断点
5、运行程序:run //程序运行到断点,会在断点处停止运行
6、显示变量的值
程序运行到第38行断点的时候。会中断运行等待进一步的指令。这时可以进行一系列的操作,其中display可以显示变量的值。
display i //每次停止时显示变量i的值
display result //每次停止时显示变量result的值
continue //继续运行
continue //继续运行
7、修改变量的值
set result=6 //修改result的值为6
continue //继续运行
8、退出GDB
q
9、打印数据
打印变量的值:print 变量名
计算函数调用的返回值: print sum(3)
打印一个结构中各成员的值: print *io //打印io结构中各成员的值
10、查看变量类型
whatis + 变量名
或ptype + 变量名
11、单步调试
next 不进入被调用函数的函数体
step 会进入被调用函数的函数体
12、continue 继续执行到程序结束或下一个断点
13、backtrace 列出函数的调用过程(从最近到最远)
14、多线程thread
info thread 列出当前线程的线程号
thread id 进入需要调试的线程
15、打印指定函数的汇编代码
disassemble + 函数名