[linux仓库]调试Segmentation fault的利器:手把手教你开启和使用Core Dump[进程信号·叁]

🌟 各位看官好,我是

🌍 Linux == Linux is not Unix !

🚀 今天来学习Linux的core dump标志,理解core 和 term的区别。

👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享更多人哦!

目录

core dump 标志 

Core vs Term

思考

总结


core dump 标志 

在上一章节中,我们提到Core 和 Term 默认都是终止进程,只有在一些情况会出现区别:

信号有的是可以追踪的,有的是可以不被追踪的core dump表示不需要被追踪了

还记得这张图吗?当时我们在讲如果进程出现异常了,低7位表示退出信号,但是还有一位在那时并没有讲,而今天终于可以揭露这层面纱了.

先提出一个问题:如果我的进程出现异常了,我想不想知道是什么原因导致异常的?(像9号、2号这种信号就不需要,因为这是用户自己想退出的,因此默认行为是Term)

那肯定是想知道的,如 /0 和 野指针这种异常,我想知道是代码的哪一行导致了我的进程崩溃的.

  • core dump : 表示 核心转储,该标志位,表示的就是退出信号的详细退出类型.
  • OS会在进程结束的时候,把进程当前运行的上下文数据,dump转而存储到当前目录下,形成一个core文件 ! 这个文件可以让我们进行调试使用,定位出错行 ! (一种事后调试Post-mortem Debug)
  • ⼀个进程允许 产⽣多⼤的 core ⽂件取决于进程的 Resource Limit (这个信息保存 在PCB中)。默认是不允许产⽣ core ⽂件的, 因为 core ⽂件中可能包含用户密码等敏感信息,不安全。
  • 在开发调试阶段可以⽤ ulimit 命令改变这个限制,允许产生 core ⽂件。⽤ ulimit 命令改变 Shell 进程的 Resource Limit ,如允许 core ⽂件最⼤为 1024K: $ ulimit -c 1024.

Core vs Term

在ulimit -c开启core时,core形式终止,会发生core dump,term不会 ; 关闭时,二者等同。

int main()
{
    pid_t id = fork();
    if (id == 0)
    {
        // 子进程
        sleep(2);
        int a = 10;
        a /= 0;

        exit(1);
    }
    int status = 0;
    pid_t rid = waitpid(id, &status, 0);
    if (rid > 0)
    {
        printf("exit code:%d , exit signal:%d , core dump:%d\n",
               (status >> 8) & 0xFF, status & 0x7F, (status >> 7) & 0x1);
    }
    return 0;
}

思考

  • 上⾯所说的所有信号产⽣,最终都要有OS来进⾏执行,为什么?OS是进程的管理者
  • 信号的处理是否是⽴即处理的?在合适的时候
  • 信号如果不是被⽴即处理,那么信号是否需要暂时被进程记录下来?记录在哪⾥最合适呢?
  • ⼀个进程在没有收到信号的时候,能否能知道,自己应该对合法信号作何处理呢?
  • 如何理解OS向进程发送信号?能否描述⼀下完整的发送处理过程?

总结

Linux中的coredump标志用于进程异常终止时的核心转储,通过记录进程上下文数据形成core文件,方便事后调试。与Term终止方式不同,coredump需要ulimit-c开启,且可能包含敏感信息。文章通过示例代码演示了子进程除零错误导致coredump的情形,并探讨了信号处理机制中OS的角色、信号延迟处理及存储位置等问题。

评论 64
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值