我正在尝试对正在编写的C python扩展进行memcheck,但是我无法设置valgrind与python一起使用。我真的很感谢一些建议。仅出于上下文考虑,这是Ubuntu 13.10,python 2.7.5+和valgrind 3.8.1。
根据Readme.valgrind我的建议,我做了以下工作。
Readme.valgrind
1)下载了python源
sudo apt-get build-dep python2.7 apt-get source python2.7
2)应用了代码补丁,即“在Objects / obmalloc.c中取消注释Py_USING_MEMORY_DEBUGGER”。
3)应用了抑制补丁,即“取消注释Misc / valgrind- python.supp中抑制PyObject_Free和PyObject_Realloc警告的行”
4)用编译python
./configure --prefix=/home/dejan/workspace/python --without-pymalloc make -j4 install
请注意,我同时执行了2和3,而README.valgrind则说要执行2或3。
现在,让我们在python示例代码中对此进行测试 test.py
test.py
print "Test"
使用此脚本在python上运行valgrind
valgrind --tool=memcheck --leak-check=full --suppressions=python2.7-2.7.5/Misc/valgrind-python.supp bin/python test.py
出乎意料的是,仍然有来自valgrind的大量报告,其中第一个是(以后还会有更多报告)
==27944== HEAP SUMMARY: ==27944== in use at exit: 857,932 bytes in 5,144 blocks ==27944== total heap usage: 22,766 allocs, 17,622 frees, 4,276,934 bytes allocated ==27944== ==27944== 38 bytes in 1 blocks are possibly lost in loss record 24 of 1,343 ==27944== at 0x4C2A2DB: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==27944== by 0x46B8DD: PyString_FromString (stringobject.c:143) ==27944== by 0x439631: PyFile_FromFile (fileobject.c:157) ==27944== by 0x4E9B4A: _PySys_Init (sysmodule.c:1383) ==27944== by 0x4E29E9: Py_InitializeEx (pythonrun.c:222) ==27944== by 0x4154B4: Py_Main (main.c:546) ==27944== by 0x577DDE4: (below main) (libc-start.c:260)
难道我做错了什么?有没有办法让valgrind一个不会泄漏的python脚本并获得干净的valgrind输出?
我在这里找到了答案。
Python还需要以调试模式进行编译,即
./configure --prefix=/home/dejan/workspace/python --without-pymalloc --with-pydebug --with-valgrind
此外,numpy还有一个禁止文件,该文件可以消除多余的valgrind警告。