• CORE DUMP生成调试


    之前我调试嵌入式linux程序,一般是借助ucontext库,在发生段错误时,直接将错误函数打印出来。有同事建议我使用core dump,于是我今天在嵌入式板卡尝试了core文件的生成,但是也是几经波折,在网上查了很多资料,才成功生成core文件,所以总结如下:

      如果程序段错误了,core文件没有生成,请做如下的尝试:

      1. 检查ulimit,输入命令ulimit-c,看是否是0;建议修改成:ulimit -c unlimited

      2. 检查kernel选项,CONFIG_ELF_CORE必须要打开。这个选项应该在menu config的general里面;记不清了,可以用grep搜索一下你的config文件,看当前值是什么。

      3. 修改/proc/sys/kernel/core_uses_pid;/proc/sys/kernel/core_pattern等文件;这时遇到权限问题,加sudo也不行。可以用下面的方式来解决问题:

    sudo bash -c "echo "1" >/proc/sys/kernel/core_uses_pid "
    sudo bash -c "echo "/opt/app_driver/core-%e-%p-%t" >/proc/sys/kernel/core_pattern"
    sudo bash -c "echo "1" >/proc/sys/fs/suid_dumpable"

    不要直接sudo 去echo,而是在bash之前加sudo。

    原因网上有资料说是:

    procfs中的条目由ad hoc代码管理。在/proc/sys下设置文件权限和所有权的代码(proc_sys_setattr)拒绝使用EPERM更改权限和所有权。
    因此无法更改这些文件的权限或所有权,完全停止。这样的改变没有实现,因此root无效。 当您尝试以非root用户身份编写时,会收到权限错误。即使使用sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern,
    您尝试以非root用户身份编写:sudo以root身份运行echo,但重定向发生在执行sudo的shell中,该shell没有提升权限。使用sudo bash -c '… >…',
    重定向在bash实例中执行,该实例由sudo启动并以root身份运行,因此写入成功。

    也可以用下面的方式来修改,实际上我就是这么成功修改的:

    sudo sysctl -w kernel.core_pattern=/opt/app_driver/core-%e-%p

    如此再运行程序,出现段错误,就能够在/opt/app_driver/ 目录下生成core文件

     生成段错误之后,就可以用gdb查看段错误信息了。
     
    1.sudo gdb ./demoout core-xxx-855
    2.输入bt,打印backtrace
    3.x/128xw 0xb58cd4e8 来打印内存
  • 相关阅读:
    【读书笔记】深入理解计算机系统
    快速排序
    列表查找的两种方法
    冒泡排序、选择排序、插入排序
    堆排序
    supervisor进程管理
    redis-主从复制
    redis-淘汰策略
    URI和URL
    python爬虫之xpath的基本使用
  • 原文地址:https://www.cnblogs.com/djw316/p/10908322.html
Copyright © 2020-2023  润新知