在OS X上使用gprof出现问题:[程序名]不符合主机架构。

9

我在OS X上运行gprof时遇到了麻烦。文件test.c如下:

#include <stdio.h>

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

我的终端看起来像这样:
$ gcc -pg test.c
$ gcc -pg -o test test.c
$ ./test
Hello, World!
$ gprof test
gprof: file: test is not of the host architecture

编辑:此外,它也不会生成gmon.out文件。

这里出了什么问题?


它是否已经为您生成了gmon.out文件?使用您的示例,我无法让它执行该操作。 - Grant Limberg
不,它没有。我忘记检查这个了。我想这意味着问题开始得更早? - Jesse Beder
3个回答

9
这里的事件序列应该按照以下步骤进行:
  1. 使用-pg选项编译代码
  2. 使用-pg选项链接代码
  3. 运行程序
  4. 程序生成gmon.out文件
  5. 运行gprof
问题在于第4步从未发生。关于这个特定故障很少有信息。过去几年中一般的共识似乎是,苹果公司更愿意使用shark,并且他们一直对修复gprof的错误等问题非常宽容。
简而言之:安装Xcode,使用man shark

我得去看看shark。只要程序干净地退出,我从来没有遇到过无法生成gmon.out的问题。如果我没记错的话,分析器命令行选项会在运行时的初始化和终止时插入代码以触发运行时计数器的捕获,并最终写入输出文件。只要程序通过从main返回或显式调用exit()退出,它就应该生成一个输出文件。 - D.Shawley

4
很遗憾,gprof在Mac OS X上无法使用。你可能需要使用Shark代替。它是开发者工具的一部分,位于/Developer/Applications/Performance Tools/Shark中。
更新:看起来gprof现在可以在Mac OS X 10.6(Snow Leopard)上使用,使用最新的开发者工具即可。

为什么 gprof 在 OS X 上不能工作?难道 OS X 不应该支持 UNIX 工具吗? - Jesse Beder

3

看起来 test 是使用了 gprof 不支持的架构。尝试以下操作:

$ 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支持从IBM PPC和Intel x86架构运行可执行文件。部分工具链似乎对此有些困惑。Gprof似乎期望可执行文件以本机架构运行。然而,如果您使用arch实用程序强制执行非本机架构,则它似乎可以正常工作。之前有一个讨论与此相关。我在那里包含了一些有用的链接和更多信息。

1
当我使用-arch i386或-arch ppc编译时,我从gprof得到相同的错误(在任何一种情况下都不会生成gmon.out文件)。 - Jesse Beder
很奇怪...通常其中一个会起作用。您使用的是什么硬件和操作系统版本?错误绝对是由可执行文件架构与主机架构不匹配引起的。在我的MacBook Pro - Intel Core 2 Duo,OS 10.5.7下,在gprof手册页面的_UNIVERSAL FILE SUPPORT_下明确提到了这一点。您还可以使用arch而不带参数来查看本地架构,并查看gcc -v以查看编译器的--target=规范。 - D.Shawley
我也使用OS 10.5.7,Intel Core 2 Duo。调用“arch”返回“i386”,而“gcc -v”显示“Target: i686-apple-darwin9”。 - Jesse Beder
你可以尝试通过指定多个架构来创建一个fat文件。类似gcc -arch ppc -arch i686 -pg -o test test.c这样的命令会生成一个包含两种架构的二进制文件。在我的系统中,Gprof可以处理这个文件。根据你所说的,gcc应该会生成一个符合gprof预期的i686可执行文件。看一下arch手册页面,其中描述了一堆可能更改这个设置的系统设置(如环境变量等)。 - D.Shawley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接