利用GDB中coredump快速定位

以下面代码为例子进行说明
参考视频: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,相应的也把语句给打印了出来。

你可能感兴趣的:(c++,linux,ubuntu,运维)