当用valgrind/callgrind运行我的程序时,我得到以下消息:
==21734== brk segment overflow in thread #1: can't grow to 0x4a39000
(使用不同的地址)
请注意,它之前没有堆栈溢出消息.
我找不到关于此消息的任何文档,我不知道究竟是什么溢出.
任何人都可以帮我弄清问题是什么?这是valgrind或我的程序的问题吗?
是否有任何工具,除了KCacheGrind,能够查看callgrind结果?对于Windows平台最好?
我的应用需要动态调用图.我用callgrind
工具(valgrind
套件)运行它并得到callgrind.out.xxxxx
文件.现在,我想对这些数据进行图形表示.KCacheGrind
对我没什么帮助,因为它绘制了图形的有限部分(绘制~50个函数而不是〜1500个轮廓,我不知道如何修复它).如何获得将绘制所有函数的图形图像?
Kcachegrind摇滚,这是我最喜欢的工具,但是我不时会错过在远程服务器上运行终端(例如使用ssh)的能力.
我知道可以设置VNC或X服务器转发,但是在我需要简单的东西时它非常笨拙.
是否有任何kcachegrind控制台替代(例如基于ncurses)?
我想使用valgrind进行一些分析,因为它不需要重新构建程序.(我要配置的程序已经使用"-g"构建)
但是valgrind(callgrind)很慢......所以这就是我要做的事情:
我可以在Solaris上使用sun studio来做这种事情.(使用dbx).我只想知道是否可以使用valgrind(callgrind)做同样的事情?
谢谢
我试图通过去除我不关心的噪音和计算来描述(使用Callgrind)我的代码的特定部分.这是我想要做的一个例子:
for (int i=0; i<maxSample; ++i) {
//Prepare data to be processed...
//Method to be profiled with these data
//Post operation on the data
}
Run Code Online (Sandbox Code Playgroud)
我的用例是一个回归测试,我想确保所讨论的方法仍然足够快(类似于自上次实现以来少于10%的额外指令).这就是为什么我想从Callgrind获得更清晰的输出.(我需要一个for循环才能处理大量数据,以便对我想要分析的方法的行为有一个很好的估计)
我的第一次尝试是将代码更改为:
for (int i=0; i<maxSample; ++i) {
//Prepare data to be processed...
CALLGRIND_START_INSTRUMENTATION;
//Method to be profiled with these data
CALLGRIND_STOP_INSTRUMENTATION;
//Post operation on the data
}
CALLGRIND_DUMP_STATS;
Run Code Online (Sandbox Code Playgroud)
添加Callgrind宏来控制检测.我还添加了--instr-atstart = no选项,以确保我只分析我想要的部分代码...
不幸的是,当我开始使用callgrind启动我的可执行文件时,这种配置永远不会结束......这不是一个缓慢的问题,因为完整的仪器运行持续不到一分钟.
我也试过了
for (int i=0; i<maxSample; ++i) {
//Prepare data to be processed...
CALLGRIND_TOGGLE_COLLECT;
//Method to be profiled with these data
CALLGRIND_TOGGLE_COLLECT;
//Post …
Run Code Online (Sandbox Code Playgroud) 我试图理解程序的性能如何在使用不同选项运行时发生变化 - 我的因子为1.8我想解释一下.我一直在用[valgrind]的callgrind
工具进行分析,并使用kcachegrind来显示结果.但我真的很想看看差异.我找到了该cg_diff
程序,但它不能与callgrind配置文件一起使用,只能使用cachegrind配置文件,这对我来说太昂贵了.
有没有人知道用于可视化两个配置文件之间差异的工具?
我正在使用Cachegrind,Callgrind和Gem5进行一些实验.我注意到一些访问被计为cachegrind的读取,如callgrind的写入以及gem5的读取和写入.
我们来看一个非常简单的例子:
int main() {
int i, l;
for (i = 0; i < 1000; i++) {
l++;
l++;
l++;
l++;
l++;
l++;
l++;
l++;
l++;
l++;
... (100 times)
}
}
Run Code Online (Sandbox Code Playgroud)
我编译:
gcc ex.c --static -o ex
所以基本上,根据asm文件,addl $1, -8(%rbp)
执行100,000次.由于它既是读取也是写入,我期待100k读取和100k写入.但是,cachegrind只将它们计为read,而callgrind只计为write.
% valgrind --tool=cachegrind --I1=512,8,64 --D1=512,8,64
--L2=16384,8,64 ./ex
==15356== Cachegrind, a cache and branch-prediction profiler
==15356== Copyright (C) 2002-2012, and GNU GPL'd, by Nicholas Nethercote et al.
==15356== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info …
Run Code Online (Sandbox Code Playgroud) 谁能告诉我如何对kcachegrind的结果感兴趣.
我有两个版本的代码(v1,v2)都在调试模式下编译.我通过valgrind用选项运行它们:
valgrind --tool=callgrind -v ....
这样生成的输出文件在kcachegrind中打开.现在我已经发现代码的版本v2运行速度比第一版v1更快,因为它意味着.但是我如何从kcachegrind的调用图中获得结果.
在kcachegrind All Callers
选项卡中,我有以下列:Incl. , Distance, Called, Caller
.
IIUC,Called
并且caller
在计划中没有被称为"来电者".但我不了解其他人.
另一件事是在选择特定功能然后在"呼叫者"选项卡上显示更多信息.Ir, Ir per call, count, caller
在类型选项卡中:`EventType,Incl.自我,简短,公式.
我在这里没有任何想法.
到目前为止,我读过这些问题:
函数在应用程序中花费的总时间可以大致分为两个部分:
通常,剖析器提供函数花费的总时间的估计.是否有可能估算出上述两个组件(Tcomp和Tmem)所花费的时间?