版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
</div>
<!--一个博主专栏付费入口-->
<!--一个博主专栏付费入口结束-->
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
<div id="content_views" class="markdown_views">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<h1 id="关于gdb"><a name="t0"></a>关于gdb</h1>
- test: debug.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BIGNUM 1111
void array(int ary[]);
int main(int argc, char *argv[])
{
int i[100];
/*选择性编译的时候gcc -o debug debug.c -DDEBUG*/
#ifdef DEBUG
printf("[%d]\n", __LINE__);//打印行号
#endif
array(i);
#ifdef DEBUG
printf("[%d]\n", __LINE__);
#endif
exit(1);
}
void array(int ary[])
{
int i;
for(i=0; i<BIGNUM; i++)
{
ary[i] = i;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
1,编译的时候,要加上-g : gcc -o debug debug.c -g
2,使用gdb来启动待调试代码:
gdb ./debug
- 1
3,列出待调试代码:
l
list
l 10 (显示第10行)
l 1,30 (显示第1行到30行)
- 1
- 2
- 3
- 4
4,设置断点:
b 10 (在程序的第10行,设置一个断点)
b 20 if i>= 5 (在程序的第20行,设置一个断点,并且只有当i>=5时才停下来)
info b (查看所设置的断点的信息)
delete N (删除第N号断点)
disable N (禁用第N号断点)
enable N (启用第N号断点)
- 1
- 2
- 3
- 4
- 5
- 6
5,启动待调试代码:
run
r
r abcd 1234 (带参数)
- 1
- 2
- 3
6,查看相关的变量、栈的信息:
print i
p i
display i (跟踪显示变量的值)
backtrace full (查看当前进程的栈的信息)
bt full
whatis i (查看变量i的类型)
- 1
- 2
- 3
- 4
- 5
- 6
7,单步调试
next (单步运行:将函数调用看作一步)
n
n 10
step (单步运行:会进入函数调用)
s
s 10 (运行10次)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
8,继续运行代码:
continue (让进程持续运行,直到遇到断点,或者进程退出为止)
c
- 1
- 2
9,退出gdb:
quit
- 1
最常见的错误:非法内存访问(段错误 / segmentation fault)
该种错误的调试步骤:
1,编译: gcc -o debug debug.c -g
2,取消系统对core文件大小的限制:
ulimit -c unlimited
- 1
3,让有段错误的代码去死,产生一个core文件
./debug
- 1
4,让gdb帮我们看看在哪里出错:
gdb ./debug core
- 1
注:
gdb不一定100%地能找到错误的地方,如果找不到,还是要自己一步一步地找。我们要根源上写代码的时候就要避免出现此类错误,预防大于治疗。