2009-07-09 20 views
8

Tôi đang gặp khó khăn khi chạy gprof trên OS X. Các tập tin test.c là:Vấn đề với gprof trên OS X: [chương trình] không phải là của kiến ​​trúc máy chủ

#include <stdio.h> 

int main() { 
    printf("Hello, World!\n"); 
    return 0; 
} 

và thiết bị đầu cuối của tôi trông giống như:

$ gcc -pg test.c 
$ gcc -pg -o test test.c 
$ ./test 
Hello, World! 
$ gprof test 
gprof: file: test is not of the host architecture 

Chỉnh sửa: đồng thời, nó không tạo tệp gmon.out.

Điều gì đang xảy ra ở đây?

+0

Đã tạo tệp gmon.out cho bạn chưa? Tôi không thể làm điều đó với ví dụ của bạn. –

+0

Không, không. Tôi quên kiểm tra điều này. Tôi cho rằng điều này có nghĩa là vấn đề bắt đầu sớm hơn? –

Trả lời

9

Một loạt các sự kiện ở đây là nghĩa vụ phải làm việc như sau:

  1. Compile mã với tùy chọn -pg
  2. liên kết mã với tùy chọn -pg
  3. chương trình Run
  4. Chương trình tạo gmon.out file
  5. Chạy gprof

Vấn đề là bước 4 không bao giờ xảy ra. Có rất ít thông tin về sự thất bại cụ thể này. Sự đồng thuận chung trong vài năm qua dường như là Apple thay vì bạn sử dụng cá mập thay vào đó, và họ đã rất lỏng lẻo về việc sửa lỗi và như vậy với gprof.

Tóm tắt: Cài đặt Xcode, man shark

+0

Tôi sẽ phải kiểm tra cá mập. Tôi chưa bao giờ gặp sự cố khi tạo chương trình để tạo 'gmon.out' miễn là chương trình thực sự thoát sạch. IIRC, tùy chọn dòng lệnh profiler chèn mã vào khởi tạo và kết thúc của thời gian chạy để kích hoạt nắm bắt các bộ đếm thời gian và cuối cùng là ghi tệp đầu ra. Chừng nào chương trình còn thoát qua việc trả về từ 'main' hoặc lệnh gọi' exit '() xuất hiện, nó sẽ tạo ra một tệp đầu ra. –

3

Có vẻ như test được tạo bằng cách sử dụng kiến ​​trúc mà gprof không mong đợi. Hãy thử các cách sau:

$ cat > test2.c 
#include <stdio.h> 
int main() { printf("test\n"); return 0; } 
^D 
$ gcc -arch i386 -pg -o test2 test2.c 
$ file test2 
test2: Mach-O executable i386 
$ ./test2 
test 
$ gprof test2 
... bunch of output ... 
$ gcc -arch ppc -pg -o test2 test2.c 
$ file test2 
test: Mach-O executable ppc 
$ ./test2 
test 
$ gprof test2 
gprof: file: test2 is not of the host architecture 
$ arch -ppc gprof test2 
... same bunch of output ... 

MacOS mới hơn hỗ trợ chạy các tệp thi hành từ kiến ​​trúc IBM PPC và Intel x86. Một số chuỗi công cụ có vẻ hơi dày đặc về điều này. Gprof dường như mong đợi thực thi được trong kiến ​​trúc bản địa. Tuy nhiên, nếu bạn sử dụng tiện ích arch để buộc triển khai kiến ​​trúc không phải là bản địa, thì nó có vẻ hoạt động đúng. Đã có một discussion about this in another context một chút trước đây. Tôi đã bao gồm một số liên kết hữu ích và một số thông tin khác tại đó.

+0

Khi tôi biên dịch hoặc với i386 -arch hoặc -arch ppc, tôi nhận được lỗi tương tự từ gprof (và không có tệp gmon.out nào được tạo trong cả hai trường hợp) –

+0

Điều đó lạ ... thường một hoặc cái kia sẽ hoạt động. Bạn đang chạy phiên bản phần cứng và hệ điều hành nào? Lỗi này chắc chắn là do sự không khớp giữa kiến ​​trúc thực thi và kiến ​​trúc máy chủ. Điều này được đề cập một cách rõ ràng trong trang hướng dẫn 'gprof' dưới _UNIVERSAL FILE SUPPORT_ trên MacBook Pro của tôi - Intel Core 2 Duo, OS 10.5.7. Bạn cũng có thể sử dụng 'arch' không có đối số để xem kiến ​​trúc gốc là gì và xem 'gcc -v' để xem đặc tả' --target = 'cho trình biên dịch là gì. –

+0

Tôi cũng đang sử dụng OS 10.5.7, Intel Core 2 Duo. Gọi 'arch' trả về' i386', và 'gcc -v' hiển thị' Mục tiêu: i686-apple-darwin9' –

4

Thật không may, gprof không hoạt động trên Mac OS X. Bạn có thể muốn sử dụng Shark để thay thế. Nó là một phần của các công cụ phát triển trong số /Developer/Applications/Performance Tools/Shark.

Cập nhật: Dường như gprof hiện đang hoạt động trên Mac OS X 10.6 (Snow Leopard), sử dụng Công cụ dành cho nhà phát triển mới nhất.

+0

Bất kỳ lý do gì khiến gprof không hoạt động trên OS X? OSX không phải là công cụ thân thiện với UNIX? –

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