由于当前的开发是在一个只有Linux内核的特定 环境进行的,Java代码可以通过远程调试功能在Windows下进行Debug,而C代码就没有那么幸运了。幸好有同事推荐了GDB,并且教给我了几个简单的命令,发现极其方便,并且功能很强大——虽然只是几个简单的命令,是整个调试过程变得妙趣横生。下面是我在调试应用的几个简单命令及简单过程。
一、简单的几个命令:
1、attach,绑定要调试程序的线程ID,形式:attach 9987
2、dir,绑定运行程序的源文件目录,例如: dir /tmp
3、b,设置断点,形式:b filename:line,例如:b general_parser.c:5695,就是在general_parser.c文件的第5695行设置断点。
4、advance,跳转到某处, 形式:advance line
5、display,显示变量或者表达式的值,在单步调试时会一直显示,形式:display expression
6、cont,继续执行,当运行到一个断点时,使用该命令继续向下执行到下一个断点
7、n,单步执行(Step over),每次执行一句,遇到函数调用时,不会进入到函数内部。如果前面使用display命令设置了要查看的表达式,那么就会在执行后显示出来。
8、s,单步跳入(Step into),也是每次执行一句,但是遇到函数调用时,会进入到函数内部。
9、list,列出产生执行文件的源代码的一部分
10、quit,退出
二、简单的调试过程
1、启动要调试的程序,并获得其线程ID;
2、启动gdb程序;
3、绑定调试程序的形成ID:
gdb/>attach pid
4、设置断点:
gdb/>b general_parser.c:5695
5、继续运行:
gdb/>cont
6、设置要查看的变量值:
gdb/>display currentMsg
7、继续运行:
gdb/>cont
8、等到预期输入时,可以单步调试
gdb/>n
9、遇到函数调用,可以使用s进入,也可以使用advance直接跳转某一行
gdb/>advance 3617
10、继续单步执行
gdb/>n
11、退出gdb。
当然上面的调试过程只时我在工作中的简单过程,并不具有普遍性,但是GDB几个简单的命令,的确是可以解决很大的问题。
下面是一篇关于GDB的文章:
http://dsec.pku.edu.cn/~yuhj/wiki/gdb.html