2010-10-06 13 views
9

Dưới đây là báo cáo Valgring:Làm thế nào để xác định vị trí một sự không phù hợp miễn phí/xóa được báo cáo bởi Valgrind trong một chương trình đa luồng?

==14546== Thread 5: 
==14546== Invalid free()/delete/delete[] 
==14546== at 0x490555D: free (vg_replace_malloc.c:235) 
==14546== by 0x3BF7EFAA8F: free_mem (in /lib64/tls/libc-2.3.4.so) 
==14546== by 0x3BF7EFA581: __libc_freeres (in /lib64/tls/libc-2.3.4.so) 
==14546== by 0x4802676: _vgw_freeres (vg_preloaded.c:62) 
==14546== Address 0x4DC4EE0 is not stack'd, malloc'd or (recently) free'd 

Làm thế nào tôi có thể biết được chủ đề là nó là số chủ đề khác nhau từ một thi khác? Sẽ assigning names to my threads trợ giúp ở đây?

EDIT: Tôi không nghĩ rằng điều này sẽ được đề cập trong phần DRD của hướng dẫn.

Tôi đang sử dụng valgrind-3.1.1 trên doanh nghiệp Red Hat Linux AS4.

Trả lời

2

cuối cùng tôi đã tìm thấy lời giải thích cho việc này: thực thi đơn vị thử nghiệm của tôi có liên quan đến một [bên thứ ba] thư viện nó đã không không sử dụng. Tôi liên kết lại nó mà không có thư viện đó và vấn đề đã biến mất.

Ngoài ra, lỗi được phát hiện trong __libc_freeres(), một chức năng của gnu libc là tài nguyên miễn phí ở cuối quá trình thực thi. Vấn đề có thể nằm trong thư viện hoặc trong glibc.
Có thể sử dụng Valgrind Linux-specific option sau để tránh lỗi này: --run-libc-freeres=no. Chú ý điều này có thể làm cho phát hiện rò rỉ kém hiệu quả hơn.

1

Bạn có thể sử dụng macro DRD_GET_DRD_THREADID để hiển thị ID luồng khi chuỗi bắt đầu. Bạn cũng có thể cung cấp tên trong bản in để trợ giúp. Xem EDIT DRD Manual

Có lẽ tôi không cụ thể ở đây .. nhưng tôi nghĩ rằng bạn sẽ cần phải liên kết trong một số libs valgrind khi bạn xây dựng một phiên bản debug mã của bạn (có thể với một tùy chọn biên dịch hoặc một cái gì đó) . Bạn có thể sử dụng DRD_GET_DRD_THREADID từ trong chuỗi và nhận tên bạn đã gán khi bắt đầu - sau đó bạn có thể ghi thông tin đó vào tệp hoặc vào bảng điều khiển. Không có cách nào để nói DRD để in tên tôi không nghĩ, vì vậy bạn phải sử dụng một combo.

6

Bạn có thể giải phóng một biến toàn cầu (địa chỉ: 0x4DC4EE0 rất gần với các hình cầu theo mặc định trên Linux/x86_64).

Chạy chương trình theo GDB, sau đó thực hiện info symbol 0x4DC4EE0 và GDB sẽ cho bạn biết tất cả những gì bạn cần biết.

Cập nhật:
Valgrind 3.6 thực sự báo cáo biểu tượng toàn cầu đã có. Ví dụ, đưa ra chương trình lỗi này:

#include <stdlib.h> 

int x; 

int main() 
{ 
    free(&x); 
    return 0; 
} 

Valgrind 3.6 báo cáo:

==18731== Invalid free()/delete/delete[] 
==18731== at 0x4C240E8: free /tmp/vg/coregrind/m_replacemalloc/vg_replace_malloc.c:394 
==18731== by 0x4004AA: main /home/t.c:7 
==18731== Address 0x60089c is 0 bytes inside data symbol "x" 
+0

Cảm ơn, tôi đã tạo một hình ảnh về quy trình của tôi và gọi gdb ''địa chỉ thông tin' và bây giờ cũng là' biểu tượng thông tin' không có may mắn cho đến nay. – philant

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