如何在Windows下调试Python中的访问冲突内存问题?

2024-06-28 19:53:54 发布

您现在位置:Python中文网/ 问答频道 /正文

对于调试ctypes内存问题,您建议使用哪些工具或流程?如何可以打印数组的内容,但无法复制它

我已将问题缩小到以下几行:

   [ ... lots of code ...]

   valid_data_as_bytes = bytearray(self._output_buffer[:result])
   print("valid_data_as_bytes:",valid_data_as_bytes)
   print("len(valid_data_as_bytes):", len(valid_data_as_bytes))
   assert len(valid_data_as_bytes) == result
   Buffer = ctypes.c_ubyte * len(valid_data_as_bytes)
   buf2 = Buffer.from_buffer_copy(valid_data_as_bytes)  # <--- error occurs here

   [ ... lots of code ...]

下面是使用命令pytest -s运行测试时最后几行输出的打印输出:

valid_data_as_bytes: bytearray(b'\xfc\xdf]\'O\xb6\xf4n\xa3p\x87\xcd\xca\xe1\xd53~V\x04\xa3\x977\xd3q[\xf8\x9dh\xe1\x05\x7f\xf3$\xb2S,\xa4\x8d\x04\xe6\xc0\x12\xbf)\xb8\r\xcb&\x9a(\x08\x1c\xca\x1a\x13\x16\xba}\x93e\xf0J\x91\x8eJ\xcbk\xc0\xc2\xc9@{\xcc$\x7f\x1d0\xc58\xcf\xe5\xbf_W\r\x02\xf7\xb8\x7fm\xa1\xd9\xa8\xba6\xed\x17\xdf;\x7f\x8b\x9a\x9f\x03\r\xec\xdc]\x14\xfd\x15B\x98\\\xcb\xc8)\xdd9\xc0\xb2\xb5\xa5Af\x85\x8b\x1a\xac\x89,#\xd9 \xc7\x86SiE|\x84B\xdc"\xcfhG\xef\xec\xffh\x84\x14\xdb\xf9\xc9J2O\xe3[8\x9531Be\xb0p\x87\x0eJ\xa4i\xce)\xbaBXY\xdeP\x88\x13\xdc](_\xd5^m\xdc\xde\x18\x13\xb2H\xe0\xae\xea=#+\x92\xd3\xe6[W\x94X\x96\xfe\xa3\x137\xe9\xfe\xcc6F\xb9\x0b\xc3NO\x93Ksy\xc4A\xcb"\xf0\xc1\xa0\x83\xa3\xc4@\xbb\\\xb8\xfd\xbem\'(A\x9f\x0fV\x9f\xe1\xc0\x97\xd0\x95W"a\x94\xfdymv\xa2>P\x9d\xcc\x80\xc13B\xd0\nu\xd4\x04\xa9\xc4\xd3\xb5q3\x8f\x08:\xacrm\x1bre\x0e\x9a\xd5\x98\xeez \xd3H\xd2\xed\xdd\x12\xd8\xa2,[\xac\xdf\x13\x9f\xed\xa8\xf5\x98\x97\xb3\xc4\x10\xc3\xa6\x10A\x96.>D\x048\x02~\x9c}\xa5\xd1\x93\xd0I\xe94\x1b\x85\'~0\x92\x82lr')
len(valid_data_as_bytes): 354
Windows fatal exception: access violation

此代码在macOS或Linux下不会出错。当测试套件中的每个基于pytest的测试单独运行时,它也不会出错。但是,当整个测试套件运行时,它始终抛出Windows fatal exception: access violation错误

我一直在看what I believe is the implementation of ^{},但我不知道如何通过这一步;在Python运行了许多测试之后,什么工具最适合逐步完成它的C端?或者我应该去别处看看

除了主线程之外,没有其他线程或进程

关于代码效率低下的事实:为了解决这个问题,我强迫Python复制所有内存块(例如,bytearray转换)

如果您有任何建议,我们将不胜感激


Tags: ofdatalenbytesasxdfvalidx04