2013-09-22 35 views
5

Biên soạn chương trình C++ bằng cách sử dụng gcc -pg -g (ít nhất, đó là những arg tôi đã cung cấp trong Makefile; không có bất kỳ bằng chứng cứng nào về lệnh được thực hiện) . Chương trình chạy đến mức hoàn thành bình thường với CWD được đặt vào thư mục chính của tôi. Không có tệp gmon.out nào được viết.gmon.out không được viết sau khi biên dịch với gcc -pg -g

gcc là 4.4.7. Hệ điều hành là centos 6.

Chương trình của tôi được khởi chạy bởi một daemon Perl được cuộn bằng tay bằng fork/exec. Tôi đã xác minh rằng CWD là thư mục chính của tôi, và nó có thể ghi được, bằng cách có daemon thực hiện touch foo ngay trước khi thực hiện chương trình đích của tôi. Theo như tôi đã có thể nghiên cứu, điều này không nên ảnh hưởng đến hồ sơ của chương trình hoặc viết gmon.out khi nó chấm dứt (bình thường).

Trả lời

1

Có lẽ bạn đã giải quyết được tháng này trước, nhưng tôi gặp phải tác dụng hiện nay vì vậy tôi có thể trả lời cho du khách trong tương lai:

Không thông báo lỗi được hiển thị, gmon.out chỉ không được tạo ra (và các văn bản phân tích -file sẽ trống.

Một lý do tại sao điều này có thể là nếu bạn không có phương pháp main hoặc trong trường hợp -mwindows a WinMain. Ví dụ. nếu bạn sử dụng đối số trình biên dịch (gcc) -e hoặc (vc) /entry hoặc sử dụng __main.

Tôi đã xem qua hướng dẫn sử dụng gprof nhưng không tìm thấy thông tin về cách cho nó biết điểm vào nên tôi đã thay đổi mã.

5

Chạy cùng vấn đề này, g ++ 4.8.2 trên CentOS 7. -pg có mặt để biên dịch và liên kết, chạy quá trình & nó thoát bình thường, không có gmon.out được tạo.

Tôi đã sửa lỗi này bằng cách thay thế cuộc gọi thành _exit(status) bằng exit(status). Lưu ý rằng trước đây là _exit (3), một cuộc gọi hệ thống, và sau đó là thoát (2), một phương thức thư viện chuẩn.

Tại sao tính năng này hoạt động? Từ trang người dùng gprof:

Chương trình được định cấu hình phải gọi là "thoát" (2) hoặc trở lại bình thường để lưu thông tin hồ sơ trong tệp gmon.out.

Dường như việc viết gmon.out phụ thuộc vào lối ra (cấp cao hơn) (2). Vì vậy, hãy kiểm tra để chắc chắn rằng mã đang sử dụng exit (2) (từ stdlib) và không phải _exit (3) (gọi hệ thống).

+0

Cảm ơn! Tôi cũng có chính xác vấn đề đấy. – brokenfoot

0

Đây thực sự là muộn, nhưng đối với những người bạn của những người đang gặp khó khăn, sau khi bạn biên dịch mã của bạn với -pg, bạn cần phải chạy file thực thi cho nó để tạo ra gmon.out

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