我有一个 linux 服务(c++,有很多可加载模块,基本上是在运行时获取的 .so 文件),它时不时会崩溃……我想深入了解这次崩溃并进行调查,但是在此刻我不知道如何进行。所以,我想问你以下问题:
- 如果 linux 服务崩溃,“核心”文件在哪里创建?我已经设置了 ulimit -c 102400,这应该足够了,但是我无法在任何地方找到核心文件:(。
- 是否有任何跟踪服务的 Linux 日志?服务自己的日志显然没有告诉我我现在要崩溃了......
- 可能是其中一个模块崩溃了……但我不知道是哪一个。我什至不知道加载了哪些模块。您知道如何在 Linux 中显示服务正在使用哪些模块吗?
- 在调试 Linux 服务时您可能有任何其他提示?
谢谢 f-
最佳答案
在 Linux 下,出于安全原因,切换用户 ID 的进程会禁用其核心文件。这是因为他们经常做一些事情,比如读取特权文件(想想/etc/shadow)和核心文件可能包含敏感信息。
要在已切换用户 ID 的进程上启用核心转储,您可以将 prctl 与 PR_SET_DUMPABLE 结合使用。
核心文件通常转储到当前工作目录中——如果当前用户不可写,那么它将失败。确保进程的当前工作目录是可写的。
关于Linux 服务崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7807227/