我的代码中有一些函数会随机导致SegmentationFault
错误。我通过启用faulthandler
来识别它们。我有点卡住了,不知道如何可靠地消除这个问题
我在考虑一些变通办法。由于函数是随机崩溃的,我可能会在失败后重试它们。问题是没有办法从SegmentationFault
崩溃中恢复。
目前我最好的想法是重写这些函数,并通过子进程运行它们。这个解决方案将帮助我,使崩溃的函数不会使整个应用程序崩溃,并且可以重试
有些功能非常小,而且经常执行,因此它会显著降低我的应用程序的速度。是否有任何方法可以在单独的上下文中执行函数,速度比子进程快,在发生SEGFULT时不会使整个程序崩溃
tl;dr:您可以使用
signal
、setjmp
、longjmp
编写C代码您有多个选择来处理
SIGSEGV
:subprocess
库发送子进程multiprocessing
库进行分叉子流程和fork已经被描述过了,所以我将重点讨论信号处理程序的观点
写入信号处理器
从内核的角度来看,
SIGSEGV
和任何其他信号(如SIGUSR1
、SIGQUIT
、SIGINT
)之间没有区别。 事实上,一些库(如JVM)使用它们作为通信方式不幸的是,您无法从python代码重写信号处理程序。见doc:
这意味着,错误管理应该在C代码中完成
您可以编写自定义信号处理程序,并使用
setjmp
和longjmp
保存和恢复堆栈上下文例如,下面是一个简单的CPython C扩展:
和呼叫者应用程序:
这将产生以下输出:
利弊
优点:
SIGSEGV
捕捉为常规信号。错误处理会很快李>缺点:
请记住,分段错误是一个非常严重的错误! 始终尝试先修复它,而不是隐藏它
很少有链接和参考:
我偶尔会遇到一些不可靠的C扩展抛出segfaults,由于我无法修复这些错误,所以我所做的就是创建一个decorator,在单独的进程中运行包装函数。这样就可以阻止SEGFULTS终止主进程
大概是这样的: https://gist.github.com/joezuntz/e7e7764e5b591ed519cfd488e20311f1
我的有点简单,它帮了我的忙。此外,它还允许您在出现问题时选择超时和默认返回值:
所以你会像这样使用它:
相关问题 更多 >
编程相关推荐