以下面代码为例子进行说明
参考视频:https://b23.tv/5x55iqI
1 #include <iostream>
2 #include <string>
3
4 void test(){
5 int *p = nullptr;
6 *p = 0;
7 }
8 int main(){
9 test();
10 return 0;
11 }
g++ -o main main.cpp -g
./main
Segmentation fault (core dumped) 段错误
使用gdb进行调试,首先需要开启coredump文件,默认是不产生的,可以使用
ulimit -a
查看,如下
core file size (blocks, -c) 0
需要进行设置
设置方式
ulimit -c unlimited
设置输出路径
终端输入:cat /proc/sys/kernel/core_pattern
终端输出:/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E
需要进行修改,需要使用管理员权限
echo "your coredump file output path"/输出格式 > /proc/sys/kernel/core_pattern
示例:
echo "/home/wxn/Desktop/core-%t-%p" > /proc/sys/kernel/core_pattern
%参数列表
------
%% -相当于- %
%p -相当于- <PID>
%u -相当于- <UID>
%g -相当于- <GID>
%s -相当于- 导致dump的信号的数字
%t -相当于- dump产生的时间
%h -相当于- hostname
%e -相当于- 可执行文件名称
这样,当再次产生段错误时会在上述指定的路径上产生一个coredump文件。
使用coredump进行错误定位
将产生的coredump文件和可执行文件一起放入gdb中进行执行
比如:上述程序产生的可执行文件是main,产生的dump文件是core-main-3583,那么有如下指令
gdb main core-main-3583
gdb会直接告诉在哪里出现了错误
root@ubuntu:/home/wxn/Desktop# gdb main core-main-3583
Reading symbols from main...done.
warning: exec file is newer than core file.
[New LWP 3583]
Core was generated by `./main'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00005623fd4fb74a in test () at main.cpp:6
6 *p = 0;
(gdb)
如上,说明在main.cpp的test函数中出现了错误,行号是6,相应的也把语句给打印了出来。