【问题标题】:Force a core to dump from an active, normally running program on FreeBSD强制核心从 FreeBSD 上一个活动的、正常运行的程序中转储
【发布时间】:2011-09-27 12:28:17
【问题描述】:

我正在为 FreeBSD 上的服务器编写错误处理代码。对于极其严重的错误,我想通过立即终止来避免数据损坏。这很简单,exit(3)。在我退出之前,我输出了引导我到达那里的相关变量。但是,理想情况下,此终止将伴随.core,以便我可以全面调查是什么让我陷入了这种灾难性(并且可能难以重现)状态。

我怎样才能强迫这种情况发生?

【问题讨论】:

    标签: freebsd coredump


    【解决方案1】:

    kill -QUIT process_id 将导致正在运行的进程中进行核心转储(假设资源限制允许)。

    或查看man 3 abort 导致程序自行转储。

    新增:在交互式 shell 中,可以使用退出键中止正在运行的程序,通常是 Ctrl+\,发送 SIGQUIT 就像更常见的 Ctrl+C 发送 SIGINT 一样。这与kill -QUIT… 相同,如果您在控制终端上,则更容易输入。如果您的默认退出键不同,请参阅 man 1 stty

    【讨论】:

    • 你也可以使用 kill -3 [pid] - 相同的交易,更少的输入。您可以在手册页上看到其他 kill 标志:man kill。
    • 嗯,我想从流程本身做;所以abort(3) 似乎没问题,但从这里的一些测试来看,在检查结果.core 时,我似乎无法访问任何符号。我可以得到很好的回溯,但是如果我尝试打印我的任何变量,它们都找不到。这是abort(3) 所期望的还是我在做一些愚蠢的事情? gcc -g -O0 test.c -o test 然后./test 然后gdb ./test test.core
    • 我认为您的问题在于使用 gdb:您需要从 where 回溯中选择一个框架来为变量名提供范围。见sourceware.org/gdb/current/onlinedocs/gdb/…
    【解决方案2】:

    This帮了我! kill -11 总是为我工作。 11 是 SIGSEGV(无效的内存引用)

    【讨论】:

      【解决方案3】:

      您可能还想看看 gcore(1) (http://man.freebsd.org/gcore)。

      【讨论】:

        【解决方案4】:

        在 sles12.. 下面的代码对我有用:

        kill -11
        

        之前的建议没有做任何事情。

        【讨论】:

          【解决方案5】:

          你也可以试试kill -BUS <pid> 这对我有用(尽管在 ubuntu 20.04 上)

          【讨论】:

            猜你喜欢
            • 2017-02-18
            • 1970-01-01
            • 2015-02-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多