7

目标:我希望能够分析 callgrind(以及后来的 cachegrind)的输出,并希望在使用 callgrind_annotate CLI 时看到有意义的变量名称。

先前研究:我知道 Valgrind 中的 dsym 标志(http://valgrind.org/docs/manual/manual-core.html),并且相信我了解调试符号在 osx 上的工作原理(LLDB 未显示源代码)。我在这个网站上看到的关于这个问题的少数提及要么没有得到答复,要么是没有包含 -g 标志的情况。

理论(可能是错误的......):基于 valgrind 输出中的“dym =”行,我想知道 valgrind 是否正在努力寻找 dsym 目录的路径。

我能给你什么数据?

给定以下源代码:

#include <iostream>
#include <cmath>
bool isPrime(int x)
{
        int limit = std::sqrt(x);
        for (int i = 2; i <= limit; ++i)
        {
                if (x % i == 0)
                {
                        return false;
                }
        }
        return true;
}
int main()
{
        int primeCount = 0;
        for (int i = 0; i < 1000000; ++i)
        {
                if (isPrime(i))
                {
                        ++primeCount;
                }
        }
}

使用了以下命令行指令:

g++ -g -c badprime.cpp
g++ badprime.o -o badprime
nm -pa badprime
dsymutil badprime
valgrind --tool=callgrind --dsymutil=yes ./badprime
callgrind_annotate --auto=yes callgrind.out.45056 badprime.cpp

nm -pa 位用于确保存在调试映射信息。我还在 dSYM 文件夹上运行了 dwarfdump 以确保存在调试信息。我看到“没有为 badprime.cpp 收集信息”这一行作为注释命令的输出。

编译器信息:

Apple LLVM version 8.0.0 (clang-800.0.42.1) 
Target: x86_64-apple-darwin15.6.0

瓦尔格林信息:

valgrind-3.11.0

valgrind 的初始详细输出:

$ valgrind --tool=callgrind --dsymutil=yes -v ./badprime
==45056== Callgrind, a call-graph generating cache profiler
==45056== Copyright (C) 2002-2015, and GNU GPL'd, by Josef Weidendorfer et al.
==45056== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==45056== Command: ./badprime
==45056==
--45056-- Valgrind options:
--45056--    --tool=callgrind
--45056--    --dsymutil=yes
--45056--    -v
--45056-- Output from sysctl({CTL_KERN,KERN_VERSION}):
--45056--   Darwin Kernel Version 15.6.0: Thu Jun 23 18:25:34 PDT 2016; root:xnu-3248.60.10~1/RELEASE_X86_64
--45056-- Arch and hwcaps: AMD64, LittleEndian, amd64-cx16-lzcnt-rdtscp-sse3-avx-avx2-bmi
--45056-- Page sizes: currently 4096, max supported 4096
--45056-- Valgrind library directory: /usr/local/Cellar/valgrind/3.11.0/lib/valgrind
==45056== For interactive control, run 'callgrind_control -h'.
--45056-- /usr/lib/dyld (rx at 0x7fff5fc00000, rw at 0x7fff5fc38000)
--45056--    reading syms   from primary file (6 1229)
--45056-- Scheduler: using generic scheduler lock implementation.
==45056== embedded gdbserver: reading from /var/folders/7h/d91hqksj7bdfxp0km10b2qn40000gp/T//vgdb-pipe-from-vgdb-to-45056-by-dudett-on-???
==45056== embedded gdbserver: writing to   /var/folders/7h/d91hqksj7bdfxp0km10b2qn40000gp/T//vgdb-pipe-to-vgdb-from-45056-by-dudett-on-???
==45056== embedded gdbserver: shared mem   /var/folders/7h/d91hqksj7bdfxp0km10b2qn40000gp/T//vgdb-pipe-shared-mem-vgdb-45056-by-dudett-on-???
==45056==
==45056== TO CONTROL THIS PROCESS USING vgdb (which you probably
==45056== don't want to do, unless you know exactly what you're doing,
==45056== or are doing some strange experiment):
==45056==   /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/../../bin/vgdb --pid=45056 ...command...
==45056==
==45056== TO DEBUG THIS PROCESS USING GDB: start GDB like this
==45056==   /path/to/gdb ./badprime
==45056== and then give GDB the following command
==45056==   target remote | /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/../../bin/vgdb --pid=45056
==45056== --pid is optional if only one valgrind process is running
==45056==
--45056-- /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_core-amd64-darwin.so (rx at 0x100002000, rw at 0x100004000)
--45056--    reading syms   from primary file (3 21)
--45056--    dSYM= /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_core-amd64-darwin.so.dSYM/Contents/Resources/DWARF/vgpreload_core-amd64-darwin.so

callgrind_annotate 输出:

--------------------------------------------------------------------------------
Profile data file 'callgrind.out.45056' (creator: callgrind-3.11.0)
--------------------------------------------------------------------------------
I1 cache:
D1 cache:
LL cache:
Timerange: Basic block 0 - 278668477
Trigger: Program termination
Profiled target:  ./badprime (PID 45056, part 1)
Events recorded:  Ir
Events shown:     Ir
Event sort order: Ir
Thresholds:       99
Include dirs:
User annotated:   badprime.cpp
Auto-annotation:  on

--------------------------------------------------------------------------------
         Ir
--------------------------------------------------------------------------------
913,332,521  PROGRAM TOTALS

--------------------------------------------------------------------------------
         Ir  file:function
--------------------------------------------------------------------------------
893,174,739  ???:0x0000000100000ee0 [???]
 12,157,012  ???:0x0000000100000f50 [???]

--------------------------------------------------------------------------------
-- User-annotated source: badprime.cpp
--------------------------------------------------------------------------------
  No information has been collected for badprime.cpp

我将非常感谢可以提供的任何帮助。

4

1 回答 1

2

检查您的链接器 ( ld) 命令行选项。剥离所有符号信息,并在编译器中-s优先。-g

ld手册:

-s
--strip-all
Omit all symbol information from the output file.

ftp链接

我注意到您不ld用于链接。所以这不适用于您的问题。但是,我会将我的答案留给使用ld和遇到此问题的人。

于 2017-03-16T05:18:21.783 回答