2012-05-12 21 views
12

Tôi đang cố gắng lập hồ sơ một số chương trình C++ trên MacOSX. Vì vậy, tôi đã xây dựng google-perftools, đã viết một chương trình, được biên dịch bằng MacPorts g ++ 4.7, với cờ biên dịch -g và được liên kết với libprofiler. Sau đó, tôi chạy:Số dòng trong lược tả CPU của Google Perftools trên MacOSX

CPUPROFILE=cpu.profile ./a.out 

Sau đó, tôi chạy pprof để tạo ra kết quả:

[hidden ~]$ pprof --text ./a.out cpu.profile 
Using local file ./a.out. 
Using local file cpu.profile. 
Removing __sigtramp from all stack traces. 
Total: 282 samples 
    107 37.9% 37.9%  107 37.9% 0x000000010d72229e 
     16 5.7% 43.6%  16 5.7% 0x000000010d721a5f 
     12 4.3% 47.9%  12 4.3% 0x000000010d721de8 
     11 3.9% 51.8%  11 3.9% 0x000000010d721a4e 
     9 3.2% 55.0%  9 3.2% 0x000000010d721e13 
     8 2.8% 57.8%  8 2.8% 0x000000010d721a64 
     7 2.5% 60.3%  7 2.5% 0x000000010d7222f0 
     6 2.1% 62.4%  6 2.1% 0x000000010d721a4c 
     6 2.1% 64.5%  6 2.1% 0x000000010d721b1f 
     6 2.1% 66.7%  6 2.1% 0x000000010d721e0c 
     5 1.8% 68.4%  5 1.8% 0x000000010d721fba 
    ...... 

Dường như perftools không chuyển đổi các địa chỉ thực hiện chức năng tên.

Có ai biết tôi thiếu gì ở đây không? Tôi nên làm gì để cho profiler tạo ra kết quả chính xác.

EDIT: Thông tin khác: nó không phải là vấn đề của pprof hoặc google-perftools, nhưng nhiều hơn như gcc hoặc macosx, bởi vì Instrument.app cũng hiển thị địa chỉ thay vì số dòng. Tôi không quen với cách các biểu tượng gỡ lỗi hoạt động trên Mac OS X, vì vậy tôi sẽ nghĩ nó là thứ thiếu sót của tôi ở đây, thay vì bị lỗi trong gcc hoặc Mac OS X. Tôi tự hỏi liệu có ai có thể cung cấp một số gợi ý về cách hoạt động của thông tin gỡ lỗi hay không cho Mac OS X.

+0

"Tôi đang thử hồ sơ một số chương trình C++" Vậy tại sao bạn gắn thẻ câu hỏi này là C? –

+0

Vấn đề này không cụ thể đối với C++ mà còn cho C. –

+0

Tôi không quen với HĐH X và googleperf, nhưng tôi đã sử dụng profiling libs trước đây và cũng như cờ -g để gỡ lỗi, chúng tôi phải thêm cờ -p vào trình biên dịch và trình liên kết để lấy chi tiết hồ sơ .. – fduff

Trả lời

4

Tôi tin rằng nền tảng này các biểu tượng gỡ lỗi nằm trong tệp .o, chúng không được chuyển sang tệp thi hành. Để nhận các ký hiệu trong gdb hoặc profilers, bạn cần lưu các tệp .o. Điều này có nghĩa là bạn cần biên dịch ứng dụng của mình theo hai bước (biên dịch, sau đó liên kết) để bảo toàn các tệp .o.

Xem this question để biết thêm thông tin.

Khi xem mã nguồn Perl của pprof, tên biểu tượng thu được thông qua việc sử dụng nmc++filt, vì vậy bạn có thể thử chạy những độc lập đó và tìm ra lý do tại sao chúng không hoạt động. Từ nguồn pprof nó trông giống như nó cố gắng một loạt các đối số dòng lệnh khác nhau để bao gồm một số phiên bản của nm. Đây là tóm tắt về các cách

nm [-D] -n [-f] [--demangle] tệp đối tượng 2>/dev/nul [| cpp + filt]

Các phần mà tôi đặt trong ngoặc là những phần mà tập lệnh xác định khi chạy nếu được yêu cầu cho nền tảng và phiên bản nm và C++ filt của bạn. Hãy thử tất cả các kết hợp của các bên trên và xem những gì hoạt động. Sau đó, xem những gì kịch bản pprof hiện, có thể bằng cách thêm một số printfs vào nó.

Chúc may mắn.

+0

Nó không giúp ích gì. Tôi đã thử lưu các tệp .o nhưng pprof vẫn in địa chỉ thay vì số dòng. –

+0

Vấn đề không phải là pprof, tôi sẽ làm việc trong gdb để có được những biểu tượng này được tải, có thể cung cấp cho bạn một ý tưởng về những gì đang diễn ra. Có thể tệp .o nằm trong một thư mục khác với dự kiến. – Miguel

+0

tôi đã có một số tiến bộ về vấn đề này:. Nếu tôi bắt đầu chương trình sử dụng 'CPUPROFILE = cpu.profile gdb/a.out', sau đó 'start' và' cont' bên trong 'gdb', tôi có thể nhận được những biểu tượng một cách chính xác. Vì vậy, tôi đoán nó có thể là vấn đề của google-perftools mà không tải các biểu tượng nếu tôi bắt đầu chương trình bình thường, do đó địa chỉ được ghi bên trong 'cpu.profile' là không chính xác. Vì 'gdb' khá chậm và không thực tế để chạy mọi lúc, tôi thực sự cần khởi động chương trình bình thường mà không có' gdb'. Vì vậy, bạn có bất kỳ ý tưởng làm thế nào tôi có thể làm cho nó hoạt động? Cảm ơn. –

6

này dường như có liên quan đến các địa chỉ bố trí không gian ngẫu nhiên (ASLR) giới thiệu trong OS X 10.5

Tôi đã nộp issue #562 trên tracker gperftools vấn đề. Bạn có thể tắt ASLR bằng cách chuyển -Wl,-no_pie.

Ngoài ra, nếu bạn không bị ràng buộc sử dụng gperftools, Instruments (đi kèm với Xcode) đáng để thử.

+0

Cảm ơn, điều này chính xác. -Wl, -no_pie làm cho pprof làm việc "ra khỏi hộp" trên Mac OS. – Ogre