我有一个长期运行(最多一周)的脚本,我设计用于测试不同结构的SQLlite3插入时间。不幸的是,脚本间歇性地崩溃python而没有向python GUI输出错误消息,下面是windows在'python已停止工作'窗口中给出的错误消息;
完整的错误消息:
Problem Event Name: APPCRASH
Application Name: pythonw.exe
Application Version: 3.5.150.1013
Application Timestamp: 55f4dccb
Fault Module Name: python35.dll
Fault Module Version: 3.5.150.1013
Fault Module Timestamp: 55f4dcbb
Exception Code: c0000005
Exception Offset: 000e800e
OS Version: 6.1.7601.2.1.0.768.3
Locale ID: 2057
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
Script I was running (warning, 1.5k lines...)
通过观察已打印和未打印的内容,我知道它是由此引起的,或者至少在此时巧合地发生,使用以下代码(从链接上的第1450行开始):
with open(r"C:\BMRA\LOG\less tbl log.csv",'a') as log:
log.write(my_date.strftime("%Y-%m-%d"))
log.write(", ")
seconds=sql_time.seconds
log.write(str(seconds))
log.write("\n")
item_collector=[]
Log csv文件似乎写得很好,所以我的假设是错误必须位于最后一行。
Item_collector是一个(大的,~700mb)元组列表的字典,它刚刚被写入sqllite3数据库(仅包含str,int或float的元组)。
据我所知,错误是指一个应用程序写入内存它不应该和Windows因此关闭所有内容以阻止它搞砸了。但是,我不知道如何更改充满其他vanilla python对象的普通vanilla python对象应该会产生这样的错误。
有没有人对什么可以支持这一点有任何想法,或者是否有方法来解决这个问题,因为python没有给出指向特定问题的错误消息?在上一个问题之后,我在我的脚本下面实现了一个日志记录模块包装器,但它没有捕获任何内容
一些初步的研究表明,在关闭流程之前,我从任务管理器获得了一个小型转储 - 我有它,但是调试还没有成功 - 显然我需要一些名为python35.pdb的东西,据我所知out不在(适用于3.5)
The script recently had a similar problem before which gave a similar error message
我收到的建议是在脚本周围实现日志记录模块:
import logging
logging.basicConfig(filename=r'C:\BMRA\ERROR_LOG.log', level=logging.DEBUG)
try:
main()
except BaseException:
logging.getLogger(__name__).exception("Program terminated")
raise
和
def logging_decorator(func):
def wrapper_function(self, *args, **kwargs):
logging.getLogger(__name__).debug(
"Calling %s: %r %r", func.__name__, args, kwargs)
ret = func(self, *args, **kwargs)
logging.getLogger(__name__).debug(
"%s returned %r", func.__name__, ret)
return ret
return wrapper_function
class MyConnect(sqlite3.Connection):
def cursor(self):
return super(MyConnect, self).cursor(MyCursor)
commit = logging_decorator(sqlite3.Connection.commit)
class MyCursor(sqlite3.Cursor):
execute = logging_decorator(sqlite3.Cursor.execute)
然而,这似乎没有发现错误,脚本仍然崩溃而没有向指定文件发送任何信息。
如果我没有提供必要的内容,请道歉。
答案 0 :(得分:1)
第50次脚本在一个随机的地方莫名其妙地崩溃后,我运行了Windows内存诊断工具。
不幸的是,我的系统似乎有ram / hardware错误,据我所知会导致这样的问题。