怎么在Linux上获得错误段的核心转储
发布时间:2022-07-14 16:29:59 所属栏目:Linux 来源:互联网
导读:今天小编要跟大家分享的文章是关于Linux上错误段的核心转储问题。喜欢Linux操作系统,对Linux感兴趣的小伙伴快来看一看吧,希望通过本篇文章能够有所收获。 首先我们来说一说什么是段错误? 段错误(segmentation fault)是指你的程序尝试访问不允许访问的内存
今天小编要跟大家分享的文章是关于Linux上错误段的核心转储问题。喜欢Linux操作系统,对Linux感兴趣的小伙伴快来看一看吧,希望通过本篇文章能够有所收获。 首先我们来说一说什么是段错误? “段错误(segmentation fault)”是指你的程序尝试访问不允许访问的内存地址的情况。这可能是由于: 下面我们就来看一看如何得到一个核心转储? 步骤1:运行 valgrind 我发现找出为什么我的程序出现段错误的最简单的方式是使用 valgrind:我运行 1. valgrind -v your-program 这给了我一个故障时的堆栈调用序列。 简洁! 但我想也希望做一个更深入调查,并找出些 valgrind 没告诉我的信息! 所以我想获得一个核心转储并探索它。 如何获得一个核心转储 核心转储(core dump)是您的程序内存的一个副本,并且当您试图调试您的有问题的程序哪里出错的时候它非常有用。 当您的程序出现段错误,Linux 的内核有时会把一个核心转储写到磁盘。 当我最初试图获得一个核心转储时,我很长一段时间非常沮丧,因为 - Linux 没有生成核心转储!我的核心转储在哪里? ulimit:设置核心转储的最大尺寸 ulimit -c 设置核心转储的最大尺寸。 它往往设置为 0,这意味着内核根本不会写核心转储。 它以千字节为单位。 ulimit 是按每个进程分别设置的 —— 你可以通过运行 cat /proc/PID/limit 看到一个进程的各种资源限制。 例如这些是我的系统上一个随便一个 Firefox 进程的资源限制: 1. $ cat /proc/6309/limits 2. Limit Soft Limit Hard Limit Units 3. Max cpu time unlimited unlimited seconds 4. Max file size unlimited unlimited bytes 5. Max data size unlimited unlimited bytes 6. Max stack size 8388608 unlimited bytes 7. Max core file size 0 unlimited bytes 8. Max resident set unlimited unlimited bytes 9. Max processes 30571 30571 processes 10. Max open files 1024 1048576 files 11. Max locked memory 65536 65536 bytes kernel.core_pattern:核心转储保存在哪里 kernel.core_pattern 是一个内核参数,或者叫 “sysctl 设置”,它控制 Linux 内核将核心转储文件写到磁盘的哪里。 内核参数是一种设定您的系统全局设置的方法。您可以通过运行 sysctl -a 得到一个包含每个内核参数的列表,或使用 sysctl kernel.core_pattern 来专门查看 kernel.core_pattern 设置。 所以 sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t 将核心转储保存到目录 /tmp 下,并以 core 加上一系列能够标识(出故障的)进程的参数构成的后缀为文件名。 如果你想知道这些形如 %e、%p 的参数都表示什么,请参考 man core[1]。 有一点很重要,kernel.core_pattern 是一个全局设置 —— 修改它的时候最好小心一点,因为有可能其它系统功能依赖于把它被设置为一个特定的方式(才能正常工作)。 kernel.core_pattern 和 Ubuntu 默认情况下在 ubuntu 系统中,kernel.core_pattern 被设置为下面的值: 1. $ sysctl kernel.core_pattern 2. kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P 这引起了我的迷惑(这 apport 是干什么的,它对我的核心转储做了什么?)。以下关于这个我了解到的: 现在你有了核心转储,接下来干什么? 好的,现在我们了解了 ulimit 和 kernel.core_pattern ,并且实际上在磁盘的 /tmp 目录中有了一个核心转储文件。太好了!接下来干什么?我们仍然不知道该程序为什么会出现段错误! 下一步将使用 gdb 打开核心转储文件并获取堆栈调用序列。 (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读