使用“尝试”来避免分段错误

时间:2015-01-14 18:49:01

标签: python segmentation-fault gtk3 pygobject

最近在我的一个程序中,我遇到了分段故障问题。我设法找到导致问题的那条线,但我找不到修复它的方法。

行:

self.window_player.add(self.vlc)

其中self.vlc是一个小部件,而self.window_player是在林间空地中创建的空Gtk.Window()

该行位于我的程序的__init__,所以实际上这个问题只在启动程序时发生。奇怪的是,错误只出现在10次中<1次(启动程序)

错误: Segmentation fault是我从终端

获得的唯一输出

所以我试过了:

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

问题是分段错误似乎不被try排除!

2 个答案:

答案 0 :(得分:3)

抱歉,您无法处理。段错误是由内存损坏,读取或写入超出拥有内存,双重释放和其他一些内容的边界引起的。

您可以在此找到一些导致段错误的问题示例:

https://gist.github.com/carlos-jenkins/8873932

操作系统会杀掉有问题的程序,你不能做很多事情。您唯一的解决方案是纠正根本问题。

您可以使用Valgrind工具运行程序,它可以让您准确找到问题所在:

http://valgrind.org/

在Ubuntu上,只需sudo apt-get install valgrind然后valgrind <program cmd>即可启动该程序。这种情况会慢很多,但大部分时间都会发现问题。

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

https://stackoverflow.com/a/10203062/439494

答案 1 :(得分:0)

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

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