是否可以捕获分段错误?

时间:2018-10-29 18:26:44

标签: python python-3.x segmentation-fault ghostscript

我的应用程序依靠ghostscript来将一些pdf文件转换为文档每一页的一系列图像。这是一个简化的版本:

import locale

from ghostscript import Ghostscript as gs
from ghostscript import cleanup
from cv2 import imread, IMREAD_GRAYSCALE as GRAY
from multiprocessing import cpu_count

args = [
  "",
  "-q", "-r300", "-dNOPAUSE",
  "-sDEVICE=pgmraw",
  "-sOutputFile=%d.pgm",
  "-dNumRenderingThreads=" + str(cpu_count()),
  "-f", "_.pdf" #filename will always be "_.pdf"
]
encoding = locale.getpreferredencoding()
args = [a.encode(encoding) for a in args]

def pdftoimarray():
    cleanup()
    gs(*args)
    imarray = []
    for filename in os.listdir():
        imarray.append(imread(filename, GRAY))
    return imarray

(我最后有意删除了文件系统的清理:这个问题并不重要)

问题是,我真的不相信这些文件的来源,其中一些可能有问题。运行一些测试,我发现其中一些不良文档实际上导致了ghostscript segfault的出现,从而使整个应用程序崩溃。

通常,segfault是一个非常严重的事件,我们无法真正从中恢复,因此,我怀疑是否确实有可能捕获它。但是以我为例,它并没有那么严重:假设我的程序仍然处于有效状态,我可以将该文档标记为 bad 并继续。

问题:我可以以某种方式将分段错误捕获到我的依赖项中并从中恢复吗?

以前在Segmentation Fault Catch中曾对此提出过一些疑问,但是唯一的答案是错误的(它建议将其捕获在signal.signal中,但是documentation明确指出捕获诸如SIGSEGV之类的同步信号使用它毫无意义。相同的文档指向faulthandler,但它并不能真正捕获信号:它可以提供更好的错误消息,以防万一。)

剩下的问题是这个问题如何唯一,而不是重复:我的限制有所减少:我根本不想处理这个问题:我只是想忽略它,继续前进。首先避免真正在ghostscript中出现段错误的任何观点也将受到欢迎。

0 个答案:

没有答案