coredump
程序员文章站
2022-07-14 23:37:49
...
设置 core
-
ulimit -c
查看 core 文件限制,如果为 0,说明 core 开关关闭; -
ulimit -c 1024
设置 core 为 1024 个 block(一般 1 block = 512 bytes,也可以ulimit -a
查看);ulimit -c unlimited
设置当前的 core 为无限制。 - 或者设置为永久生效,方式是:修改
/etc/security/limits.conf
文件,在下面加上* soft core unlimited
,然后重新登录(sudo su admin
之后再sudo su <yourusername>
); -
cat /proc/sys/kernel/core_pattern
查看默认的 core 文件存储位置及 core 文件名格式;
- 修改上述 pattern 文件,即可修改 core 的存储位置及名称格式。
%h | %e | %p | %t | %u | %g | %s |
---|---|---|---|---|---|---|
产生 core 的主机名 | 程序文件名 | pid | 时间戳 | uid | gid | 产生 core 的信号 |
gdb 调试 core:
- 我使用的示例代码;
#include <stdio.h>
int main()
{
int *p = NULL;
*p = 666;
return 0;
}
- 编译时加上
-g
选项:gcc -g main.c -o main
; - 运行时出 core;
-
gdb <程序名> <core名>
如gdb ./main /home/admin/core/core-HOST-main-70197-1577277341
进入调试; - 或
gdb -c /home/admin/core/core-HOST-main-70197-1577277341
,进入调试界面后再用file ./main
关联到程序文件; -
where
或bt
查看 core 在程序中发生的位置。
core 的可能产生原因
可以使用 kill -l
查看所有信号
信号 | 错误名称 | 发生原因 | 解决方案 |
---|---|---|---|
SIGQUIT (3) |
程序退出(如程序运行中按下 ctrl+\ ) |
||
SIGILL (4) |
illegal instruction (非法指令) |
进程中的某一句不能被 CPU 识别成正确的指令,发生的可能原因如: 1) 硬盘故障导致数据出错; 2) 由于指令集的演进导致在新体系结构中编译的可执行程序在老机器上运行时会出现 SIGILL; 3) 工具链(编译器、汇编器、链接器)出现问题; 4) 在某一系统环境中编译得到的可执行文件运行在另一系统环境下 |
|
SIGTRAP (5) |
跟踪自陷 | ||
SIGBUS (7) |
bus error (总线错误) |
(非法地址、违反定位访问)企图在奇数地址起始的地方强制类型转换为 short、int 等类型的值(在 Intel 处理器上不会有问题,但是效率会降低) | 使用内存拷贝的方式 |
SIGSEGV (11) |
segmentation fault (段错误) |
非法访问,访问了不该访问的内存,发生的可能原因如: 1) 向空指针处赋值; 2) 数组越界; 3) 将 int 型值赋给 %s 格式的字符串; 4) 磁盘空间不足(可以使用 df -lh 查看磁盘使用情况,-h 的目的是将 size 转换为更容易理解的形式如 GB、MB、kB) |
|
SIGFPE (8) |
浮点异常 | 算术错误,如除零 | |
SIGIO |
- bus error
#include <stdio.h>
int main()
{
char buf[256];
int* x;
x = (int*) &(buf[1]);
*x = 666;
printf("*x = %d\n", *x);
return 0;
}
上一篇: 通过链接如何找到指定位置
下一篇: Android TV框架TIF