我有一个Tkinter应用程序有时在Windows下崩溃。 错误是一个通用的“程序已停止工作,需要closures”。
检查事件日志后,我发现tcl85.dll是导致崩溃的库。
我的猜测是,在我的程序中有一个错误使用tcl api,导致tcl进入一个未定义的状态,最终导致崩溃,或者tcl85本身存在错误。
我的问题是,如何诊断这个问题的原因? 哪些工具可以帮助在程序出错的地方回溯到某个地方? 我已经检查了Windows事件日志中的错误,但是那里的信息似乎不足以识别原因。
PyInstaller构build的Windows EXE失败,并带有multiprocessing.pool
PyQt:为我的程序在Windows中执行“开机启动”技巧的最佳方法
Pyinstaller .exe不能在Windows 10和Windows 8.1中工作
独立的Django应用程序与Windows上的pyinstaller
以下是事件日志错误的xml:
Name="Application Error"></Provider> <EventID Qualifiers="0">1000</EventID> <Level>2</Level> <Task>100</Task> <Keywords>0x0080000000000000</Keywords> <TimeCreated SystemTime="2014-08-27 08:54:13"></TimeCreated> <EventRecordID>6173</EventRecordID> <Channel>Application</Channel> <Computer>my.windows.8.tablet.computer</Computer> <Security UserID=""></Security> </System> <EventData><Data><string>my_tkinter_app.exe</string> <string>0.0.0.0</string> <string>514e2c2f</string> <string>tcl85.dll</string> <string>8.5.2.15</string> <string>53b1e888</string> <string>c0000005</string> <string>0007697f</string> <string>1378</string> <string>01cfc1d44828ecb0</string> <string>C:UsersADMINI~1DOWNLO~1my_tkinter_app.exe</string> <string>C:UsersADMINI~1AppDataLocalTemp_MEI35042tcl85.dll</string> <string>b7745a30-2dc7-11e4-9732-88124e8c7600</string> <string></string> <string></string> </Data> <Binary></Binary> </EventData> </Event>
从c0000005我收集,有一个访问冲突,但这仍然是通用的,以确定一个原因。
不幸的是,我无法重现在Linux下的崩溃,所以我正在寻找一个特定于窗口的方式来跟踪这个问题。
Windows上的PyInstaller错误
模块脚本的Pyinstaller
PyInstaller – 程序在另一台计算机上返回-1
如何将pyromedriver与pyinstaller一起使用?
PyInstaller在32位Linux上 – 导入错误:'六'包是必需的
如果你有一个参与Tcl的PDB文件(例如你自己构建了它),最简单的方法就是在进程崩溃时简单地指示窗口安全地使用MiniDump。
Windows错误报告(WER)系统具有执行此操作所需的部分,您只需设置一些注册表项并查找生成的.dmp文件即可。
看看http://msdn.microsoft.com/en-us/library/windows/desktop/bb787181%28v=vs.85%29.aspx所需的东西:
一旦你有崩溃转储,你只需用你选择的调试器(Visual Studio或Windbg)打开它,并开始调试,将其指向你的PDB文件和Microsofts Symbol服务器,并获得一个很好的崩溃堆栈跟踪。
我在安装了Python 2.7.9的Windows 7桌面上出现了相同的错误,而这在我的程序中是一个线程安全的问题。 我不确定您的问题是否可以通过我的解决方案解决,只需分享。
对于所有在其他(比主)线程运行tkinter的人,tkinter 不是线程安全的 。 在我的程序中,我必须在主线程中运行扭曲的反应堆,所以我在另一个线程中运行tkinter UI。 由于我在主线程中直接调用了Text.insert()方法(如Text.insert() ),所以偶尔会发生c0000005错误。
在阅读这个错误报告之后 ,我修改了基于tkinter的UI模块:
用下面的方法添加了一个处理方法: after()和queue.get_Nowait()
def commandQueueHandler(self): try: while 1: your_command = self.textCommandQueue.get_Nowait() if your_command is not None: # execute the command .... self.Text.update_idletasks() except Queue.Empty: pass self.Text.after(100,self.commandQueueHandler)
这个方法每100ms触发一次,以处理队列中的命令,但是你必须触发一次才能使其工作。 (我在__init__触发了这个,所有的小部件都被初始化了。)
在主线程中,我只需要在命令队列中输入命令/消息并等待处理。 当然,在命令执行之前会有一些延迟。
而已! 通过这个修改,我的程序在2周的压力测试后没有运行tcl c0000005错误。 希望这可以帮助。
ps小心,只有widget类提供after()方法, 请查看这个页面的细节 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。