Valgrind에서 Python을 실행하는 것이 메모리와 많은 오류를 보여주는 것이 정상입니까?

StackOverflow https://stackoverflow.com/questions/1519276

문제

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 Valgrind Readme 또한 좋은 생각입니다!

다른 팁

이것은 모든 큰 시스템에서 매우 일반적입니다. Valgrind 's를 사용할 수 있습니다 억제 시스템 관심이없는 경고를 명시 적으로 억제합니다.

가장 올바른 옵션은 Valgrind에게 Python의 할당 함수를 가로 채어야한다고 말하는 것입니다. Valgrind/coregrind/m_replacemalloc/vg_replace_malloc.c pyobject_malloc, pyobject_free, pyobject_realloc, eG를 패치해야합니다.

ALLOC_or_NULL(NONE,                  PyObject_Malloc,      malloc);

(사용자 할당 함수의 Soname은 NONE)

Nick이 제공 한 링크에 따라 몇 가지 업데이트를 찾을 수있었습니다. readme.valgrind. 한마디로 Python> 3.6의 경우 PYTHONMALLOC=malloc 경고를 효과적으로 비활성화하기위한 환경 변수. 예를 들어, 내 컴퓨터에서 :

export PYTHONMALLOC=malloc
valgrind python my_script.py

파이썬과 관련된 오류가 발생하지 않습니다.

예, 이것은 일반적입니다. 대형 시스템은 종종 메모리를 미지로 남겨 두며, 이는 일정한 양인 한 시스템의 실행 기록에 비례하지 않는 한 괜찮습니다. Python 통역사는이 범주에 속합니다.

아마도 C 확장에서 작성된 할당에만 초점을 맞추기 위해 Valgrind 출력을 필터링 할 수 있습니까?

내가 찾은 또 다른 옵션이 있습니다. James Henstridge는 Python의 맞춤형 빌드를 가지고 있으며 Valgrind에서 실행되는 Python 과이 경우 Pymalloc Allocator가 비활성화되었다는 사실을 감지 할 수 있습니다.

여기에 사용 가능한 패키지 : https://launchpad.net/~jamesh/+orchive/python

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top