2016-12-15 6 views
3

C 확장이 포함 된 타사 파이썬 라이브러리를 사용하고 있습니다. 내가 항상 부르는 한 가지 기능이 있습니다. 이 함수를 특수 인수 (유효해야 함)로 호출하면 segfaults가 발생합니다.파이썬 코드에서 C 확장 세그먼트 오류를 ​​처리하는 방법은 무엇입니까?

버그 보고서를 제출할 수 없다고 가정 해 봅니다 (해결이 오래 걸립니다).

거기에 파이썬과 같은 문제를 처리 할 수있는 방법이 있습니까?

나는 코드를 제공 할 수 있지만 문제는

+0

확장 프로그램의 코드 또는 디버그 빌드에 액세스 할 수 없다면 실제로 할 수있는 일이별로 없습니다. 당신이해야 할 일은 충돌이있는 [** Minimal **, Complete, Verifiable Example] (http://stackoverflow.com/help/mcve)을 생성하고 버그보고에서 그것을 사용하여 확장의 저자. –

+0

seg 오류를 일으키는 것으로 알려진 값을 호출하기 전에 매개 변수 값을 확인할 수 있습니다. –

+0

@PaulOgilvie - 유감스럽게도 오류의 원인이 될 값을 예측할 수 없습니다. 나는 20M 문자열을 처리 중이며이 문제를 일으키는 하나의 문자열을 발견했습니다. – mnowotka

답변

4

번호는 세그먼트 오류가 C 코드가 잘못된 메모리 액세스를 수행 한 의미 ... 훨씬 변경되지 않습니다 그래서 일반적이다; 실패한 사람이 유일한 사람이라는 보장은 없습니다. 즉, 파이썬 런타임 및 메모리 할당 구조를 포함하여 해당 프로세스의 가상 메모리 공간 내에서 쓸 수있는 것을 신뢰할 수 없다는 것을 의미합니다. 게다가 실패한 전화가 처음으로 잘못한 것이 아니라는 적절한 기회가 있습니다. 그것은 다른 어떤 것이 이미 그 국가를 부패 시켰기 때문에 그렇게했을 것입니다. 이것이 메모리 액세스 버그를 디버그하기 어려운 이유입니다. 파이썬은 경계를 이해하는 데이터 유형에 의존하기 때문에 이러한 오류가 적습니다. ctypes 그것은 마찬가지로 연약하고 위험 할 수 있습니다.

1

신호 모듈을 사용하여 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) 

, 당신은 아마 그냥 (거의 세그먼트 폴트를 걱정하지 마십시오 무시에서 어쨌든 제외하고 적절하게 처리하는 방법을 모른다는 OS가 안 년대 영역으로 메모리 액세스를 방지 것을 의미한다 액세스 된 것).