Linux服务崩溃

时间:2011-10-18 12:30:13

标签: linux crash gdb core

我有一个linux服务(c ++,有很多可加载的模块,基本上是.so文件在运行时被选中),它们不时崩溃......我想在这次崩溃后面进行调查并对其进行调查,但是那一刻我不知道如何继续。所以,我想问你以下几点:

  1. 如果linux服务崩溃,那么创建的“核心”文件在哪里?我已经设置了ulimit -c 102400,这应该足够了,但我无法在任何地方找到核心文件:(。
  2. 是否有跟踪服务的linux日志?服务自己的日志显然没有告诉我,我现在要崩溃......
  3. 可能是其中一个模块崩溃了...但是我不知道哪个模块崩溃了。我甚至无法分辨哪些模块已加载。你知道如何在linux中显示服务使用的模块吗?
  4. 调试linux服务时可能还有其他提示吗?
  5. 由于 的F -

3 个答案:

答案 0 :(得分:2)

0)获得尽可能接近模仿生产的临时环境。那里再现问题。

1)您可以使用gdb -a附加到正在运行的进程(当然需要调试版本)

2)确保ulimit是您认为的(从shell脚本输出ulimit到文件) 它在启动之前运行您的服务)。通常你需要在/ etc / profile文件中设置ulimit;设置ulimit -c 0无限

3)使用find / -name \*core\* -print或类似的

查找核心文件

4)我认为gdb会在您附加到进程时为您提供已加载的共享对象(.so)的列表。

5)向您的服务添加更多日志记录

祝你好运!

答案 1 :(得分:2)

在Linux下,为了安全起见,切换用户ID的进程会禁用其核心文件。这是因为他们经常做一些事情,比如读取特权文件(想想/ etc / shadow),核心文件可能包含敏感信息。

要在已切换用户ID的进程上启用核心转储,可以将prctl与PR_SET_DUMPABLE一起使用。

核心文件通常被转储到当前工作目录中 - 如果当前用户无法写入,则它将失败。确保进程的当前工作目录是可写的。

答案 2 :(得分:0)

您的第一笔业务应该是获取核心文件。看看this answer是否适用。

其次,您应该在Valgrind下运行您的服务器,并修复它找到的任何错误。

在GDB下运行时(如MK建议的那样)重现崩溃是可能的,但有点不明显:当你寻找它们时,bug往往会隐藏,而调试器可能会影响计时(特别是如果你的服务器是多线程的)。