Python 分段错误,../sysdeps/unix/sysv/linux/raise.c: 没有那个文件或目录

Python Segmentation Fault, ../sysdeps/unix/sysv/linux/raise.c: No such file or directory

我使用 PyInstaller 创建了我的 GUI 应用程序的单个文件可执行文件。一切看起来都很好,可执行文件已创建并启动。首先,登录页面正确显示,但在输入用户名和密码后程序崩溃。我尝试使用 gdb 进行调试,结果如下:

Program received signal SIGSEGV, Segmentation fault.
raise (sig=<optimized out>) at ../sysdeps/unix/sysv/linux/raise.c:50
50  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  raise (sig=<optimized out>) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x000055555555a213 in ?? ()
#2  0x000055555555815d in ?? ()
#3  0x00007ffff7da10b3 in __libc_start_main (main=0x5555555564d0, argc=1, 
    argv=0x7fffffffdec8, init=<optimized out>, fini=<optimized out>, 
    rtld_fini=<optimized out>, stack_end=0x7fffffffdeb8)
    at ../csu/libc-start.c:308
#4  0x000055555555650a in ?? ()

谁能解释一下这是什么意思以及如何解决?

登录页面代码:

import json
import wx
from pubsub import pub


class LoginPage(wx.Dialog):
    def __init__(self):
        """Constructor"""
        wx.Dialog.__init__(self, None, title="Login", size=(750, 750), style=wx.DEFAULT_DIALOG_STYLE)
        self.password_shown = False

        # username
        username_sizer = wx.BoxSizer(wx.HORIZONTAL)

        username_lbl = wx.StaticText(self, label="Username:")
        username_sizer.Add(username_lbl, 1, wx.ALL | wx.CENTER, 5)
        self.username_txt = wx.TextCtrl(self)
        username_sizer.Add(self.username_txt, 3, wx.ALL | wx.EXPAND, 5)

        # pass info
        pass_sizer = wx.BoxSizer(wx.HORIZONTAL)

        p_lbl = wx.StaticText(self, label="Password:")
        pass_sizer.Add(p_lbl, 1, wx.ALL | wx.CENTER, 5)
        self.pass_txt = wx.TextCtrl(self, style=wx.TE_PASSWORD | wx.TE_PROCESS_ENTER)
        pass_sizer.Add(self.pass_txt, 3, wx.ALL | wx.EXPAND, 5)
        self.text_no_password = wx.TextCtrl(self)
        self.text_no_password.Hide()
        pass_sizer.Add(self.text_no_password, 3, wx.ALL, 5)
        self.show_pwd_cb = wx.CheckBox(self, -1, "Show password")
        pass_sizer.Add(self.show_pwd_cb, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
        self.show_pwd_cb.Bind(wx.EVT_CHECKBOX, self.onShow)

        main_sizer = wx.BoxSizer(wx.VERTICAL)
        main_sizer.Add(username_sizer, 0, wx.ALL, 5)
        main_sizer.Add(pass_sizer, 0, wx.ALL, 5)

        btn = wx.Button(self, label="Login")
        btn.Bind(wx.EVT_BUTTON, self.onLogin)
        main_sizer.Add(btn, 0, wx.ALL | wx.CENTER, 5)

        self.SetSizer(main_sizer)

    def onLogin(self, event):
        """
        Check credentials and login
        """
        user = str(self.username_txt.GetValue())
        pwd = str(self.pass_txt.GetValue()) if not self.password_shown else str(self.text_no_password.GetValue())

        with open("UIcomponents/login.js", "r") as f:
            credentials = json.load(f)
        if user != credentials["User"] or pwd != credentials["Pwd"]:
            wx.LogError("Username or password are not correct. Please, try again")
            return
        with open("UIcomponents/login.js", "w") as f:
            json.dump(credentials, f)

        pub.sendMessage("loginListener", message="logged in")
        self.Destroy()

    def onShow(self, event):
        self.pass_txt.Show(self.password_shown)
        self.text_no_password.Show(not self.password_shown)
        if not self.password_shown:
            self.text_no_password.SetValue(self.pass_txt.GetValue())
            self.text_no_password.SetFocus()
        else:
            self.pass_txt.SetValue(self.text_no_password.GetValue())
            self.pass_txt.SetFocus()
        self.pass_txt.GetParent().Layout()
        self.password_shown = not self.password_shown

编辑

按照此 link GDB complaining about missing raise.c 的说明(按照@AliIrani 的建议),我更改了消息:

Program received signal SIGSEGV, Segmentation fault.
raise (sig=<optimized out>) at ../sysdeps/unix/sysv/linux/raise.c:50
50    return ret;

Can someone explain what does it mean and how to solve?

这意味着 python 可执行文件遇到了某种致命错误并调用了 abort()。通常这发生在 assertion violation 上,并伴随 stderr.

上的错误消息

不幸的是,您的安装程序应用程序已完全剥离(这会阻止 GDB 告诉您崩溃发生的位置),或者包含 UPX.

根据 this PyInstaller 文档,您需要使用 --noupx 标志(如果您正在使用它们,请删除 -s--strip)。

如果应用程序仍然崩溃,应该更容易告诉哪里崩溃发生了。

看起来问题是由库 darkdetect 引起的。该错误仅在运行时发生,因为 after

    pub.sendMessage("loginListener", message="logged in")
    self.Destroy()

创建了一个新的window,背景颜色取决于用户选择的系统主题(可能我的代码没有权限访问这些信息)。