2016-12-15 46 views
3

我使用C擴展第三方python庫。我一直都在打電話。當我用一些特殊的參數(這應該是有效的)調用這個函數時,它會發生段錯誤。任何方式來處理Python代碼中的C擴展分段錯誤?

假設的,我不能發送錯誤報告的那一刻(會採取長期解決)。

它有沒有辦法跟Python來處理這些問題呢?

我可以提供的代碼,但問題是,這樣一般不會有太大改變......

+0

如果您無法訪問擴展的代碼或調試版本,那麼您自己實際上可以做的不多。你應該嘗試做的是創建一個[**最小**,完整和可驗證的例子](http://stackoverflow.com/help/mcve),它會導致崩潰,並將它用在一個錯誤報告中該擴展的作者。 –

+0

您可以在調用已知會導致seg故障的值之前檢查參數值。 –

+0

@PaulOgilvie - 不能預測哪個值會導致錯誤。我正在處理20M字符串,我發現一個導致此問題的字符串。 – mnowotka

回答

4

號段故障,意味着C代碼進行無效的內存訪問;不能保證失敗的人是唯一出錯的人。這意味着你不能相信該進程的虛擬內存空間中可寫的任何東西,包括Python運行時和內存分配結構。此外,失敗的電話並不是第一個做錯事的人,它可能是因爲其他東西已經損壞了它的狀態。這就是爲什麼內存訪問錯誤難以調試。 Python具有較少的這種性質的錯誤,因爲它依賴於理解其邊界的數據類型,儘管如果你使用例如數據類型它可以是脆弱和危險的。

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) 

而且,你可能不知道應該如何妥善反正除了剛剛忽略它(不用擔心內存設計缺陷相當多的處理是指操作系統防止區域內的內存訪問,這不是應該已被訪問)。