Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Mac OS X上从命令行配置文件?_C++_C_Macos_Profiling_Gprof - Fatal编程技术网

C++ 如何在Mac OS X上从命令行配置文件?

C++ 如何在Mac OS X上从命令行配置文件?,c++,c,macos,profiling,gprof,C++,C,Macos,Profiling,Gprof,我试图使用命令行工具在Mac OS X上评测C/C++代码,我使用-pg选项和gcc在Linux上运行gprof,但我似乎在Mac上找不到gprof,即使我在本页中有描述:或 我安装了命令行工具,因此可以使用其他命令行工具,如otool和atos。我在谷歌上找到了这个页面(),上面写着不支持gprof,但我不确定什么时候有一个苹果文档描述了这个工具;无论如何,我尝试使用brew下载gprof,但没有成功 我找到了,但是我没有仪器-t的输出。我也发现了,但我不想打开仪器,因为我想自动化一些过程,并

我试图使用命令行工具在Mac OS X上评测C/C++代码,我使用
-pg
选项和
gcc
在Linux上运行
gprof
,但我似乎在Mac上找不到
gprof
,即使我在本页中有描述:或

我安装了命令行工具,因此可以使用其他命令行工具,如
otool
atos
。我在谷歌上找到了这个页面(),上面写着不支持
gprof
,但我不确定什么时候有一个苹果文档描述了这个工具;无论如何,我尝试使用
brew
下载
gprof
,但没有成功

我找到了,但是我没有
仪器-t的输出。我也发现了,但我不想打开仪器,因为我想自动化一些过程,并尝试保持跨平台系统

  • 如何在Mac OS X上使用gprof?我使用OSX10.10
  • 无论是否使用
    gprof
    ,如何从命令行配置文件

在@osgx的帮助下,我能够使用gperftools(
pprof
)。这是一个问题,也是脚本的要点。为方便起见,以下是内联脚本:

#!/usr/bin/env bash
# Licensed under the Unlicense. Full text at (http://unlicense.org/) - CrazyPython
g++ -std=c++11 $1 -o ./.executables/profiler/$(basename $1 .cpp) -g -O -lprofiler
echo "Finished compiling + linking"
CPUPROFILE=$1.out ./.executables/profiler/$(basename $1 .cpp)
./.executables/profiler/$(basename $1 .cpp)
pprof ./.executables/profiler/$(basename $1 .cpp) $1.out

警告:我试图清理一下。它可能包含许多不必要的选项。

听说OSX没有
gprof
profiler很奇怪。OSX是经过认证的unix,unix的探查器是
gprof
(基于
profil
syscall/library函数,其中有:)

GNU gprof(binutils的一部分)存在问题,根据(2014;感谢Sreekanth Nagareddy用户删除的回答),
brew安装-v binutils
“***以下子目录不支持此配置:…ld gas gprof”;GNU gprof自述文件(2012)“支持的平台”中没有列出OSX(仅列出OSF/1、SunOS、Solaris和HP-UX;我认为它应该适用于Hurd和Linuxes)

但也有gprof的BSD实现(检查历史和参考)。没有尝试在OSX上运行它(没有OSX,也没有比1995年台式机和笔记本电脑更新的Biten Apple)

BSD gprof有不同的来源,例如FreeBSD的版本()或古老的4.3BSD原始版本。这两种变体都不支持OSX中使用的Mach-O格式

甚至在达尔文的cctools中也有苹果自己的gprof(基于NetBSD/OpenBSD的BSD gprof)(达尔文是OSX内核和用户空间的UNIX部分;它是/曾经/将是开源的):/(一些旧的FreeBSD代码和GNU疯狂的自由思想的混合体)

gprof的可用性可能取决于确切的OSX版本或Xcode版本/软件包;根据2012年甚至2001年的某些版本,10.6.1有gprof:

在命令行中使用
仪器有多种不同的用法(Xcode工具的一部分?),不知道具体如何使用,但知道仪器是现代的,并且功能丰富

还有一个
iprofiler
命令行界面,用于收集
Instruments.app
的配置文件,刚才提到了它的手册页(Xcode Tools 5.0版的一部分;来自站点遗留部分的手册页)

有第三方分析器,声明支持OSX。我知道其中两个:valgrind和gperftools(googleperftools)

valgrind不是一个剖析器;它是一个(缓慢的)动态仪器平台,上面有许多工具。它包括两个能够分析的工具:
callgrind
cachegrind
。Valgrind和这两个工具都不是本机分析器,它们不评测应用程序,因为它将在现实生活中的真实cpu上运行。相反,valgrind在虚拟机上执行程序,并使用计数器调用Grind/cachegrind仪器机器代码

callgrind()使用每个线性指令块的计数器来计算“每条指令将执行多少次”(“Ir”事件,用于按使用时间的百分比获取配置文件排序函数);它还记录调用/返回以生成callgraph。“Ir”事件计数对于获取指令执行计数是正确的(它也可以模拟分支预测);但它不能用来估计实际运行时间。真正的cpu(称为超标量的高性能cpu;无序cpu也是超标量的)能够在每个cpu时钟周期执行多条指令;它通常也无法执行任何指令,因为它们可能希望启动某些数据(来自远缓存、内存、系统调用或其他高延迟指令的数据;或者cpu预测失误的分支导致指令地址尚未读取/解码)。大多数渐进式CPU甚至可能不执行某些命令(有些CPU每个周期最多可以执行8“
nop
”,一些Intel的Sandy/Ivy桥接器和更新的CPU不会花费任何时间在“
xor eax,eax
”上,将零写入寄存器;它们只是将下一个寄存器的使用情况重新映射到零物理寄存器)。与硬件CPU上的实际运行相比,callgrind在评测运行时的速度通常要慢10-20秒

Cachegrind实现了与callgrind(“Ir”,分支)相同的检测,但也可以模拟缓存层次结构(缓存加载/存储/未命中事件)。它比callgrind慢

callgrind和cachegrind的输出可以使用GUI工具kcachegrind(,它可能在操作系统中工作)或命令行工具
callgrind\u annotate
查看

另一个工具是gperftools(googleperftools),它在真正的CPU上运行程序。要使用它,请使用自制软件安装它,然后将程序与libprofiler链接(将
-Lpath\u添加到\u已安装的\u gperftools-lprofiler
),并将
CPUPROFILE
环境变量设置为某个文件名(
CPUPROFILE=profile01.\u程序)运行。它将使用间隔计时器(
setitimer
)评测程序,并将评测数据输出到文件名,文件名在
CPUPROFILE
env var中定义。然后您可以在命令行中查看评测数据
#!/usr/bin/env bash
# Licensed under the Unlicense. Full text at (http://unlicense.org/) - CrazyPython
g++ -std=c++11 $1 -o ./.executables/profiler/$(basename $1 .cpp) -g -O -lprofiler
echo "Finished compiling + linking"
CPUPROFILE=$1.out ./.executables/profiler/$(basename $1 .cpp)
./.executables/profiler/$(basename $1 .cpp)
pprof ./.executables/profiler/$(basename $1 .cpp) $1.out