• linux core dump 生成和调试


    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
    ", 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
    ", 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

  • 相关阅读:
    thinkphp5.0与thinkphp3.2之间的区别
    比较数组大小
    PHP语言开发微信公众平台(订阅号)之curl命令(补充)
    ThinkPHP3.2.3快速入门:基础篇
    phpcms利用表单向导创建留言板(可以回复)
    Vijos P1782 借教室 ( 前缀和&&差分序列)
    HDU2648:Shopping(DKBR_hash)
    Codeforces Round #375 (Div. 2)
    BestCoder Round #88
    Codeforces Round #373 (Div. 2)
  • 原文地址:https://www.cnblogs.com/shuqin/p/9620929.html
Copyright © 2020-2023  润新知