1.单步调试
编译时加上-g,然后用gdb调试,自然就知道出现段错误的地方在哪。

2.利用core文件来进行调试
【1】用ulimit -c来查看core文件的最大值,如果是0就不会产生core文件。
此时可用ulimit -c 1000将core文件的最大值设置为1000K。
ulimit -c 1000只会影响当前的终端(对其他的终端无影响),终端关闭后又会恢复为0。
[root@localhost xufaniu]# ulimit -c
0
[root@localhost xufaniu]# ulimit -c 1000
[root@localhost xufaniu]# ulimit -c
1000

【2】作为调试,编写了以下3个文件,其内容如下:
(1) main.cpp
#include <stdio.h>
#include "../a.h"
int main()
{
    int param = 200;  
    show(param);
 return 0;
}

(2) a.h
void show(int value);

(3) a.cpp
#include <string.h>
int i = 999;
void show(int value)
{
    int j = 888;
 value++;
 
 char *abc = NULL;
 strcpy(abc, "Hello!/n"); 
}

【3】编译: g++ -g -o main main.cpp ../a.cpp
发现用gcc时有时会出现乱码,如??,改为用g++就一切正常了,不知道具体原因。
【4】运行:./main,可以发现段错误:
段错误 (core dumped)
此时可以在main文件的路径下产生了一个core文件: core.5083。
【5】调试: gdb ./main core.5083
Core was generated by `./main'.
Program terminated with signal 11, Segmentation fault.
[New process 5083]
#0  0x08048473 in show (value=201) at ../a.cpp:9
9  strcpy(abc, "Hello!/n"); 
(gdb) bt
#0  0x08048473 in show (value=201) at ../a.cpp:9
#1  0x08048447 in main () at main.cpp:6
(gdb) p i
$1 = 999
(gdb) p j
$2 = 888
(gdb) p value
$3 = 201
(gdb) p param
No symbol "param" in current context.
可以用p查看产生段错误时变量的值!

【6】注意,如果此时删掉../a.cpp,再用gdb调试,就会出现如下内容:
Program terminated with signal 11, Segmentation fault.
[New process 5083]
#0  0x08048473 in show (value=201) at ../a.cpp:9
9 ../a.cpp: No such file or directory.
 in ../a.cpp
(gdb) bt
#0  0x08048473 in show (value=201) at ../a.cpp:9
#1  0x08048447 in main () at main.cpp:6
(gdb) p i
$1 = 999
(gdb) p j
$2 = 888
(gdb) p value
$3 = 201
(gdb) p param
No symbol "param" in current context.
看不到出错的语句是哪条,但是知道是哪行出错了!
【7】如果此时上传文件../a.cpp,又会得到第5步的结果!
【8】如果用g++ -o main main.cpp ../a.cpp编译,执行./main时仍会产生core文件“core.5128”,
用gdb ./main core.5128 调试时看不到文件信息:
Program terminated with signal 11, Segmentation fault.
[New process 5128]
#0  0x08048473 in show ()
(gdb) bt
#0  0x08048473 in show ()
#1  0x08048447 in main ()
(gdb) p i
$1 = 999
(gdb) p j
No symbol table is loaded.  Use the "file" command.
(gdb) p value
No symbol table is loaded.  Use the "file" command.
(gdb) p param
No symbol table is loaded.  Use the "file" command.
看不到show函数的参数,也看不到函数体内定义的局部变量,只能看到全局变量!

用core文件进行gdb调试时,可执行文件并不是一定要用-g编译。但是用-g编译可以看到更多的调试信息。
建议用-g编译,然后用strip main去掉调试信息!
查看出错信息时,可用p和bt指令。

3.程序运行正常时不会产生core文件,因assert引起的异常退出也会产生core文件。

Logo

更多推荐