在valgrind下运行python出现许多内存错误正常吗?
我在调试我的Python C扩展时遇到了内存崩溃的问题,尝试在valgrind下运行脚本。结果发现valgrind的输出信息太杂乱了,即使我只运行了简单的命令:
valgrind python -c ""
valgrind的输出信息里充满了像这样的重复内容:
==12317== Invalid read of size 4
==12317== at 0x409CF59: PyObject_Free (in /usr/lib/libpython2.5.so.1.0)
==12317== by 0x405C7C7: PyGrammar_RemoveAccelerators (in /usr/lib/libpython2.5.so.1.0)
==12317== by 0x410A1EC: Py_Finalize (in /usr/lib/libpython2.5.so.1.0)
==12317== by 0x4114FD1: Py_Main (in /usr/lib/libpython2.5.so.1.0)
==12317== by 0x8048591: main (in /usr/bin/python2.5)
==12317== Address 0x43CD010 is 7,016 bytes inside a block of size 8,208 free'd
==12317== at 0x4022F6C: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==12317== by 0x4107ACC: PyArena_Free (in /usr/lib/libpython2.5.so.1.0)
==12317== by 0x41095D7: PyRun_StringFlags (in /usr/lib/libpython2.5.so.1.0)
==12317== by 0x40DF262: (within /usr/lib/libpython2.5.so.1.0)
==12317== by 0x4099569: PyCFunction_Call (in /usr/lib/libpython2.5.so.1.0)
==12317== by 0x40E76CC: PyEval_EvalFrameEx (in /usr/lib/libpython2.5.so.1.0)
==12317== by 0x40E70F3: PyEval_EvalFrameEx (in /usr/lib/libpython2.5.so.1.0)
==12317== by 0x40E896A: PyEval_EvalCodeEx (in /usr/lib/libpython2.5.so.1.0)
==12317== by 0x40E8AC2: PyEval_EvalCode (in /usr/lib/libpython2.5.so.1.0)
==12317== by 0x40FD99C: PyImport_ExecCodeModuleEx (in /usr/lib/libpython2.5.so.1.0)
==12317== by 0x40FFC93: (within /usr/lib/libpython2.5.so.1.0)
==12317== by 0x41002B0: (within /usr/lib/libpython2.5.so.1.0)
Python 2.5.2在Slackware 12.2上。
这是正常现象吗?如果是这样的话,valgrind可能不太适合用来调试Python中的内存错误?
7 个回答
2
在任何比较大的系统中,这种情况是很常见的。你可以使用Valgrind的抑制系统,来明确地关闭那些你不想看到的警告。
5
根据Nick提供的链接,我找到了一些关于 README.valgrind 的更新。简单来说,对于Python版本大于3.6的情况,你可以设置一个叫做 PYTHONMALLOC=malloc
的环境变量,这样就可以有效地关闭那些警告了。例如,在我的电脑上:
export PYTHONMALLOC=malloc
valgrind python my_script.py
不会产生任何与Python相关的错误。
22
你可以试试使用随 Python 源代码一起提供的 抑制文件。
阅读一下 Python Valgrind 的说明文件 也是个不错的主意!