Linux服务崩溃
我有一个linux服务(c++,基本上有很多可加载的模块。所以文件在运行时拾取),它有时会崩溃。。。我想了解这次撞车事件并进行调查,但目前我还不知道如何继续。因此,我想问你以下问题:Linux服务崩溃,linux,crash,gdb,core,Linux,Crash,Gdb,Core,我有一个linux服务(c++,基本上有很多可加载的模块。所以文件在运行时拾取),它有时会崩溃。。。我想了解这次撞车事件并进行调查,但目前我还不知道如何继续。因此,我想问你以下问题: 如果linux服务崩溃,“核心”文件在哪里创建?我已经设置了ulimit-c102400,这应该足够了,但是我在任何地方都找不到核心文件:( 有跟踪服务的linux日志吗?服务自己的日志显然没有告诉我我现在就要崩溃了 可能是其中一个模块正在崩溃…但是我无法判断是哪一个。我甚至无法判断加载了哪些模块。您知道如何在li
gdb-a
连接到正在运行的进程(当然需要调试构建)
2) 确保ulimit是您认为的(将ulimit从shell脚本输出到一个文件)
它会在启动服务之前运行您的服务)。通常需要在/etc/profile文件中设置ulimit;将其ulimit-c0
设置为无限
3) 使用Find/-name\*core\*-print
或类似工具查找核心文件
4) 我认为,当您附加到进程时,gdb将为您提供加载的共享对象(.so)的列表
5) 向您的服务添加更多日志记录
祝你好运 0)获得一个尽可能接近生产的暂存环境。重现问题。
1) 您可以使用gdb-a
连接到正在运行的进程(当然需要调试构建)
2) 确保ulimit是您认为的(将ulimit从shell脚本输出到一个文件)
它会在启动服务之前运行您的服务)。通常需要在/etc/profile文件中设置ulimit;将其ulimit-c0
设置为无限
3) 使用Find/-name\*core\*-print
或类似工具查找核心文件
4) 我认为,当您附加到进程时,gdb将为您提供加载的共享对象(.so)的列表
5) 向您的服务添加更多日志记录
祝你好运 您的首要任务应该是获取核心文件。看看是否适用 其次,您应该在Valgrind下运行服务器,并修复它发现的任何错误
在GDB下运行时再现崩溃(正如MK所建议的那样)是可能的,但有点不可能:当您查找bug时,bug往往会隐藏起来,调试器可能会影响计时(特别是当您的服务器是多线程的时候)。您的首要任务应该是获取核心文件。看看是否适用 其次,您应该在Valgrind下运行服务器,并修复它发现的任何错误
在GDB下运行时再现崩溃(正如MK所建议的那样)是可能的,但有点不可能:当您查找bug时,bug往往会隐藏起来,调试器可能会影响计时(特别是在您的服务器是多线程的情况下)。在Linux下,切换用户ID的进程会出于安全原因禁用其核心文件。这是因为他们经常做一些事情,比如读取特权文件(think/etc/shadow),核心文件可能包含敏感信息 要在已切换用户ID的进程上启用核心转储,可以将prctl与PR_SET_DUMPABLE一起使用
核心文件通常转储在当前工作目录中-如果当前用户无法写入,则会失败。确保进程的当前工作目录是可写的。在Linux下,切换用户ID的进程会出于安全原因禁用其核心文件。这是因为他们经常做一些事情,比如读取特权文件(think/etc/shadow),核心文件可能包含敏感信息 要在已切换用户ID的进程上启用核心转储,可以将prctl与PR_SET_DUMPABLE一起使用
核心文件通常转储在当前工作目录中-如果当前用户无法写入,则会失败。确保进程的当前工作目录是可写的。谢谢:)我想我无法将调试器附加到它。如果服务宕机,它会自动重新启动,我将不得不进行一些斗争,以允许我在该机器上进行调试(即保持服务宕机)。我将更新ulimit:)实际上,您不需要调试构建。另外,
gdb--pid
nice@sehe嗯,是的,你可以附加w/o调试构建,甚至在它崩溃时获得堆栈跟踪。@MK:或者。。。查看加载了哪些模块(info shared
,IIRC)谢谢:)我想我无法将调试器附加到它。如果服务宕机,它会自动重新启动,我将不得不进行一些斗争,以允许我在该机器上进行调试(即保持服务宕机)。我将更新ulimit:)实际上,您不需要调试构建。另外,gdb--pid
nice@sehe嗯,是的,你可以附加w/o调试构建,甚至在它崩溃时获得堆栈跟踪。@MK:或者。。。查看加载的模块(信息共享
,IIRC)查看strace。它将能够告诉您正在加载哪些模块。最简单的方法是集成到init脚本并重定向到日志文件。请查看strace。它将能够告诉您正在加载哪些模块。最简单的方法是集成到init脚本中并重定向到日志文件