问题标签 [callgrind]
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.
valgrind - callgrind 到底收集了什么
是采样还是记录执行的每条指令?
它只是捕获执行函数还是也有行号?
profiling - 我应该使用什么分析器来测量在此函数中花费的 _real_ 时间(包括等待系统调用),而不是 _CPU_ one
该应用程序不计算事物,但执行 i/o、读取文件、使用网络。我希望分析器显示它。
我期望像 callgrind 这样的东西,每个问题都会调用 clock_gettime 。
或者像 oprofile 那样中断我的应用程序(当它正在睡眠或等待套接字/文件/任何东西时)以查看它在做什么。
我希望像“read”、“connect”、“nanosleep”、“send”,尤其是“fsync”(以及他们所有的调用者)这样的东西是粗体的(而不是像执行计算的字符串或数字函数这样的东西)。
平台:GNU/Linux @ i386
profiling - Callgrind main() 包含成本远小于 100%
我分析了一些在 Linux 上运行的非常简单的 C++ 程序。所有这些的 main() 的包含成本远不是 100%,大约是 3.83%。我正确使用 callgrind 吗?我在下面粘贴了callgrind_annotate
with的输出。--inclusive=yes
该程序称为堆,它进行简单的堆排序。我使用的命令是
然后,我输入
输出:
c++ - 在 C++ 中记录代码执行
在多次使用gprof和callgrind 之后,我得出了一个(显而易见的)结论,即在处理大型(如加载整辆车的 CAD 程序)程序时,我无法有效地使用它们。我在想也许,我可以使用一些 C/C++ MACRO魔法,并以某种方式构建一个简单(但很好)的日志记录机制。例如,可以使用以下宏调用函数:
我们可以在函数调用之前和之后添加一些时钟/计时的东西,这样每个用 CALL_FUN 调用的函数都会被计时,例如
变量 t0、t1 可以在全局日志记录对象中找到。该日志记录对象还可以保存通过CALL_FUN调用的每个函数的调用图。之后,可以将该对象写入(特定格式的)文件中,并从其他程序中解析。
所以我的(第一个)问题来了:你觉得这种方法容易处理吗?如果是,如何增强它,如果不是,您能否提出一种更好的方法来测量时间和记录调用图?
一位同事提出了另一种解决此问题的方法,即用特定的注释注释每个函数(我们关心记录)。然后,在 make 过程中,必须运行一个特殊的预处理器,解析每个源文件,为我们要记录的每个函数添加日志逻辑,使用新添加的(解析)代码创建一个新的源文件,然后构建该代码。我想到处阅读 CALL_FUN... 宏(我的建议)并不是最好的方法,他的方法可以解决这个问题。那么您对这种方法有何看法?
PS:我对C/C++ MACROs的陷阱不是很熟悉,所以如果可以用其他方法开发,请说出来。
谢谢你。
linux - 如何在 Centos Linux 5.5 上使用 callgrind
我正在尝试使用 callgrind 分析器来分析我的 C++ 程序。我在 Intel 32 位处理器上的 Linux Centos 版本 5.5 上使用 Valgrind 版本 3.6,1。当我尝试分析我的程序时,我不断收到以下错误(如下所示)。我已经使用过 Linux gprof,但它没有提供任何有用的分析信息。请告诉我我做错了什么或者我应该使用什么解决方法。谢谢
valgrind --tool=callgrind --dump-instr=yes --simulate-cache-yes --collect-jumps=yes ./MatchUpAccurate.exe -input /home/frankc/DQTTest5/MatchUpTest/TestData/mdata2003.dbf -fileloc /home/frankc/DQTTest5/MatchUpTest/TestData -版本 15,
==25558== Callgrind,一个调用图生成缓存分析器,==25558== 版权所有 (C) 2002-2010,以及 Josef Weidendorfer 等人的 GNU GPL'd,==25558== 使用 Valgrind-3.6 .1 和 LibVEX;使用 -h 重新运行以获得版权信息,==25558== 命令:./MatchUpAccurate.exe -input /home/frankc/DQTTest5/MatchUpTest/TestData/mdata2003.dbf -fileloc /home/frankc/DQTTest5/MatchUpTest/TestData -version 15, ==25558==, ==25558== 对于交互控制,运行'callgrind_control -h'., memcpy, BB# 486126,
Callgrind: jumps.c:164 (new_jcc): Assertion '(0 <= jmp) && (jmp <= from->bb->cjmp_count)' failed., ==25558== at 0x3801E4C8: report_and_quit (m_libcassert.c: 193), ==25558== by 0x3801E69C: vgPlain_assert_fail (m_libcassert.c:267), ==25558== by 0x3800FCD9: vgCallgrind_get_jcc (jumps.c:164), ==25558== by 0x38003534: vgCallgrind_push :217), ==25558== by 0x38001FDB: vgCallgrind_setup_bbcc (bbcc.c:844), ==25558== by 0x629B9E93: ???,
调度状态:, running_tid=1,
线程 1:状态 = VgTs_Runnable,==25558== 位于 0xB64A30:memcpy(在 /lib/libc-2.5.so 中),==25558== 由 0xC845D3:__pthread_initialize_minimal(在 /lib/libpthread-2.5.so 中),= =25558== 由 0xC84217: ??? (在 /lib/libpthread-2.5.so 中),==25558== 由 0xC83DA7: ??? (在 /lib/libpthread-2.5.so 中),==25558== 通过 0xAE2162:call_init(在 /lib/ld-2.5.so 中),==25558== 通过 0xAE228F:_dl_init(在 /lib/ld-2.5 .so), ==25558== 由 0xAD484E: ??? (在 /lib/ld-2.5.so 中),
注意:另请参阅源代码分发中的常见问题解答。它包含几个常见问题的解决方法。特别是,如果 Valgrind 在识别程序中的问题之后中止或崩溃,则很有可能修复这些问题将阻止 Valgrind 中止或者,崩溃,特别是如果它发生在 m_mallocfree.c. 中,
如果这没有帮助,请将此错误报告给:www.valgrind.org,
在错误报告中,发送上述所有文本、valgrind、版本以及您使用的操作系统和版本。谢谢。
c - 使用 callgrind 找出最密集的函数
我刚刚在一个文件上使用了 callgrind,它给了我一个 callgrind 输出。然后我使用 callgrind_annotate 以更易读的形式获得结果,并将其输出到文本文件中。我应该如何破译这个新文件以找出最密集的功能?左边的 Ir 列是什么?Ir 代表什么?
qt - How do I let Callgrind access my Qt project's source code?
I built a Qt project in Debug mode with Qt Creator, ran Callgrind to generate profiling data and tried loading it into Cachegrind. I noticed that I only see profiling information for Qt classes, so I figured I must have forgotten to turn on a crucial flag.
Qt Creator's qmake
command looks like this:
Sample compile output for one file:
The -g
flag is there, so debug information should be available. I verified this by running gdb
on the executable and trying to look at some random source code with l
.
The Callgrind command I used was:
What am I missing here?
linux - 是否有工具可以检查两个 callgrind/valgrind 配置文件的差异?
我试图了解在使用不同选项运行时程序的性能如何变化——我想解释一下 1.8 的因数。我一直在使用 [valgrind] 的callgrind
工具进行分析,并使用kcachegrind来可视化结果。但我真的很想看看差异。我找到了该cg_diff
程序,但它不适用于 callgrind 配置文件,只能用于 cachegrind 配置文件,这些配置文件对我来说太贵了,无法收集。
有人知道用于可视化两个配置文件之间差异的工具吗?
valgrind - 如何使用 Callgrind 生成多进程应用程序的简单调用图?
我对 Valgrind Callgrind 有疑问。
我需要生成一个应用程序的调用图,但是这个应用程序启动了几个进程。我使用了 Valgrind 的 --trace-children=yes 选项,但这会生成几个不同的 callgrind 输出文件。
有没有办法将这些文件组合在一起只有一个调用图?即使是组合多个文件的工具也是完美的,但我什么也没找到。
谢谢
c++ - 在不重新编译主程序的情况下分析共享对象
我目前正在开发一个用于加载到 PostgreSQL 中的共享库(作为 C 语言函数,请参见此处)。现在我想在不重新编译 PostgreSQL 本身的情况下分析这个库中的函数。
我尝试使用 callgrind
这为我提供了 PostgreSQL 本身的分析信息,但无法记录我感兴趣的共享库。
我也试过sprof
,但我不知道如何让那个工作。
任何想法都会受到高度评价。
PS:请不要建议只是在调试器中暂停应用程序。由于函数运行时间低于 0.01 秒,我需要更详细的结果。