bot*_*tch 5 linux c ubuntu segmentation-fault core-dump
场景(Ubuntu 16.04):
我编译并运行了一个 C 程序(使用-g,我得到了传统的Segmentation Fault (core dumped),然后(当然)没有找到神话般的“核心”文件。一些挖掘说/proc/sys/kernel/core_pattern使用命令修改为:echo '|tee /home/me/my_core_folder/my_core_file' | sudo tee /proc/sys/kernel/core_pattern,然后在做这个,我停止获取(core dumped)并开始只获取plain Segmentation Fault。我尝试了一些gdb ./program_object_file.out core.pid显然不存在的东西(我变得绝望了),当然,我尝试了plaingdb ./a.out后跟(gdb) core core.pid和命令的变体,我tab拼命向其中发送密钥获得自动完成功能,让我到达我需要去的地方。
题:
有没有通用的方法可以进入核心转储?我意识到我接触的每台机器似乎都有迈克尔贝的变形金刚式的重新配置硬件和软件的能力,这样我拥有的任何设备都不能正常工作。是否有一个简单的算法/方法可以用来在我自己的机器以及其他人的机器上定位核心转储?我总是发现自己在不小的工作之后就这样的事情辅导朋友,让事情为自己工作,并且能够运行命令或其他东西将核心文件转储到运行可执行文件的目录中会很好...有什么方法可以在大多数(我会满足于“某些”)Linux/Unix 机器上执行此操作?
联机core(5)帮助页详细描述了影响核心转储的参数,包括它们的命名等。
为了回答您提出的问题,没有通用的方法来查找核心转储。默认情况下,如果允许进程在其中写入,如果包含的文件系统上有足够的空间,如果没有现有的核心转储(在某些情况下),并且如果文件大小核心文件大小限制(由ulimit或类似机制设置)允许这样做。但/proc/sys/kernel/core_pattern提供了许多不同的处理核心转储的方法,因此您确实也需要查看并弄清楚发生了什么。
在你的情况下,我不知道为什么最初找不到核心,但我知道为什么你在设置重定向后停止获取核心:当在 中使用管道时,必须使用绝对路径名指定core_pattern处理程序。单独使用不会被使用;你需要指定. 请注意,您应该特别注意多用户系统上的这种类型的设置,因为处理核心转储的程序运行为.tee/usr/bin/teeroot
在 Debian 衍生品上,我安装了corekeeper,它以一种易于使用的方式将核心转储写入/var/crash.