当前位置: 首页 > 面试题库 >

Linux中的核心转储

隗锐进
2023-03-14
问题内容

每当进程崩溃时,我都想创建一个核心转储。目前,我正在采用这种方法:

  1. 使用gcc / g ++的“ -g”构建程序的特殊“调试”版本。
  2. 执行“ ulimit -c unlimited”
  3. 现在,只要程序崩溃,我们就获得核心转储。

但我想减少步骤数,以便:

  • 应始终创建核心转储。即使是“发布”版本。不应要求用户ulimit -c unlimited手动执行命令“ ”。
  • 该核心转储的回溯应该能够给出调用的文件,函数,行号。那是人类可读形式的堆栈跟踪。
  • 我不想使用“ -g”将程序构建为调试版本。或者至少它不应包含生成人类可读堆栈跟踪所不需要的任何其他调试信息。因为这将是该程序的发行版本。

所以我有两个问题:

  1. 如何在程序的“发行版”中创建核心转储?
  2. 总是。无需手动执行“ ulimit -c unlimited

问题答案:

通常的解决方案是使用-g进行构建,并在释放文件之前剥离调试信息。查找“ strip”命令。您将文件包含调试信息,并用它来调试从客户那里获得的核心转储。

如果要在用户机器上打印人类可读的回溯记录,则需要分发带有(某些)调试信息的二进制文件。在glibc中查找“ backtrace()”函数。

请注意,即使您的二进制文件不包含调试信息,也会创建核心转储(如果ulimit设置正确)。

确保创建核心转储的最佳方法可能是在运行二进制文件之前,通过设置ulimit的html" target="_blank">脚本执行二进制文件。



 类似资料:
  • 我用wiringPiISR#得到了一个核心转储 Java运行时环境检测到一个致命错误:#Internal error(os_linux_zero.cpp:254),PID=6552,TID=1866855520致命错误:捕获未处理信号11

  • Linux 是一种开源电脑操作系统内核。它是一个用C语言写成,符合 POSIX 标准的类 Unix 操作系统。

  • 问题内容: 我的程序是用C ++编写的。使用-g3-O0-ggdb标志使用gcc编译。当它崩溃时,我想打开它的核心转储。它会创建核心转储文件,还是我需要做一些事情以在程序本身或在执行该文件的计算机上启用核心转储创建?该文件的创建位置以及名称是什么? 问题答案: 您需要设置。如果此参数的值为0,则不会创建coredump文件。这样做:并检查是否一切正确。当应用程序完成某些不适当的操作时,将创建cor

  • 问题内容: 运行C程序时,它显示 “((核心转储)”), 但是在当前路径下看不到任何文件。 我已经设置并验证了: 我也试图找到一个名为“ core”的文件,但是没有得到core dumped文件? 任何帮助,我的核心文件在哪里? 问题答案: 阅读/usr/src/linux/Documentation/sysctl/kernel.txt。 [/ proc / sys / kernel /] cor

  • 本章描述了你应该在 Linux 核心源程序的什么地方开始查看特定的核心功能。 本书不依赖‘ C ’语言的知识或要求你有 Linux 核心源程序才能理解 Linux 核心如何工作。而是说,练习查看核心源程序能够对于 Linux 操作系统有一个深入地理解。本章给出核心源程序的概览:它们如何组织,你应该从哪里开始查找特定的代码。 Where to Get The Linux Kernel Sources

  • .NET核心和ASP.NET核心到底有什么区别?