【问题标题】:Python 3.5 crashes with Exception code: c0000005 on windows 7Python 3.5 崩溃并出现异常代码:Windows 7 上的 c0000005
【发布时间】: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


【解决方案1】:

第50次后,脚本莫名其妙地在一个随机的地方崩溃,我运行了windows内存诊断工具。

不幸的是,我的系统似乎有内存/硬件错误,我知道这会导致这样的问题。

【讨论】:

  • 你说的系统是什么意思?如果出现硬件错误,您如何理解?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
相关资源
最近更新 更多