2012-11-27 43 views
10

Tôi đang phát triển ứng dụng C++ 64 bit được liên kết tĩnh trên CentOS 5.8 64 bit bằng gói gcc 4.4 chuẩn từ kho lưu trữ CentOS. Dường như nó đang sử dụng nhiều bộ nhớ hơn tôi mong đợi, vì vậy tôi đã thử sử dụng khối lượng để cấu hình mức sử dụng bộ nhớ. Tôi đã biên soạn với các thông tin gỡ lỗi và sau đó chạyCông cụ khối lượng của Valgrind sẽ không hồ sơ ứng dụng của tôi

valgrind --tool = Massif ./MyProg

từ thư mục nơi MyProg cư trú. Nó không bao giờ tạo ra bất kỳ kết quả nào khác ngoài ví dụ massif.out.XXXX sau đây.

desc: (none) 
cmd: ./MyProg 
time_unit: i 
#----------- 
snapshot=0 
#----------- 
time=0 
mem_heap_B=0 
mem_heap_extra_B=0 
mem_stacks_B=0 
heap_tree=empty 

Lưu ý rằng toàn bộ nội dung của tệp và chương trình của tôi có thể chạy trong nhiều phút.

Tôi đã thử các tùy chọn khác nhau để valgrind và massif không có kết quả. Tôi thậm chí đã cố gắng sử dụng đường dẫn tuyệt đối để MyProg, chỉ trong trường hợp. Tôi đã thử tải phiên bản ổn định gần đây nhất của valgrind (3.8.1) và biên dịch và chạy (kể từ CentOS đang sử dụng 3.5.0) với cùng một kết quả. Là một kiểm tra sanity Tôi chạy

valgrind --tool = ls -l khối núi

và nó tạo ra nhiều bức ảnh chụp với việc sử dụng khác không nhớ như mong đợi.

Tôi đã thử tìm kiếm trực tuyến bằng mọi kết hợp từ khóa tôi có thể nghĩ đến nhưng không tìm thấy bất kỳ vấn đề tương tự nào.

Là một lưu ý phụ, tôi có thể cấu hình thành công ứng dụng bằng cách sử dụng công cụ memcheck mặc định của valgrind, trong trường hợp đó là thông tin hữu ích.

Có ai biết tại sao khối lượng không thể lập hồ sơ ứng dụng của tôi không?

+0

Chương trình của bạn có được liên kết tĩnh không? Nếu bạn làm một 'ldd ./MyProg', nó có liệt kê một loạt các thư viện được chia sẻ, hay nó không in được gì? –

+0

Nó được liên kết tĩnh. Tôi đã chỉnh sửa câu hỏi để làm rõ điều này. – Tyson

Trả lời

9

Nếu ứng dụng được liên kết tĩnh, nó không thể được phân tích bằng cách sử dụng valgrind. Valgrind hoạt động bằng cách cung cấp phiên bản riêng của nó về các hàm phân bổ cho chương trình của bạn, mà nó hoàn thành bằng cách ghi đè tra cứu động.

Nếu bạn có thể liên kết động với các thư viện chuẩn (libc và libstdC++), thì có lẽ nó sẽ có thể thực hiện phân tích bộ nhớ mà bạn đang tìm kiếm.

Từ Valgrind FAQ:

Thứ hai, nếu chương trình của bạn được liên kết tĩnh, hầu hết các công cụ Valgrind sẽ không làm việc là tốt, bởi vì họ sẽ không thể thay thế chức năng nhất định, chẳng hạn như malloc, với họ phiên bản riêng.

+0

Cảm ơn. Tôi đã bỏ lỡ phần FAQ đó. Sau khi thay đổi thành liên kết động một phần, tôi có thể lấy hồ sơ. – Tyson

+0

Dựa trên [cuộc trò chuyện] (http://thread.gmane.org/gmane.comp.debugging.valgrind/12653) trên danh sách gửi thư của người dùng valgrind, valgrind sẽ có thể phân tích các ứng dụng được liên kết tĩnh từ phiên bản 3.8.1 trên. Theo yêu cầu trong danh sách gửi thư, tôi đã gửi một [bug] (https://bugs.kde.org/show_bug.cgi?id=311093) về việc này. – Tyson

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