2009-10-05 16 views
16

Tôi đã cố gỡ lỗi bộ nhớ trong phần mở rộng Python C của mình và cố gắng chạy tập lệnh theo valgrind. Tôi thấy có quá nhiều "tiếng ồn" trong đầu ra valgrind, ngay cả khi tôi đã chạy lệnh đơn giản như:Có bình thường khi chạy python dưới valgrind cho thấy nhiều lỗi với bộ nhớ?

valgrind python -c "" 

Valgrind đầu ra đầy đủ các thông tin lặp đi lặp lại như thế này:

==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) 

Python 2.5. 2 trên Slackware 12.2.

Hành vi bình thường có phải không? Nếu vậy thì valgrind có thể là công cụ không thích hợp để gỡ lỗi lỗi trong Python?

Trả lời

22

Bạn có thể thử bằng cách sử dụng suppression file mà đi kèm với nguồn python

Đọc Python Valgrind README là một ý tưởng tốt quá!

+0

Như một lưu ý cấp cao: Nói chung Valgrind cần một số trợ giúp với các trình phân bổ tùy chỉnh vì nó không thể hiểu được hành vi của một trình phân bổ tùy chỉnh vì nó có thể là một cài đặt chuẩn. – Falaina

+0

vì vậy, nếu tôi đọc readme valgrind một cách chính xác, tôi không thể thực sự sử dụng valgrind để gỡ lỗi một phần mở rộng python c mà không biên dịch phân phối python của riêng tôi ?! –

0

Có, điều này là điển hình. Các hệ thống lớn thường để lại bộ nhớ không giải phóng, điều này là tốt miễn là nó là một số lượng không đổi, và không tỷ lệ thuận với lịch sử chạy của hệ thống. Trình thông dịch Python rơi vào thể loại này.

Có lẽ bạn có thể lọc đầu ra valgrind để chỉ tập trung vào phân bổ được thực hiện trong tiện ích mở rộng C của bạn?

2

Điều này khá phổ biến, trong bất kỳ hệ thống lớn nào. Bạn có thể sử dụng Valgrind của suppression system để ngăn chặn một cách rõ ràng cảnh báo rằng bạn không quan tâm đến.

0

Có một tùy chọn khác mà tôi đã tìm thấy. James Henstridge có xây dựng tùy chỉnh của python mà có thể phát hiện thực tế là python chạy dưới valgrind và trong trường hợp này phân bổ pymalloc bị vô hiệu hóa, với PyObject_Malloc/PyObject_Free đi qua để malloc/miễn phí bình thường, mà valgrind biết làm thế nào để theo dõi.

gói sẵn ở đây: https://launchpad.net/~jamesh/+archive/python

1

Lựa chọn đúng nhất là phải nói Valgrind rằng nó nên chặn chức năng phân bổ của Python. Bạn nên vá valgrind/coregrind/m_replacemalloc/vg_replace_malloc.c thêm các máy bay đánh chặn mới cho PyObject_Malloc, PyObject_Free, PyObject_Realloc, ví dụ:

ALLOC_or_NULL(NONE,     PyObject_Malloc,  malloc); 

(lưu ý soname cho các chức năng phân bổ sử dụng nên NONE)

Các vấn đề liên quan