【发布时间】:2017-10-10 03:57:29
【问题描述】:
编辑:我在命令提示符中成功捕获了另一个随机错误,这次指向第 69 行-分段错误调用不同字典中元组的长度是否等于数字....
我设计了一个长时间运行(长达一周)的脚本,用于测试不同结构的 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 或 floats)。
据我了解,该错误是指应用程序不应该写入内存,因此 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)
但是这似乎没有发现错误,脚本仍然崩溃,没有向指定文件发送任何信息。
抱歉,如果我没有包含必要的内容。
【问题讨论】:
-
您是否有激活的病毒扫描程序?禁用它可能值得进行测试。
-
值得一试。该错误的一个令人讨厌的功能是它显然出现在代码中的随机位置(请参阅编辑),但它也在几天的运行期间随机出现。它运行了 2 天而之前没有崩溃,所以很难确定某些东西是否有效
-
错误是
access violation,所以我想知道在您尝试写入文件时是否有东西在访问这些文件。 -
Norton 防病毒软件在凌晨 3 点的安全历史记录中似乎有“未经授权的访问被阻止(访问进程数据)” - 这大概是脚本上次崩溃的时间。它没有提到 python,它说演员是 'windows\ssystem32\conhost.exe'
-
关于您的观点-我设置的任何内容都不会访问文件,并且有时可能会发生错误,因为我实际上并没有写任何东西,只是在内存中使用 python 对象进行操作
标签: python python-3.5