2012-03-01 20 views
6

Mục tiêu của tôi hoàn toàn là tìm ra từ một tệp lõi bài đăng, tại sao một quá trình cụ thể lại tiêu tốn rất nhiều bộ nhớ. Có một bản tóm tắt mà tôi có thể nhận được bằng cách nào đó? Rõ ràng là valgrind không được hỏi, bởi vì tôi không thể tiếp cận được với quá trình này.tìm kiếm rò rỉ bộ nhớ sau giết mổ (và phân tích) với gdb

Trước hết nhận được một cái gì đó tương tự như sản lượng/proc// maps "pid", sẽ giúp đỡ, nhưng

maintenance info sections 

(như mô tả ở đây: GDB: Listing all mapped memory regions for a crashed process) trong gdb không chỉ cho tôi tiêu thụ bộ nhớ heap .

info proc map 

là một tùy chọn, vì tôi có thể truy cập vào máy có cùng mã chính xác nhưng theo như tôi thấy thì không chính xác. Quá trình của tôi đã sử dụng 700MB-s, nhưng bản đồ chỉ nhìn thấy khoảng 10 MB. Và tôi không thấy .so-s ở đó có thể nhìn thấy trong

maintenance print statistics 

Bạn có biết bất kỳ lệnh nào khác hữu ích không?

Tôi luôn có thể đặt mã, nhưng điều đó không hề dễ dàng. Cùng với việc tiếp cận tất cả các dữ liệu được phân bổ thông qua con trỏ giống như kim trong đống cỏ khô.

Bạn có ý tưởng nào không?

Trả lời

2

Gỡ lỗi sau khi loại bỏ loại này trong gdb là một chút của nghệ thuật hơn là khoa học.

Công cụ quan trọng nhất đối với nó, theo ý kiến ​​của tôi, là khả năng viết các tập lệnh chạy bên trong gdb. Hướng dẫn sẽ giải thích cho bạn. Lý do tôi thấy điều này rất hữu ích là nó cho phép bạn làm những việc như đi bộ cấu trúc dữ liệu và in ra thông tin abou họ.

Một khả năng khác cho bạn ở đây là thiết lập phiên bản malloc của bạn - viết một hàm malloc mới để lưu số liệu thống kê về những gì đang được phân bổ để bạn có thể xem các bài đăng đó. Bạn có thể, tất nhiên, gọi malloc gốc để thực hiện công việc phân bổ bộ nhớ thực tế.

Tôi xin lỗi vì tôi không thể cung cấp cho bạn một câu trả lời rõ ràng và đơn giản, chỉ đơn giản là sẽ sửa chữa ngay cho bạn ở đây - mà không có công cụ như valgrind đây là một công việc rất khó khăn.

+0

Tôi nên xem xét kịch bản sau đó. Cấu trúc dữ liệu đi bộ là một trợ giúp lớn. – tothphu

0

Bạn có thể sử dụng một công cụ đơn giản như log-malloc.c để biên dịch thành thư viện được chia sẻ LD_PRELOAD trước khi đăng ký và ghi lại tất cả các chức năng malloc -type. Ít nhất nó có thể giúp thu hẹp tìm kiếm trong bãi chứa của bạn.

+0

Bạn có biết về bất kỳ nhật ký 64 bit nào không? – tothphu

2

Nếu Linux của nó, bạn không phải lo lắng về việc làm thống kê cho malloc của bạn. Sử dụng các tiện ích gọi là 'memusage'

cho một chương trình mẫu (sample_mem.c) như dưới đây

#include<stdio.h> 
#include<stdlib.h> 
#include<time.h> 

int main(voiid) 
{ 
     int i=1000; 
     char *buff=NULL; 
     srand(time(NULL)); 

     while(i--) 
     { 
       buff = malloc(rand() % 64); 
       free(buff); 
     } 

     return 0; 
} 

đầu ra của memusage sẽ

$memusage sample_mem 

Memory usage summary: heap total: 31434, heap peak: 63, stack peak: 80 
     total calls total memory failed calls 
malloc|  1000   31434    0 
realloc|   0    0    0 (nomove:0, dec:0, free:0) 
calloc|   0    0    0 
    free|  1000   31434 
Histogram for block sizes: 
    0-15   253 25% ================================================== 
    16-31   253 25% ================================================== 
    32-47   247 24% ================================================ 
    48-63   247 24% ================================================ 

nhưng nếu bạn viết một wapper malloc sau đó bạn có thể làm cho chương trình của bạn coredump sau này nhiều số malloc để bạn có thể có được một đầu mối.

+0

Ý tưởng hay. Nó đã cho tôi một thời gian để tìm ra, nhưng memusage là một phần của phát hành glibc. Tuy nhiên điều này lại một chút tương tự như chạy mã của tôi trong valgrind, mặc dù với chi phí nhỏ hơn nhiều. – tothphu