一、概述
使用c++开发程序时,经常会遇到运行中core的情况,如果是偶发的就更加难以定位,本文讲解如何使用gdb进行core位置的分析定位。
二、打开coredump文件生成
# 1. 支持产生coredump
# 查看当前设置
cat /etc/security/limits.conf|grep core
ulimit -c # 如果是unlimited,说明设置成功
# 设置(最好加到业务启动命令里)
ulimit -c unlimited
# 2.控制core文件保存位置和文件名格式
# 查看目前使用的方式
cat /proc/sys/kernel/core_pattern
# 修改生成位置和命名规则(必须bash -c 'echo xxx'方式,不能通过vi修改)
sudo bash -c 'echo "/coredump/%e_%p_%t.core" > /proc/sys/kernel/core_pattern'
# 命名格式参数:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
# qnx系统下没有/proc/sys/kernel/core_pattern文件,需要用命令指定保存目录
dumper -d /coredump/
# 3.测试让程序产生一个coredump
kill -6 $pid
kill -11 $pid
三、使用gdb分析core
1、使用gdb分析coredump文件
gdb ./bin/ipc_server ipc_server.core # 必须使用与core时一样的bin/lib文件
(gdb) set args zmq 6000 # 指定运行时的参数
(gdb) bt # backtrace显示当前调用堆栈
(gdb) q # 退出gdb
2、使用gdb调试bin文件
gdb -q ./bin/ipc_server
(gdb) set args zmq 6000 # 指定运行时的参数
(gdb) r # run运行程序直到遇到 结束或者遇到断点
(gdb) bt # backtrace显示当前调用堆栈
(gdb) quit # 退出gdb
参考:
https://cloud.tencent.com/developer/article/1428111?from=15425