2009-12-03 12 views
19

Tôi đang làm việc trên môi trường Linux. Tôi có hai 'C' nguồn gói đào tạo và test_train.gprof: Cách tạo biểu đồ cuộc gọi cho các chức năng trong thư viện được chia sẻ được liên kết với chương trình chính

  1. gói đào tạo khi biên soạn tạo libtrain.so
  2. liên kết test_train để libtrain.so và tạo ra thực thi đào tạo kiểm tra

Bây giờ tôi muốn tạo ra một đồ thị cuộc gọi sử dụng gprof đó cho biết thứ tự gọi của các hàm trong chương trình chính cũng như các hàm bên trong libtrain.so

Tôi đang biên dịch và liên kết cả hai gói với tùy chọn -pg và mức gỡ lỗi là o0. Sau khi tôi thực hiện ./train-test, gmon.out được tạo. Sau đó, tôi làm:

$ gprof -q ./train-test gmon.out 

Ở đây, đầu ra chương trình gọi đồ thị của hàm trong tàu kiểm tra nhưng không phải trong libtrain.so

gì có thể là vấn đề?

Trả lời

17

gprof sẽ không hoạt động, bạn cần sử dụng sprof để thay thế. Tôi tìm thấy những liên kết hữu ích:

Tóm tắt thông tin từ liên kết 2:

  1. Biên dịch thư viện chia sẻ của bạn (libmylib.so) trong debug (-g) chế độ. Không có -pg.
  2. xuất khẩu LD_PROFILE_OUTPUT = `pwd`
  3. xuất khẩu LD_PROFILE = libmylib.so
  4. rm -f $ LD_PROFILE.profile
  5. thực hiện chương trình của bạn mà tải libmylib.so
  6. sprof path-to-LIB/$ LD_PROFILE $ LD_PROFILE.profile -p> log
  7. Xem nhật ký.

Tôi thấy rằng ở bước 2, cần phải là thư mục hiện có - nếu không bạn sẽ nhận được cảnh báo hữu ích. Và ở bước 3, bạn có thể cần phải chỉ định thư viện là libmylib.so.X (thậm chí có thể .X.Y, không chắc chắn) - nếu không bạn sẽ không nhận được cảnh báo nào.

+0

Lưu ý đáng chú ý là thường bạn có thể tìm ra tên của thư viện mà nhị phân của bạn đang cố gắng tải (mylib.so vs mylib.so.1 so với mylib.so.1.1 etc) bằng cách chạy 'ldd' trên ứng dụng . Điều này chỉ nên không có một mục nếu thư viện được mở thông qua một cuộc gọi dlopen trực tiếp. –

+1

lỗi quá xấu bị lỗi nghiêm trọng, như trong [câu hỏi này] (http://stackoverflow.com/questions/6216979/what-is-causing-sprof-to-complain-about-inconsistency-detected-by-ld-so) –

+0

Nếu sprof không đi kèm với MinGW, trình biên dịch được chọn cho dự án của tôi thì sao? – Charles

0

Nếu bạn không sử dụng Linux (như tôi trên Solaris), bạn sẽ không may mắn vì không có sprof ở đó. Nếu bạn có các nguồn thư viện của mình, bạn có thể giải quyết vấn đề của mình bằng cách liên kết một thư viện tĩnh và tạo nhị phân lược tả của bạn với một thư viện thay thế. Một cách khác mà tôi quản lý để theo dõi cuộc gọi đến thư viện được chia sẻ, bằng cách sử dụng truss. Với tùy chọn -u [!]lib,...:[:][!]func, ... người ta có thể có được một bức tranh đẹp về lịch sử cuộc gọi của một cuộc chạy. Nó không hoàn toàn giống như profiling nhưng có thể rất hữu ích trong một số kịch bản.

1

Tôi đang tải thư viện của mình từ Python và không có bất kỳ may mắn nào với sprof.Thay vào đó, tôi đã sử dụng oprofile, đó là trong kho Fedora, ít nhất là:

operf --callgraph /path/to/mybinary

Chờ cho ứng dụng của bạn để kết thúc hoặc làm CTL-c để ngăn chặn hồ sơ. Bây giờ chúng ta hãy tạo ra một bản tóm tắt hồ sơ:

opreport --callgraph --symbols

Xem documentation để giải thích nó. Đó là một mớ hỗn độn. Trong báo cáo được tạo, mỗi biểu tượng được liệt kê trong một khối riêng của nó. Biểu tượng chính của khối là biểu tượng không bị thụt vào. Các mục ở trên là các hàm gọi hàm đó, và các hàm bên dưới là những thứ được gọi bởi hàm đó. Tỷ lệ phần trăm trong phần dưới đây là lượng thời gian tương đối được sử dụng trong các callees đó.