在linux进行程序调试通常有二种,一是通过printf打印日志,这也是非常方便的;另一种就是gdb调试。
进行gdb调试就如在vs中调试一样简单,通过gdb命令完全可以找到程序中任何错误。
下面贴出gdb命令,看一眼或者用一次不可能完全记住,需要多加练习,下面放上gdb调试的命令,遇到想不起来方便查看。
通过进行gdb调试的时候,在编译的时候需要加上-g,
如:gcc -g main.c -o main(注:-g 只是把原代码行数等记录在main里,然后通过索引到源代码中,所以调试的时候源代码必须存在)
然后运行:gdb main
在linux,可以通过help命令查看。
下面通过一个小程序学习gdb常用命令的使用:
程序文件为:gdbtest.c
源代码:
#include <stdio.h>
int add(int a, int b)
{
int sum=a+b;
return sum;
}
int main(void)
{
int a=10;
int b=15;
int c=add( a, b);
printf("result=%d ",c);
return 0;
}
编译命令:gcc -g gdbtest.c -o main
调试:gdb main
下面就可以开始进行gdb调试了
GDB常用命令: 命令:strat 描述:开始执行程序,停止在main函数的第一句等待命令
命令:finish 描述:一直运行当前函数中返回的位置前,等待下一步命令
命令:quit 描述:退出gdb调试
命令:list/l (无/函数/行号) 描述:查看代码,除了指定之外从第一行开始显示
命令:s/step、n/next 描述:执行下一句,区别是在有函数调用的时候s进入函数,而n不进入到函数里。vs调试的时候s=f11 n=f10
命令:bt/backtrace 描述:查看各级函数调用及其参数
命令:frame/f 帧编号(注:可以通过bt查看) 描述:选择栈帧 比如::f 0
命令:info/i locals 描述:查看当前栈帧中的局部变量的值
命令:print/p 表达式 描述:打印表达式的值,可以通过表达式去修改变量的值或者调用函数 比如:p sum
命令:set var 变量 描述:修改变量的值 比如:set var sum=0
命令:break/b 行号/函数 描述:在某一行或者函数设置断点
命令:break 行号/函数 if条件 描述:设置条件断点
命令:info/i breakpoints 描述:查看当前设置的断点
命令:disable breakpoints 断点号 描述:禁用此断点 断点号可以通过info breakpoints查看
命令:enable breakpoints 断点号 描述:启用此断点 断点号可以通过info breakpoints查看
命令:delete breakpoints 断点号 描述:删除断点,断点号可以通过info breakpoints查看
命令:display 变量 描述:跟踪查看此变量,只要停止都显示次变量的值
命令:undisplay 跟踪显示号 描述:取消此跟踪
命令:continue/c 描述:继续执行到下一个断点或者观察点
命令:run/r 描述:从头开始执行程序
命令:watch 变量 描述:设置观察点 一般都是break在要观察变量处设置断点,用run 执行到断点 使用watch 设置观察点 使用continue看观察点是否变化,当发生变化时停止
命令:info/i watchpoints 描述:查看当前设置的观察点
命令:x 变量 描述:从某个位置开始打印存储单元的内容,全部当字节看,不区分属于哪个变量比如x/7b input 7代表7组 b是一个字节代表一组
这里列举了常用的调试gdb命令,还有很多命令比如多线程调式之类的,可以参考下面网址,里面涵盖了所有的gdb命令:
http://wangcong.org/articles/learning-gdb.cn.html