Python 服务器“中止(核心转储)”

Posted

技术标签:

【中文标题】Python 服务器“中止(核心转储)”【英文标题】:Python server "Aborted (Core dumped)" 【发布时间】:2016-10-06 01:30:59 【问题描述】:

我使用 web.py 创建 Python Web 服务器。调用此服务器来解决线性规划问题,它使用库 CBC 来解决此问题。

每隔一段时间,服务器就会崩溃并显示如下所示的日志:

78.243.184.3:56271 - - [03/Jun/2016 04:35:54] "HTTP/1.1 GET /optimization" - 200 OK
Aborted (core dumped)

我相信“Aborted (core dumped)”是一个 C 错误,所以它来自 web.py 或 CBC。

有什么方法可以追溯错误的根源吗?

【问题讨论】:

也许你可以找到核心文件。 你知道怎么做吗? 取决于系统。可能是find / -name "core" -ls 工作。 这个命令给了我一长串核心路径。 检查 dmesg,您可能会发现更多信息。要调试 python 本身,您需要使用调试符号编译或安装 python 【参考方案1】:

核心转储的最常见原因是访问您无法访问的内存地址(不属于您的程序的内存)。操作系统使用称为 SegFault 或 BusError 的中断来中断程序,具体取决于程序如何尝试访问无效的内存地址。然后程序将被内核强制关闭。如果内核已配置为创建核心转储(内存和程序堆栈的转储),则会将其保存到磁盘。如另一个答案中所述,您可以将核心转储加载到 GDB 或其他调试器中,并显示程序在崩溃时正在做什么。这可能会给您手头的问题,也可能不会。通常,即使是经验丰富的程序员也很难使用这些工具,因此请注意。如果你想尝试使用 GDB,试试这个:

$ gdb /path/to/crashing/program/binary /path/to/core

(gdb) bt

“bt”将显示“回溯”,也称为 StackTraces,对于程序员追踪错误很有用。

如果您能够重现该错误,那么您可能会幸运地向相关程序的创建者提交详细的错误报告。即使是我作为一名高级软件开发人员,也会时不时地走这条路。 :-)

【讨论】:

【参考方案2】:

核心转储是由 Web 服务器中的本机代码中的错误引起的。这些天 Python 非常可靠,因此根据我的经验,此类故障几乎总是由 C 扩展中的错误引起的。

因此你有 3 个问题。

    您需要找到核心转储文件。这通常位于转储进程的当前工作目录中。不过有configation options that can change this。

    您需要调试失败的调用堆栈。这在 *** 中有介绍 - 请参阅 How to analyze a program's core dump file with gdb?

    您可能需要将 Python 解释器堆栈与您正在运行的 Python 代码相关联。为此,您需要为 gdb 安装 Python 调试符号和 Python 扩展。 Python wiki 对如何做到这一点有很好的建议here。

【讨论】:

感谢您的回答,我明天会检查 gdb。我有几个问题: 1. 你怎么知道问题来自网络服务器而不是 CBC? 2.您是否承认问题来自库 web.py 而不是我的代码? 3. server.py目录下没有找到core dump文件。在哪里可以找到 web.py 的配置选项? 4、如果在web.py的代码中,如何调试? 5. 您认为最好的选择是将 web.py 更改为另一个库吗?感谢您的帮助! 我真的不能告诉你答案。您有一个核心转储并在其上运行 gdb 会告诉您错误在哪里。这就是存在核心文件的原因——用于事后分析。为了从任何人那里获得更多帮助,您需要使用我描述的技术提取调用堆栈并用它更新您的问题。 但该错误每隔一段时间就会出现一次(每 2 或 3 周一次),我无法重现它...... 我真的很抱歉,但我无能为力了。核心文件的存在正是为了诊断这些类型的故障。找到核心文件,进行堆栈跟踪,然后分享您的发现(如果还没有为您确定错误)。所有这些以前的转储都将生成文件。您可以使用其中任何一个。

以上是关于Python 服务器“中止(核心转储)”的主要内容,如果未能解决你的问题,请参考以下文章

Realloc 无效指针。中止(核心转储)

在递归合并排序期间中止(核心转储)

信号:中止(核心转储),从向量生成两个和对

随机错误核心转储:`./a.out' 中的错误:free():下一个大小无效(快速):0x00000000010e8d70 *** 中止(核心转储)

在 C 中使用 free() 时出现无效(中止)核心转储错误

删除类中的动态二维数组时,C++ 不断出现“中止(核心转储)”