Có thể kiểm tra xem chương trình đã cho có được biên dịch bằng công cụ GNU gprof không, tức là với cờ '-pg' được truyền cho cả trình biên dịch và trình liên kết, mà không chạy nó để kiểm tra xem nó có tạo gmon.out
tệp không?
Có thể kiểm tra xem chương trình đã cho có được biên dịch bằng công cụ GNU gprof không, tức là với cờ '-pg' được truyền cho cả trình biên dịch và trình liên kết, mà không chạy nó để kiểm tra xem nó có tạo gmon.out
tệp không?
Câu trả lời:
Bạn có thể kiểm tra các tham chiếu đến chức năng mcount
(hoặc có thể _mcount
hoặc __mcount
theo Thực hiện Hồ sơ ). Chức năng này là cần thiết để định hình để làm việc, và nên vắng mặt cho các nhị phân không định hình.
Cái gì đó như:
$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"
Các công việc trên trên một bài kiểm tra nhanh ở đây.
Thêm nhiều hơn vào câu trả lời:
Để kiểm tra thiết bị, grep cho mcount / gmon:
$ readelf -s <binary> | egrep "gmon|mcount"
20: 0000000000401160 63 FUNC GLOBAL DEFAULT 12 __gmon_start__
28: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@GLIBC_2.2.5 (2)
36: 0000000000000000 0 FILE LOCAL DEFAULT ABS gmon-start.c
39: 00000000004011a0 0 FUNC LOCAL DEFAULT 12 call_gmon_start
100: 0000000000401160 63 FUNC GLOBAL DEFAULT 12 __gmon_start__
114: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@@GLIBC_2.2.5
Người ta cần biên dịch cũng như liên kết với -pg
cờ, nếu không gmon.out
sẽ không được tạo. liên kết stackoverflow.
Tôi thấy rằng tệp nhị phân mà tôi đang chạy gprof không tạo ra bất kỳ gmon.out
tệp nào , mặc dù biên dịch / liên kết với -pg
cờ. Lý do là - tôi đã giết ứng dụng của mình, đó không phải là một lối thoát sạch sẽ. gprof
chỉ tạo đầu ra khi chương trình thoát bình thường. liên kết stackoverflow