Làm thế nào để hồ sơ một chương trình C trong Linux bằng cách sử dụng GNU gprof
Hiệu suất là một trong những thách thức lớn nhất mà các lập trình viên phải đối mặt khi phát triển phần mềm. Đó là lý do tại sao mã hóa hồ sơ là một trong những khía cạnh quan trọng nhất của phát triển phần mềm, vì nó cho phép bạn xác định tắc nghẽn, mã chết, và thậm chí cả lỗi. Nếu bạn là một lập trình viên phát triển các ứng dụng phần mềm cho Linux, thì trình biên dịch GNU "gprof" là công cụ để tìm kiếm.
Tải xuống và cài đặt
Gprof được cài đặt sẵn với hầu hết các bản phân phối Linux, nhưng nếu đó không phải là trường hợp với bản phân phối Linux của bạn, bạn có thể tải xuống và cài đặt nó thông qua trình quản lý gói dòng lệnh như apt-get
hoặc yum
. Ví dụ, hãy chạy lệnh sau để tải xuống và cài đặt gprof trên các hệ thống dựa trên Debian:
sudo apt-get cài đặt binutils
Yêu cầu
Trước khi bạn sử dụng gprof để tạo dữ liệu lược tả, hãy đảm bảo rằng chương trình thực thi chương trình của bạn chứa thông tin bổ sung được yêu cầu bởi trình hồ sơ để hoạt động đúng. Điều này có thể đạt được bằng cách thêm tùy chọn dòng lệnh -pg
trong khi biên dịch mã của bạn, giả sử rằng bạn đang sử dụng trình biên dịch gcc
. Nếu bạn đang sử dụng các lệnh riêng biệt để biên dịch và liên kết, hãy thêm tùy chọn dòng lệnh cho cả hai lệnh.
Sử dụng gprof
Xem xét chương trình C sau đây làm ví dụ:
#include void func2 () {int count = 0; cho (count = 0; count <0XFFFFF; count ++); trở về; } void func1 (void) {int count = 0; cho (count = 0; count <0XFF; count ++) func2 (); trở về; } int main (void) {printf ("\ n Xin chào thế giới! \ n"); func1 (); func2 (); trả về 0; }
Như được mô tả trong phần trước, biên dịch mã bằng tùy chọn -pg
:
gcc -Wall -pg test.c -o kiểm tra
Sau khi biên dịch, chạy chương trình:
./kiểm tra
Sau khi thực hiện thành công, chương trình sẽ tạo một tệp có tên "gmon.out" chứa thông tin lược tả, nhưng ở dạng thô, có nghĩa là bạn không thể mở tệp và đọc trực tiếp thông tin. Để tạo tệp có thể đọc được của con người, hãy chạy lệnh sau:
gprof test gmon.out> prof_output
Lệnh này ghi tất cả thông tin định dạng trong định dạng có thể đọc được của con người vào tệp "prof_output". Lưu ý rằng bạn có thể thay đổi tên tệp đầu ra theo sự thuận tiện của bạn.
Cấu hình phẳng và biểu đồ Gọi
Nếu bạn mở tệp chứa dữ liệu lược tả, bạn sẽ thấy thông tin được chia thành hai phần: Cấu hình phẳng và Biểu đồ cuộc gọi. Mặc dù trước đây chứa các chi tiết như số lượng cuộc gọi hàm, tổng thời gian thực hiện trong một hàm và hơn thế nữa, phần sau mô tả cây gọi của chương trình, cung cấp chi tiết về hàm cha và con của một hàm cụ thể.
Ví dụ: dưới đây là cấu hình Phẳng trong trường hợp của chúng tôi:
Mỗi mẫu được tính là 0, 01 giây. % tổng số tự tích lũy thời gian tự giây gọi là ms / call ms / tên gọi 100.00 0.94 0.94 256 3.67 3.67 func2 0.00 0.94 0.00 1 0.00 936.33 func1
Dưới đây là biểu đồ Cuộc gọi:
chỉ số% thời gian tự trẻ được gọi là tên 0, 00 0, 00 1/256 chính [2] 0, 94 0, 00 255/256 func1 [3] [1] 100, 0 0, 94 0, 00 256 func2 [1] -------------- --------------------------------- [2] 100.0 0, 00 0, 94 chính [2] 0, 00 0, 94 1/1 func1 [ 3] 0, 00 0, 00 1/256 func2 [1] --------------------------------------- -------- 0, 00 0, 94 1/1 chính [2] [3] 99, 6 0, 00 0, 94 1 func1 [3] 0, 94 0, 00 255/256 func2 [1] ------------- ----------------------------------
Lưu ý rằng giải thích chi tiết về các trường này có trong tệp chứa thông tin lược tả (prof_output trong trường hợp này) và được tạo ra mỗi khi trình lược tả được chạy. Để tắt các chi tiết, sử dụng tùy chọn dòng lệnh -b
với lệnh gprof
.
Một số điểm quan trọng
- Để viết tệp
gmon.out
đúng cách, chương trình của bạn phải thoát bình thường. Tệp không được tạo ra khi chương trình thoát ra bằng cách gọi_exit()
hoặc kết thúc bất thường do tín hiệu chưa xử lý. - Tệp "gmon.out" luôn được tạo trong thư mục làm việc hiện tại. Vì vậy, hãy đảm bảo rằng chương trình của bạn có đủ đặc quyền để tạo tệp trong thư mục hiện tại.
- Một công cụ bên ngoài bằng tên gprof2dot có thể được sử dụng để chuyển đổi đồ thị cuộc gọi từ gprof thành dạng đồ họa.
- Sử dụng gprof, bạn cũng có thể tạo danh sách nguồn được chú thích cung cấp ý tưởng về số lần mỗi dòng của chương trình được thực thi. Để tạo ra thông tin này, hãy biên dịch chương trình bằng
-g
(cùng với tùy chọn-pg
giải thích trước đó) và chạy lệnhgprof
với tùy chọn-A
command line.