2012-12-24 17 views
12

Theo câu hỏi, tôi đang gặp sự cố rò rỉ bộ nhớ theo số getnameinfo. Tôi đang sử dụng Ubuntu 12.04 (Linux scv 3.2.0-35-generiC# 55-Ubuntu SMP Thứ tư ngày 5 tháng 12 17:42:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux) với gcc phiên bản 4.6.3.
Tôi đang liên kết máy chủ của mình có thể thực thi với g ++ và cho đến nay valgrind chưa báo cáo sự cố. Sau đó tôi đã thêm một cuộc gọi đơn giản tới getnameinfo để in ra tên mạng và cổng kết nối khách hàng là gì.
Và tôi nhận được như sau:Xác nhận rò rỉ bộ nhớ getnameinfo có được xác nhận không?

 
==4425== 
==4425== HEAP SUMMARY: 
==4425==  in use at exit: 10 bytes in 1 blocks 
==4425== total heap usage: 4,508 allocs, 4,507 frees, 134,939,153 bytes allocated 
==4425== 
==4425== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1 
==4425== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==4425== by 0x50D7D71: strdup (strdup.c:43) 
==4425== by 0x1484B861: ??? 
==4425== by 0x515B871: [email protected]@GLIBC_2.2.5 (getXXbyYY_r.c:256) 
==4425== by 0x5161D06: getnameinfo (getnameinfo.c:223) 
==4425== by 0x404175: solsrv_run (solsrv.c:381) 
==4425== by 0x404DAC: main (main.c:167) 
==4425== 
==4425== LEAK SUMMARY: 
==4425== definitely lost: 10 bytes in 1 blocks 
==4425== indirectly lost: 0 bytes in 0 blocks 
==4425==  possibly lost: 0 bytes in 0 blocks 
==4425== still reachable: 0 bytes in 0 blocks 
==4425==   suppressed: 0 bytes in 0 blocks 
==4425== 
==4425== For counts of detected and suppressed errors, rerun with: -v 
==4425== ERROR SUMMARY: 12 errors from 11 contexts (suppressed: 2 from 2) 

Tôi đang làm gì sai?
Mã chỉ đơn giản là như sau:

struct sockaddr addr; 
socklen_t   addr_sz = sizeof(addr); 
char  host[NI_MAXHOST], 
      serv[NI_MAXSERV]; 
int infd = accept(srv_fd, (struct sockaddr*)&addr, &addr_sz); 
if (infd == -1) { 
    ... manage error on accept ... 
} 
if(getnameinfo((struct sockaddr *)&addr, addr_sz, host, NI_MAXHOST, serv, NI_MAXSERV, NI_NUMERICSERV)) { 
    strncpy(host, "<unknown host>", NI_MAXHOST-1); 
    strncpy(serv, "<unknown port>", NI_MAXSERV-1); 
} 

Và ở đó bạn có bị rò rỉ ...
Tôi có thể khẳng định, rằng sự rò rỉ được xảy ra: cho 6 khách hàng kết nối valgrind tìm thấy 60 byte bị rò rỉ (Tôi đoán các khách hàng đang kết nối từ cùng một máy chủ vì vậy nếu nó liên quan đến tên máy chủ thì tốc độ tăng trưởng là tuyến tính như mong đợi).
Bất kỳ ý tưởng nào?

Cheers

+0

Luôn có thể tải xuống nguồn và xem nội dung đang làm. –

+0

Và vì đó là nguồn mở, bạn có thể tự khắc phục sự cố! –

+0

Có thể phải làm điều đó :-) – Emanuele

Trả lời

3

Cuối cùng tìm thấy thực rò rỉ.

Khi kết nối với ổ cắm máy chủ sử dụng name.local thay vì localhost và/hoặc tên đủ điều kiện.
getnameinfo() sau đó sẽ bị rò rỉ.

tôi có thể tái tạo các lỗi trên 12.04, 12.10 cả x64x86.
Nếu tôi kết nối chỉ định .local vào tên nó bị rò rỉ.

Chúc mừng