利用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,相应的也把语句给打印了出来。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值