我有一个linux服务(c ++,有很多可加载的模块,基本上是.so文件在运行时被选中),它们不时崩溃......我想在这次崩溃后面进行调查并对其进行调查,但是那一刻我不知道如何继续。所以,我想问你以下几点:
由于 的F -
答案 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往往会隐藏,而调试器可能会影响计时(特别是如果你的服务器是多线程的)。