Python 3.5 崩溃,异常代码:windows 7 上的 c0000005

Python 3.5 crashes with Exception code: c0000005 on windows 7

编辑:我弹出了另一个随机错误,我在命令提示符中成功捕获了它,这次指向第 69 行 - 分段错误调用不同字典中的元组长度是否等于数字....

我有一个很长的 运行(最多一周)脚本,我设计它来测试不同结构的 SQLlite3 插入时间。不幸的是,脚本间歇性地崩溃 python 而没有向 python GUI 输出错误消息,下面是 windows 在 'python has stopped working' window;

完整的错误信息:

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...)

通过观察已打印和未打印的内容,我知道这是由以下代码(从 link 上的第 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因此关闭了所有内容以阻止它把事情搞砸。但是,我看不出如何更改充满其他普通 python 对象的普通普通 python 对象会产生这样的错误。

有没有人对此有任何想法,或者有什么方法可以解决这个问题 python 没有给出指向特定问题的错误消息?在上一期之后,我在我的脚本周围实现了一个日志记录模块包装器,但它没有捕捉到任何东西

一些初步研究建议我在关闭进程之前从任务管理器获取一个小型转储 - 我有它,但调试没有成功 - 显然我需要一个叫做 python35.pdb 的东西,到目前为止据我所知不在附近(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)

然而,这似乎没有发现错误,脚本仍然崩溃,没有向指定文件发送任何信息。

抱歉,如果我没有包含必要的内容。

脚本在第 50 次莫名其妙地在 运行dom 地方崩溃后,我 运行 windows 内存诊断工具。

不幸的是,我的系统似乎有 ram/hardware 个错误,我知道这会导致这样的问题。