有没有办法从Python代码中处理C扩展分段错误?

有没有办法从Python代码中处理C扩展分段错误?,python,c,python-c-extension,Python,C,Python C Extension,我正在使用带有C扩展的第三方python库。有一个函数我一直在调用。当我用一些特殊的参数(应该是有效的)调用这个函数时,它会出错 现在让我们假设我无法提交错误报告(需要很长时间才能解决) 有没有办法用Python处理这样的问题 我可以提供代码,但问题太笼统了,不会有太大变化…否。分段错误意味着C代码执行了无效的内存访问;无法保证失败的是唯一一个出错的。这意味着您不能信任该进程虚拟内存空间中的任何可写内容,包括Python运行时和内存分配结构。此外,失败的电话很有可能不是第一个做错事的人;它这么做

我正在使用带有C扩展的第三方python库。有一个函数我一直在调用。当我用一些特殊的参数(应该是有效的)调用这个函数时,它会出错

现在让我们假设我无法提交错误报告(需要很长时间才能解决)

有没有办法用Python处理这样的问题


我可以提供代码,但问题太笼统了,不会有太大变化…

否。分段错误意味着C代码执行了无效的内存访问;无法保证失败的是唯一一个出错的。这意味着您不能信任该进程虚拟内存空间中的任何可写内容,包括Python运行时和内存分配结构。此外,失败的电话很有可能不是第一个做错事的人;它这么做可能是因为其他东西已经破坏了它的状态。这就是为什么很难调试内存访问错误。Python很少有这种性质的错误,因为它依赖于能够理解其边界的数据类型,尽管如果您使用例如ctypes之类的方法来突破这个外壳,它可能同样脆弱和危险

您可以使用信号模块为SIGSEGV创建处理程序。然后使用os.kill停止有问题的进程。但是,您可能必须从另一个进程调用该函数

import os
import signal

def sig_handler(signum, frame):
    pass # handle the segmentation fault here
signal.signal(signal.SIGSEGV, sig_handler)

os.kill(os.getpid(), signal.SIGSEGV)

此外,除了忽略它之外,您可能不知道应该如何正确处理它(不要担心SEGFULT实际上意味着操作系统阻止了对不应该访问的区域的内存访问)。

如果您无法访问代码或扩展的调试版本,你自己能做的真的不多。您应该尝试创建一个发生故障的参数,并将其用于向扩展作者提交的错误报告中。您可以在调用已知会导致seg错误的值之前检查参数值。@PaulOgilvie-很遗憾,您无法预测哪个值会导致错误。我正在处理2000万个字符串,发现了一个导致此问题的字符串。除非您知道是什么输入触发了错误(并且有一个合理的原因),否则为什么要信任它的输出而不崩溃呢?无缘无故爆炸的黑匣子是不可靠的。至少,您可以对未失败的20M随机样本进行检查,并确认其对这些样本正常工作。另请参阅:有关要调试分段错误的具体情况。