我用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编辑
按照这个链接GDB抱怨缺失的原因c上的说明(正如@AliIrani所建议的那样),我的消息被更改了:
Program received signal SIGSEGV, Segmentation fault.
raise (sig=<optimized out>) at ../sysdeps/unix/sysv/linux/raise.c:50
50 return ret;发布于 2021-06-21 06:42:51
看起来这个问题是由库darkdetect引起的。此错误仅在运行时发生,因为
pub.sendMessage("loginListener", message="logged in")
self.Destroy()创建了一个新窗口,背景颜色取决于用户选择的系统主题(也许我的代码没有被授权访问这些信息)。
发布于 2021-06-19 21:23:18
有人能解释一下这意味着什么以及如何解决吗?
这意味着python可执行文件遇到了某种致命错误,并调用了abort()。通常,这种情况发生在assert离子违规时,并伴随着stderr上的错误消息。
不幸的是,您的安装程序应用程序被完全剥离(这使得GDB无法告诉您崩溃发生在何处),或者是打包了UPX。
根据这 PyInstaller doc,您将希望使用--noupx标志(如果正在使用它们,则删除-s或--strip )。
如果应用程序仍然崩溃,那么应该更容易判断该崩溃发生在何处。
https://stackoverflow.com/questions/68014949
复制相似问题