2009/05/05

C扩展接口程序中的Python引用计数器泄漏

如果是python code产生的内存泄露,可以用gc module来调试;

如果是接口C程序产生的内存泄露,可以用工具linux ,valgrind 或 vc++ 并 visual leak detector来调试。个人感觉后者更简单易用。

valgrind 为linux 下free 内存调试软件

http://valgrind.org/

内存泄漏调试过程
* 使用分析工具Valgrind对整个应用程序的运行过程进行分析
* 运行命令行
valgrind -v --leak-check=yes --num-callers=256 --logfile=d python d.py

分析内存占用情况
* 为valgrind增加命令行参数--show-reachable=yes,这将会把还在使用的内存情况也打印出来
* 运行命令行
valgrind -v --show-reachable=yes --leak-check=yes --num-callers=256 \
--logfile=d python d.py


附: 引用计数相关函数
(1)void Py_INCREF(PyObject *o)
void Py_XINCREF(PyObject *o)
增加引用计数,如果不确定对象o是否为空,使用后者

(2)void Py_DECREF(PyObject *o)
void Py_XDECREF(PyObject *o)
减少引用计数,如果不确定对象o是否为空,使用后者

(3)void Py_CLEAR(PyObject *o)同上

2.4以后版本使用Py_IncRef(PyObject *o), Py_DecRef(PyObject *o), Py_CLEAR(PyObject *o)

没有评论: