我试图调试内存崩溃在我的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)

上的Slackware 12.2的Python 2.5.2。

这是正常的行为呢?如果是这样那么的valgrind也许是在Python调试内存错误不合适的软件工具?

有帮助吗?

解决方案

您可以尝试使用抑制文件那自带蟒源

的Python Valgrind的自述是一个好主意,太!

其他提示

这是相当普遍,在任何稍大系统。您可以使用Valgrind的的抑制系统明确禁止警告你是不感兴趣的内容。

在最正确的方法是,告诉Valgrind的,它应该拦截Python的分配功能。 您应该修补的valgrind / coregrind / m_replacemalloc / vg_replace_malloc.c增加对PyObject_Malloc,PyObject_Free,PyObject_Realloc,e.g新的拦截器:

ALLOC_or_NULL(NONE,                  PyObject_Malloc,      malloc);

(注意,对于用户分配功能的soname应当NONE

继尼克给出的链接,我能够找到一些更新README.valgrind 。在一个字,为Python> 3.6,你可以设置PYTHONMALLOC=malloc环境变量来有效地禁用的警告。例如,在我的机器:

export PYTHONMALLOC=malloc
valgrind python my_script.py

不产生与python任何错误。

是,这是典型的。大型系统中常常会留下记忆未释放,这是很好的,只要它是一个恒定的量,并且不成正比,系统运行的历史。 Python解释属于这一类。

也许你可以过滤Valgrind的输出只专注于你的C扩展进行的分配?

还有另一种选择,我发现。詹姆斯亨斯特莱吉有蟒蛇的自定义生成可检测的事实,蟒蛇下的valgrind在这种情况下pymalloc分配器运行被禁止,以PyObject_Malloc / PyObject_Free通过正常的malloc /免费,其中的valgrind知道如何追踪。

套餐可以在这里找到: https://launchpad.net/~jamesh/+archive/python

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top