Python 使用;试一试;避免分段错误

Python 使用;试一试;避免分段错误,python,segmentation-fault,gtk3,pygobject,Python,Segmentation Fault,Gtk3,Pygobject,最近在我的一个程序中,我遇到了一个分段错误问题。我设法找到了导致问题的原因,但我还没有找到解决方法 该行: self.window_player.add(self.vlc) 其中,self.vlc是一个小部件,self.window\u player是一个在glade中创建的空Gtk.window() 该行位于我的程序的\uuuu init\uuuu处,因此实际上,只有在启动程序时才会发生此问题。奇怪的事实是,错误只出现了10次中的1次(启动程序) 错误: 分段故障是我从终端获得的唯一输出 所

最近在我的一个程序中,我遇到了一个分段错误问题。我设法找到了导致问题的原因,但我还没有找到解决方法

该行:

self.window_player.add(self.vlc)
其中,
self.vlc
是一个小部件,
self.window\u player
是一个在glade中创建的空
Gtk.window()

该行位于我的程序的
\uuuu init\uuuu
处,因此实际上,只有在启动程序时才会发生此问题。奇怪的事实是,错误只出现了10次中的1次(启动程序)

错误:
分段故障
是我从终端获得的唯一输出

所以我试着:

while True:
    try:
        self.window_player.add(self.vlc)
        break
    except:
        print "segmentation"

问题在于,
try
似乎不排除分段错误

对不起,你处理不了。segfault是由内存损坏、超出自有内存边界的读取或写入、双重释放和其他一些原因造成的

您可以在此处找到一些导致segfault的问题示例:

操作系统会杀死这个有问题的程序,你对此无能为力。您唯一的解决方案是纠正根本问题

您可以使用Valgrind工具运行程序,它将允许您准确查找问题所在:

在Ubuntu上,只需
sudo apt获得install valgrind
,然后
valgrind
将启动该程序。这当然会慢得多,但在大多数情况下会发现问题

旁注:从技术上讲,您可以通过注册该信号的回调来捕获SIGSEV信号。但你不应该。有关更多信息,请参阅此答案:


您可以使用指定的功能处理信号
SIGSEGV
,如下所示

from signal import signal, SIGSEGV
def handler( sigNum, frame ):
  print( "handle signal", sigNum )
signal(SIGSEGV, handler)

简而言之,您无法使用Python异常机制处理segfault。最干净的解决办法是找到崩溃的根源并加以修复。@NPE这正是我所担心的:s,目前我没有解决问题的技能:/n不过你应该有编写错误报告的技能!最上面的答案是,这通常是危险的,我想(对任何读者)对此做进一步的阐述。信号在主线程中被捕获,因此如果有多个线程或内核,代码很可能只是挂起等待出现问题的线程,并且发现问题的根源并不简单,因为它可能涉及内存泄漏等。因此修复源代码更好。注意。用这种方式抓住SIGINT(有人让它死)是完全好的。