Возможно ли отловить ошибку сегментации? - PullRequest
0 голосов
/ 29 октября 2018

Мое приложение зависит от 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 и двигаться дальше.

Вопрос : Могу ли я каким-то образом отловить эту ошибку сегментации в моей зависимости и восстановить ее?

Это было несколько ранее задано в Cagmentation Fault Catch , но единственный ответ неверен (предлагается отловить его с помощью signal.signal, но в документации ясно сказано, что перехват синхронный такие сигналы, как SIGSEGV, не имеют смысла в его использовании. В той же документации указывается обработчик ошибок , но он не может реально перехватить сигнал: он просто выдает лучшие сообщения об ошибках в случае, если это произойдет).

Это оставляет вопрос о том, насколько этот вопрос уникален, а не является его дубликатом: я несколько менее ограничен: я вовсе не собираюсь решать проблему: я просто хочу игнорировать ее и двигаться дальше. Любые пункты о том, как на самом деле избежать сегфоута в ghostscript, также будут очень хорошо приняты.

...