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()
。通常这发生在 assert
ion violation 上,并伴随 stderr
.
上的错误消息
不幸的是,您的安装程序应用程序已完全剥离(这会阻止 GDB 告诉您崩溃发生的位置),或者包含 UPX
.
根据 this PyInstaller 文档,您需要使用 --noupx
标志(如果您正在使用它们,请删除 -s
或 --strip
)。
如果应用程序仍然崩溃,应该更容易告诉哪里崩溃发生了。
看起来问题是由库 darkdetect
引起的。该错误仅在运行时发生,因为 after
pub.sendMessage("loginListener", message="logged in")
self.Destroy()
创建了一个新的window,背景颜色取决于用户选择的系统主题(可能我的代码没有权限访问这些信息)。
我使用 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()
。通常这发生在 assert
ion violation 上,并伴随 stderr
.
不幸的是,您的安装程序应用程序已完全剥离(这会阻止 GDB 告诉您崩溃发生的位置),或者包含 UPX
.
根据 this PyInstaller 文档,您需要使用 --noupx
标志(如果您正在使用它们,请删除 -s
或 --strip
)。
如果应用程序仍然崩溃,应该更容易告诉哪里崩溃发生了。
看起来问题是由库 darkdetect
引起的。该错误仅在运行时发生,因为 after
pub.sendMessage("loginListener", message="logged in")
self.Destroy()
创建了一个新的window,背景颜色取决于用户选择的系统主题(可能我的代码没有权限访问这些信息)。