1.gdb是什么?
官网介绍:
GDB, the GNU Project debugger, allows you to see what is going on `inside' another program while it executes -- or what another program was doing at the moment it crashed.
GDB是GNU工程调试器,让你能够看到程序内部是如何执行的,或者在程序崩溃的时刻程序在干什么。说白了就是一个调试程序的工具。
GDB can do four main kinds of things (plus other things in support of these) to help you catch bugs in the act:
GDB可以做四类事情来帮助你捕捉实际中的bug。
-
Start your program, specifying anything that might affect its behavior.
启动程序,查看影响程序行为的任何细节。
-
Make your program stop on specified conditions.
让你的程序在特定条件下停止。
-
Examine what has happened, when your program has stopped.
测试当你的程序停止时到底发生了什么。
-
Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.
2.demo
下面均以此有问题的程序test_error.c说事。
#include<stdio.h>
int main()
{
int* pNum = NULL;
*pNum = 100;
return 0;
}
首先编译程序然后进入调试状态:
- 其中-g是要生成符号文件,否则当使用gdb调试时会提示没有符号文件,如下图所示。
3.gdb命令以及调试
首先apt-get install gdb进行安装。
-
gdb a.out :进入调试状态。
-
list :列出程序代码,包含行数 然后就可以设置断点了。
-
break(r):设置断点:b 3或者b main 在第三行或者main函数处设置断点。
-
run(r):程序执行。
-
print(p) 变量 :查看变量在当前断点处的信息。
-
info b :查看断点信息。
-
next(n):单步执行。
以下是一个简单的调试过程:
4.调试崩溃core文件
在我们运行程序时经常会遇见:段错误,核心已转储之类的提示。或者只有段错误,注意在这种情况下是因为ulimit的问题,所以没有生成崩溃信息文件。
当我们需要调试一个崩溃程序时,首先得生成崩溃信息文件:core。
- ulimit -c 查看允许的崩溃文件大小,如果没有开启则结果是0.
- ulimite -c unlimited手动开启即可.
接下来启动gdb运行以下命令:
gdb a.out core
gdb会直接定位到你的崩溃代码处!如下图:
然后就会直接跳到崩溃代码处。此处是因为p为空指针却给赋了值!
5.调试nodejs
注意在gdb中设置参数的方法:set args a b c
当nodejs调用了C++插件,而插件中存在崩溃时,也可以用gdb来调试。
直接在js中调用时可能看不出直接问题:
此时启用gdb调试:
此时问题直接定位到了。刚开始gdb进去的时候是不能给.node设置断点的(或者我不会),r之后会加载进去,之后输入list则会显示出demo.cc的代码,此时可利用b、n进行断点设置及单步运行调试。
另外:貌似可以直接给库文件打断点:此时其实需要源文件
6.收工
perfect!