问题标签 [gperftools]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 使用带有排序的 gperftools 时分析计时器已过期
我花了一整天试图让gperftools工作:/
我厌倦了不同的 libunwind 版本,但是当我成功安装它时,每当我使用 std::system 时,我都会收到以下错误“Profiling timer expired”。
主.cpp:
我厌倦了执行如下分析:
然后我做了:
当我将 LD_PRELOAD 设置为“/usr/local/lib/libprofiler.so”时,排序不起作用!
然后我尝试使用库的静态版本:
什么也没发生,并且 out.prof 没有被创建!
所以我想知道为什么我在使用 std::system(sort) 时得到“分析计时器已过期”?它是使用 gperftools 库的静态版本的正确方法吗?
PS:64位,gperftools=2.5,libunwind=1.1,linux Ubuntu 16.04.1
go - Go profiler (pprof) 时序差异
当我使用 Linux 的实用程序测量 Go 程序的运行时间时time
,我得到以下输出:
当我在 Go 的 pprof CPU 分析器中查看相同程序执行的输出时,我得到以下输出:
pprof 从哪里得到这个 176 的数字?它既不是时钟时间也不是 CPU 时间。我正在运行这个程序,GOMAXPROCS
设置为 8,我觉得这与它有关。pprof 究竟如何测量运行时间,为什么它与 linux 的不同time
?
gperftools - 为什么某些函数名称是 gperftools 报告中的地址?
我正在使用 gperftools 来分析我的程序并尝试对其进行优化。用 gperftools 运行我的程序后,我得到了这个:
我很好奇第一行中的“0xb76e7cb0”是什么意思?不是函数吗?为什么 gperftools 使用该地址?该程序实际上是一个服务器,在“SendMsg”中它唯一做的就是调用发送函数(通过套接字)。
sdl - gperftools 和 pprof 不打印我的函数名称。需要有关如何解决此问题的建议
我目前正在使用 Ubuntu 上的 SDL 用 C++ 编写游戏。我最近对我的引擎进行了多线程处理,因此我从使用 valgrind/callgrind 进行分析切换到了 gperftools。我已经让它工作了,但它不会打印我自己的函数名称。奇怪的是,它可以识别 SDL 函数名称(我在网上的几个线程上看到了相反的情况;没有找到它们的名称的共享库函数)。
我运行我的程序,并执行以下两个命令来得到这个:
pprof --callgrind /bin/ls ls.prof > ls.callgrind
kcachegrind ls.callgrind
我知道有几种使用 gperftools 的方法;我已经通过包含“gperftools/profiler.h”并使用 ProfilerStart(“ls.prof”) 和 ProfilerStop() 函数来完成它。
作为参考,这是我的 Makefile 的一部分,以防相关:
OBJS = background.o gameObject.o uGrid.o main.o Timer.o sdlHandlers.o player.o handleEvents.o handleAllStateChanges.o enactAllStateChanges.o cleanLoop.o renderAll.o loadAllFiles.o loop.o inputHandler.o loopWrite.o loopDebug.o loopDebugSingleStep.o loopDebug_SDLDecoupled.o CC = g++ CFLAGS = -std=c++11 -Wall -O3 -c -g
我删除了对目标文件等的所有引用;这不是整个文件。根据要求,我可以发布整个 Makefile。
另外,因为人们过去很困惑,所以我在我的项目文件夹中使用 SDl2 库的副本。那不是错字。
如果有任何不清楚的地方,我很乐意在需要时回答或提供更多源代码。任何解决此问题的方法
谢谢!
c++ - 为 aarch64 链接 google perf 工具
我一直在我的电脑上成功使用谷歌性能工具。但是,我正在为 aarch64 架构进行编译和部署,而我为 x86 获得的分析结果可能与 aarch64 不匹配。
我想直接测量 aarch64 设备上的东西。我用标志编译RelWithDebInfo
,我用 profiler 的运行时链接运行我的代码LD_PRELOAD
。
对于我的第一次尝试,大多数情况下我得到的是地址而不是函数名:
不过,我得到了一些函数的真实函数名称。
LD_PRELOAD
不推荐选项。在我的 x86 电脑上,我在编译谷歌性能工具后尝试链接-lprofiler
选项:
当我尝试make
我的代码时,出现以下错误:
如何使用 google perf 工具分析 aarch64 设备上的 CPU?
c++ - 解释 gperftools 在多线程工作负载上的结果
我正在尝试使用 gperftools 分析多线程工作负载,但难以解释产生的输出。我编写了一个简单的程序,它启动两个具有相同工作负载的线程并使用 gperftools cpu 分析器进行分析。在输出中,我可以看到每个线程的两个函数,但是每个线程的开销从一次运行到下一次变化很大。我希望这两个函数显示相同的结果,因为它们是相同的工作负载,但实际上,一个可能是 90%,另一个是 10%,或者有时是 80%/20%、95%/5% 等。我不了解为什么函数显示不同的开销,或者为什么结果从一次运行到下一次变化如此之大。基准运行大约 5 秒,有 1600 个样本,所以应该是稳定的。
是否有任何文档解释分析如何适用于多线程工作负载,以及如何解释输出?例如,分析器是否对每个样本的每个线程进行回溯,如果没有,它在做什么?
样本输出:
89.3% 和 10.7% 来自哪里?(这些是函数及其被调用者中总样本的百分比)
c++ - 如何分析 Rcpp 代码(在 linux 上)
我用 Rcpp 制作了一个 R 包,其中整个模拟在 C++ 中运行并在 R 中分析结果。现在我需要分析我的函数以便我可以优化它们,但是 R 分析器无法区分 C++ 函数内部发生的情况,我当函数只能从 R 内部运行时,不知道如何运行 C++ 分析器。
到目前为止,我已经找到了一些使用 gperftools 的建议(问题和教程),但指南不完整(也许他们假设我缺乏一定的知识水平?),缺少链接,而且我一直在碰壁。因此这个问题。这是我所在的位置:
- 安装 gperftools(我用 pacman 从 extra/gperftools 安装)
- 在 C++ 头文件中包含 gperftools/profiler.h
- 在 C++ 代码中围绕我想要分析的内容添加 ProfilerStart("myprof.log") 和 ProfilerStop()
- 使用 -lprofiler 编译
- 运行 "$ CPUPROFILE="myprof.log" R -f myscript.R"
当前的墙是 gcc 告诉我“未定义符号:ProfilerStart”,所以我认为链接有问题?
profiling - gperftools - 配置文件未转储
我已经配置并构建了 gpreftools。但是,我似乎无法找到我的程序生成的配置文件来显示它。
我采取了以下措施:
将
-lprofiler
链接器标志添加到 my.pro
,构建程序并在链接阶段正确添加标志。QMAKE_LFLAGS += -lprofiler
运行:
$ CPUPROFILE=/tmp/prof.out /path/to/executable
执行:
$ pprof --gv /path/to/MyExe /tmp/prof.out
然后我得到以下信息:
Failed to get profile: curl -s --max-time 90 'http:///pprof/profile?seconds=30' > /home/eslam/pprof/.tmp.MyExe.1509005857.: No such file or directory.
有人对此有解决方案吗?
c++ - gperftools 中的明显内存泄漏
这个是在运行一个使用地址清理程序构建的程序时出现的,这让我很好奇。
gperftools 源代码包含以下函数:
定义InitModule
如下
我们的地址清理器(当然不是 valgrind)抱怨MallocExtension
对象的内存泄漏。显然,这是对的。但是为什么首先要进行分配呢?
我拒绝认为开发自己的内存分配器的人会犯如此微不足道的错误。还有一个针对 valgrind 的明确检查。那么分配的目的是什么?
c++ - cmake:无法链接到谷歌分析器(gperftools)
我在 ubuntu 16.04 上。
这是我所做的:
安装 gperftools :
/li>从以下位置下载 FindGperftools.cmake:https ://github.com/vast-io/vast/blob/master/cmake/FindGperftools.cmake
重命名
FindGperftools.cmake
为GperftoolsConfig.cmake
并将其放置cmake
在我的包中的文件夹中添加到
/li>CMakelists.txt
:在同一个 CMakelists.txt 中,链接我的可执行文件:
/li>在终端中,导出 CPUPROFILE 环境变量:
/li>在同一终端中,运行可执行文件:
/li>
没有错误消息,但未/my_path/prof.out
创建日志文件。
如果我在“my_executable”上运行“ldd”,它不会显示与探查器的任何链接(ldd ./my_executable | grep profil
不会产生任何结果)。然而,当查看构建文件夹中的文件时,编译器似乎做了链接(-lprofile
在那里)。
有什么我可能忘记的吗?
注意:不确定是否相关,但我使用 catkin。