ulimit -c 查看限制
ulimit -c unlimited 解除限制
运行可执行程序,若奔溃则产生core文件。
通过指令:gdb gdbcdtest core 来打开core文件
如果存在core找不到的情况,可能是没配置core生成的默认路径。
---------------------------------------------------------------------------------------------------------------------------------
常用的gdb命令:
l(list) , 显示源代码,并且可以看到对应的行号;
b(break)x, x是行号,表示在对应的行号位置设置断点;
p(print)x, x是变量名,表示打印变量x的值
r(run), 表示继续执行到断点的位置
n(next), 表示执行下一步
c(continue), 表示继续执行
q(quit), 表示退出gdb
常用signal的含义
SIGABRT:调用abort函数时产生此信号。进程异常终止。
SIGBUS: 指示一个实现定义的硬件故障。
SIGEMT: 指示一个实现定义的硬件故障。EMT这一名字来自PDP-11的emulator trap 指令。
SIGFPE: 此信号表示一个算术运算异常,例如除以0,浮点溢出等。
SIGILL: 此信号指示进程已执行一条非法硬件指令。4.3BSD由abort函数产生此信号。SIGABRT现在被用于此。
SIGIOT: 这指示一个实现定义的硬件故障。IOT这个名字来自于PDP-11对于输入/输出TRAP(input/outputTRAP)指令的缩写。系统V的早期版本,由abort函数产生此信号。SIGABRT现在被用于此。
SIGQUIT:当用户在终端上按退出键(一般采用Ctrl-/)时,产生此信号,并送至前台进
程组中的所有进程。此信号不仅终止前台进程组(如SIGINT所做的那样),同时产生一个core文件。
SIGSEGV:指示进程进行了一次无效的存储访问。名字SEGV表示“段违例(segmentationviolation)”。
SIGSYS: 指示一个无效的系统调用。由于某种未知原因,进程执行了一条系统调用指令,但其指示系统调用类型的参数却是无效的。
SIGTRAP:指示一个实现定义的硬件故障。此信号名来自于PDP-11的TRAP指令。
SIGXCPUSVR4和4.3+BSD支持资源限制的概念。如果进程超过了其软C P U时间限制,则产生此信号。
SIGXFSZ:如果进程超过了其软文件长度限制,则SVR4和4.3+BSD产生此信号。
---------------------------------------------------------------------------------------------------------------------------------
如果程序是通过shell脚本打开,不能再用gdb ./xxx.sh core来进行调试,不然定位不到问题。只能使用程序名称进行调试。
目前用的Qt6.2.试了再代码中加:
#QMAKE_CC += -g
#QMAKE_CXX += -g
#QMAKE_LINK += -g
没发现产生的core有啥区别。没有这个代码依然能通过core找到源码。
---------------------------------------------------------------------------------------------------------------------------------
关于coredump存储位置问题
echo 是向窗口输出脚本。
echo "$dirname/coredump.%e.%p" > /proc/sys/kernel/core_pattern
产生的core文件需要可执行程序一起。不然也定位不到错误位置。
这里记录一个矢量图设计软件www.inkscape.org
目前各个平台都行。