linux core dump 生成和调试
程序员文章站
2022-03-23 20:57:09
core dump 某些信号的产生会导致产生core dump,包含了进程终止时的内存镜像。在某些时候这个core文件就非常的有用处,配合gdb或者lldb调试起来非常方便。 更详细的文档参考 Linux Manual Page http://man7.org/linux/man pages/man ......
core dump
某些信号的产生会导致产生core dump,包含了进程终止时的内存镜像。在某些时候这个core文件就非常的有用处,配合gdb或者lldb调试起来非常方便。
更详细的文档参考 linux manual page http://man7.org/linux/man-pages/man5/core.5.html.
生成 core 文件
这里只讲生成的方法,不能生成core的情况参考文档
ulimit -c -h 为查看core资源的命令 -c 为软资源限制(操作系统分配),-h 为操作系统资源的上限。
- 命令
ulimit -c limit
,limit
为设置的core文件的大小,也可以设置为unlimited
,当退出当前tty后设置便失效,资源限制成 0 - 修改
/etc/profile
,增加ulimit -c limit
,同上 - 修改
/etc/security/limits.conf
, 将 core 对应的 value 修改为要设置的值 - 调用函数
setrlimit()
设置当前进程的软core资源限制
struct rlimit rlim; rlim.rlim_cur = 1024 * 1024; // rlim.rlim_max 不设置 setrlimit(rlimit_core, &rlim);
调试
1 // file: lim.c 2 // author: xianhui (definezxh@163.com) 3 // date: 2018/09/10 15:24:07 4 5 #include <sys/resource.h> 6 #include <unistd.h> 7 #include <stdio.h> 8 #include <limits.h> 9 10 int main() 11 { 12 struct rlimit rlim; 13 14 getrlimit(rlimit_core, &rlim); 15 printf("cur: %lu, max: %lu\n", rlim.rlim_cur, rlim.rlim_max); 16 17 rlim.rlim_cur = 1024 * 1024; 18 // rlim.rlim_max 不设置 19 20 setrlimit(rlimit_core, &rlim); 21 22 getrlimit(rlimit_core, &rlim); 23 printf("cur: %lu, max: %lu\n", rlim.rlim_cur, rlim.rlim_max); 24 25 int *ptr = null; 26 for (int i = 0; i < 20; i++) 27 if (i == 10) 28 *ptr = 12; 29 } // 显然在第28行是错误的,这个用肉眼也能看的出来,但是如果是一个比较大的程序,就只顾首不顾尾了,有这个文件在,配合lldb lldb a.out --core core_p20828_s11_t1536568024 · · · process 21168 stopped * thread #1: tid = 21168, 0x0000000000400679 a.out`main + 169 at lim.c:28,name = 'a.out', stop reason = signal sigsegv: invalid address (faultaddress: 0x0) frame #0: 0x0000000000400679 a.out`main + 169 at lim.c:28 25 int *ptr = null; 26 for (int i = 0; i < 20; i++) 27 if (i == 10) -> 28 *ptr = 12; 29 } // 直接定位到段错误的地方,这个刻意 i == 10 的时候才出的错,是为了监视i的值 (lldb) p i (int) $0 = 10 // 监视段错误的时候 rlim.cur 的值 (lldb) p rlim.rlim_cur (rlim_t) $1 = 1048576
具体的core文件生成限制,core文件名的显示,控制将哪些映射写入核心转储 等说明参考manual page。
其实说白了,就是一个内核分配生成core文件大小和将内存映像写入至那个文件中的操作。
刚开始这个core始终不能生成,是应为我抄了manual page中的那个示例,但是示例产生文件目录名和我当时的目录不一致,这就导致了core不能生成。
当前我的/proc/sys/kernel/core_pattern
文件内容为core_p%p_s%s_t%t
,产生的文件为core_p20828_s11_t1536568024
上一篇: 0基础转行大数据都要学习什么内容?
下一篇: $.ajax()方法详解
推荐阅读
-
Visual Studio 2017通过SSH调试Linux上.NET Core
-
详解VS2017 Linux 上.NET Core调试
-
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
-
.net core3.0部署Linux服务器 使用Docker容器和Nginx反代理教程
-
建议收藏备用:.net core使用QRCoder生成普通二维码和带Logo的二维码详细使用教程,源码已更新至开源模板
-
详解VS2017 Linux 上.NET Core调试
-
Linux中生成Core Dump系统异常信息记录文件的教程
-
pycharm远程linux开发和调试代码的方法
-
详解Win10 Bash/WSL调试Linux环境下的.NET Core应用程序
-
详解Asp.Net Core 发布和部署( MacOS + Linux + Nginx )