使用 "try" 来避免分段错误
using "try" to avoiding a segmentation fault
最近在我的一个程序中遇到了分段错误问题。我设法找到了导致问题的那一行,但我还没有找到解决它的方法。
行:
self.window_player.add(self.vlc)
其中 self.vlc
是一个小部件,self.window_player
是在 glade 中创建的空 Gtk.Window()
。
该行在我程序的__init__
处,所以实际上这个问题只在启动程序时发生。奇怪的是 错误只出现 10 次中的 1 次(启动程序)
错误:
Segmentation fault
是我从终端获得的唯一输出
所以我尝试了:
while True:
try:
self.window_player.add(self.vlc)
break
except:
print "segmentation"
问题是 try
!
似乎没有排除分段错误
对不起,你受不了了。段错误是由内存损坏、读取或写入超出拥有内存的边界、双重释放和其他一些原因引起的。
您可以在此处找到一些导致段错误的问题示例:
https://gist.github.com/carlos-jenkins/8873932
操作系统会杀死有问题的程序,您对此无能为力。您唯一的解决办法是纠正根本问题。
您可以 运行 使用工具 Valgrind 的程序,它可以让您准确找到问题所在:
在 Ubuntu 上,仅 sudo apt-get install valgrind
然后 valgrind <program cmd>
将启动程序。这个offcourse会慢很多,但大多数时候会发现问题。
旁注:从技术上讲,您可以通过为该信号注册回调来捕获 SIGSEV 信号。但你不应该。有关详细信息,请参阅此答案:
您可以使用您指定的函数处理信号SIGSEGV
,如下
from signal import signal, SIGSEGV
def handler(sigNum, frame):
print("handle signal", sigNum)
signal(SIGSEGV, handler)
最近在我的一个程序中遇到了分段错误问题。我设法找到了导致问题的那一行,但我还没有找到解决它的方法。
行:
self.window_player.add(self.vlc)
其中 self.vlc
是一个小部件,self.window_player
是在 glade 中创建的空 Gtk.Window()
。
该行在我程序的__init__
处,所以实际上这个问题只在启动程序时发生。奇怪的是 错误只出现 10 次中的 1 次(启动程序)
错误:
Segmentation fault
是我从终端获得的唯一输出
所以我尝试了:
while True:
try:
self.window_player.add(self.vlc)
break
except:
print "segmentation"
问题是 try
!
对不起,你受不了了。段错误是由内存损坏、读取或写入超出拥有内存的边界、双重释放和其他一些原因引起的。
您可以在此处找到一些导致段错误的问题示例:
https://gist.github.com/carlos-jenkins/8873932
操作系统会杀死有问题的程序,您对此无能为力。您唯一的解决办法是纠正根本问题。
您可以 运行 使用工具 Valgrind 的程序,它可以让您准确找到问题所在:
在 Ubuntu 上,仅 sudo apt-get install valgrind
然后 valgrind <program cmd>
将启动程序。这个offcourse会慢很多,但大多数时候会发现问题。
旁注:从技术上讲,您可以通过为该信号注册回调来捕获 SIGSEV 信号。但你不应该。有关详细信息,请参阅此答案:
您可以使用您指定的函数处理信号SIGSEGV
,如下
from signal import signal, SIGSEGV
def handler(sigNum, frame):
print("handle signal", sigNum)
signal(SIGSEGV, handler)