Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux服务崩溃_Linux_Crash_Gdb_Core - Fatal编程技术网

Linux服务崩溃

Linux服务崩溃,linux,crash,gdb,core,Linux,Crash,Gdb,Core,我有一个linux服务(c++,基本上有很多可加载的模块。所以文件在运行时拾取),它有时会崩溃。。。我想了解这次撞车事件并进行调查,但目前我还不知道如何继续。因此,我想问你以下问题: 如果linux服务崩溃,“核心”文件在哪里创建?我已经设置了ulimit-c102400,这应该足够了,但是我在任何地方都找不到核心文件:( 有跟踪服务的linux日志吗?服务自己的日志显然没有告诉我我现在就要崩溃了 可能是其中一个模块正在崩溃…但是我无法判断是哪一个。我甚至无法判断加载了哪些模块。您知道如何在li

我有一个linux服务(c++,基本上有很多可加载的模块。所以文件在运行时拾取),它有时会崩溃。。。我想了解这次撞车事件并进行调查,但目前我还不知道如何继续。因此,我想问你以下问题:

  • 如果linux服务崩溃,“核心”文件在哪里创建?我已经设置了ulimit-c102400,这应该足够了,但是我在任何地方都找不到核心文件:(
  • 有跟踪服务的linux日志吗?服务自己的日志显然没有告诉我我现在就要崩溃了
  • 可能是其中一个模块正在崩溃…但是我无法判断是哪一个。我甚至无法判断加载了哪些模块。您知道如何在linux中显示服务正在使用哪些模块吗
  • 您在调试linux服务时可能有其他提示吗
  • 谢谢 f-

    0)获得一个尽可能接近生产的暂存环境。重现问题。

    1) 您可以使用
    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脚本中并重定向到日志文件