【问题标题】:using "try" to avoiding a segmentation fault使用“尝试”来避免分段错误
【发布时间】:2015-01-14 18:49:01
【问题描述】:

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

行:

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! 似乎没有排除分段错误!

【问题讨论】:

  • 简而言之,您无法使用 Python 异常机制处理段错误。干净的解决方案是找到崩溃的底部并修复它。
  • @NPE 这就是我害怕的:s,目前我没有解决问题的技能:/
  • 不过你应该具备编写错误报告的技能!

标签: python segmentation-fault gtk3 pygobject


【解决方案1】:

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

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

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

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

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

http://valgrind.org/

在 Ubuntu 上,只需 sudo apt-get install valgrindvalgrind <program cmd> 即可启动该程序。这种偏离会慢很多,但大多数时候会发现问题。

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

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

【讨论】:

    【解决方案2】:

    你可以用你指定的函数来处理信号SIGSEGV,如下

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

    【讨论】:

    • 最佳答案表明这通常很危险,我想对此进行扩展(对于任何读者)。信号在主线程中被捕获,因此如果有多个线程或内核,代码可能会挂起等待违规线程并找到罪魁祸首并非易事,因为它可能涉及内存泄漏等,因此修复源更好。注意。以这种方式捕获 SIGINT(有人要求它死)完全没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2011-05-05
    • 2021-03-31
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多