2009-10-05 3 views
16

Python C 확장 프로그램에서 메모리 크래시를 디버깅하려고 시도했으며 valgrind에서 스크립트를 실행하려고했습니다. 나는 간단한 명령을 실행 한 경우에도 Valgrind의 출력에 너무 많은 "소음"이 발견으로이 같은 반복 정보의 전체valgrind에서 실행중인 python이 메모리에 많은 오류를 표시하는 것이 정상입니까?

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) 

파이썬 2.5. 2에서 Slackware 12.2.

정상적인 동작입니까? 그렇다면 valgrind는 아마도 파이썬에서 메모리 오류를 디버깅하는 데 부적절한 도구일까요?

답변

22

당신 파이썬 소스

Python Valgrind README을 읽는 것은 너무 좋은 아이디어와 함께 제공되는 suppression file를 사용하여 시도해 볼 수도 있습니다!

+0

으로 (참고하면 사용자 할당 기능을위한 불리는이 NONE을해야한다는) 높은 수준의 메모 : 일반적으로 Valgrind는 맞춤 구현 자의 동작을 이해할 수 없기 때문에 맞춤 구현 자에게 도움이 필요합니다. – Falaina

+0

그래서 valgrind 추가 정보를 올바르게 읽으면 valgrind를 사용하여 파이썬 배포본을 컴파일하지 않고 파이썬 확장명을 디버깅 할 수 없습니다. –

0

네, 일반적입니다. 대형 시스템은 종종 메모리를 해제하지 않고 시스템의 실행 기록에 비례하지 않고 일정한 양의 메모리 만 남겨 둡니다. 파이썬 인터프리터가이 범주에 속합니다.

아마도 C 확장 프로그램에서 할당에 집중하도록 valgrind 출력을 필터링 할 수 있습니까?

2

이것은 대용량 시스템에서 매우 일반적입니다. 당신은 Valgrind의의 suppression system가 명시 적으로 관심을하지 않은 경고를 억제하는 데 사용할 수 있습니다.

0

다른 옵션이 있습니다. James Henstridge는 valgrind 아래에서 실행되는 python과이 경우 pymalloc 할당자가 비활성화되어 PyObject_Malloc/PyObject_Free가 정상 malloc/free로 전달되어 valgrind가 추적 방법을 알고 있다는 사실을 감지 할 수있는 Python 사용자 정의 빌드를 사용합니다. 가능 여기

패키지 : https://launchpad.net/~jamesh/+archive/python

1

가장 올바른 옵션은 파이썬의 할당 기능을 차단해야한다는 Valgrind의 말씀하는 것입니다. 당신은 패치해야 Valgrind의/coregrind/m_replacemalloc/vg_replace_malloc.c 예를 들어 PyObject_Malloc, PyObject_Free, PyObject_Realloc에 ​​대한 새로운 인터셉터 추가 :

ALLOC_or_NULL(NONE,     PyObject_Malloc,  malloc);