如何在 Centos Linux 5.5 上使用 callgrind
Posted
技术标签:
【中文标题】如何在 Centos Linux 5.5 上使用 callgrind【英文标题】:How to use callgrind on Centos Linux 5.5 【发布时间】:2011-04-21 19:32:29 【问题描述】:我正在尝试使用 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 -输入 /home/frankc/DQTTest5/MatchUpTest/TestData/mdata2003.dbf -fileloc /home/frankc/DQTTest5/MatchUpTest/TestData -version 15,
==25558== Callgrind,一个调用图生成缓存分析器, ==25558== 版权所有 (C) 2002-2010 和 GNU GPL,由 Josef Weidendorfer 等人, ==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'., 内存, BB# 486126,
Callgrind: jumps.c:164 (new_jcc): Assertion '(0 bb->cjmp_count)' 失败。, ==25558== 在 0x3801E4C8:report_and_quit (m_libcassert.c:193), ==25558== 0x3801E69C: vgPlain_assert_fail (m_libcassert.c:267), ==25558== 由 0x3800FCD9: vgCallgrind_get_jcc (jumps.c:164), ==25558== 由 0x38003534: vgCallgrind_push_call_stack (callstack.c:217), ==25558== 0x38001FDB: vgCallgrind_setup_bbcc (bbcc.c:844), ==25558== 由 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, 版本,以及您使用的操作系统和版本。谢谢。
【问题讨论】:
mmmm 主机上的 libc 版本是多少?是虚拟机还是物理机?我想这将是 libc 的 ABI/版本冲突。如果您无法弄清楚,请报告它。很有可能,开发人员将能够在 5 秒内告诉您 sehe,谢谢您的回复。为了确定 Centos Linux 5.5 主机上的 libc 版本,我尝试了: rpm -qa | grep glibc。响应是:glibc-devel-2.5-49.el5_5.7 glibc-2.5-49.el5_5.7 glibc-headers-2.5-49.el5_5.7 glibc-common-2.5-49.el5_5.7 sehe,你能告诉它是虚拟机还是物理机?我与 libc 有版本冲突吗?谢谢。 昨晚,我使用 fibonacci 函数编写了一个简单的程序,我尝试使用 valgrind/callgrind 3.6.1 对程序进行分析,但 callgrind 抱怨 std::ios_base::Init::Init() (在 /usr/lib/libstdc++.so.6.0.8)。我刚收到一封来自使用 Valgrind/Callgrind 3.6.0 Ubuntu 的程序员的电子邮件。为什么 Callgrind 可以在 Ubuntu 而不是 Centos Linux 5.5 上运行?谢谢 我收到了一封来自 centos.org 的邮件。 Centos 说 callgrind 在 Centos Linux 5.5 x86_64 上使用 glibc-2.5-58.el5_6.2.x86_64 glibc-2.5-58.el5_6.2.i686, glibc-devel-2.5-58.el5_6.2.x86_64 glibc-devel- 2.5-58.el5_6.2.i386。但是,我正在使用 glibc-2.5.49.el5_57 glibc-devel-2.5.49.el5-5.7 使用 Centos Linux x86_32。有谁知道如何解决 Centos x86_32 上的 libc 版本不匹配问题?谢谢。 上周末我决定从 callgrind 切换到 OReport。我在我们的 x86_32 Centos Linux 5.5 版本上安装了 OReport。 Oreport 有更多可以调用grind 的选项,因此有很多东西需要学习。但是,今天我设法获得了我们公司正在开发的一个非常复杂的程序的非常好的 OReport 配置文件。 Sehe,感谢您指出 callgrind 上的 libc 不匹配问题。 【参考方案1】:晚上好,我收到了一封来自 Callgrind 工程师 Josef Weidenorfer 的电子邮件。 Josef 给我发了一个 valgrind/callgrind 补丁来解决我的 callgrind 问题。这是补丁(如下所示)。我刚刚应用了补丁并重建了 valgrind/callgrind。现在 callgrind 可以在 Centos Linux 5.5 上分析 fibonacci(25) 函数。谢谢。
--- a/callgrind/bbcc.c
+++ b/callgrind/bbcc.c
@@ -693,6 +693,7 @@ void CLG_(setup_bbcc)(BB* bb)
/* change source for delayed push */
CLG_(current_state).bbcc = top_ce->jcc->from;
sp = top_ce->sp;
+ passed = top_ce->jcc->jmp;
CLG_(pop_call_stack)();
else
@@ -841,6 +841,7 @@ void CLG_(setup_bbcc)(BB* bb)
if (!skip && CLG_(current_state).nonskipped)
/* a call from skipped to nonskipped */
CLG_(current_state).bbcc = CLG_(current_state).nonskipped;
+ passed = CLG_(current_state).bbcc->bb->cjmp_count;
CLG_(push_call_stack)(CLG_(current_state).bbcc, passed,
bbcc, sp, skip);
【讨论】:
以上是关于如何在 Centos Linux 5.5 上使用 callgrind的主要内容,如果未能解决你的问题,请参考以下文章