Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Perf显示损坏的函数名_C++_Profiling_Perf_Name Mangling - Fatal编程技术网

C++ Perf显示损坏的函数名

C++ Perf显示损坏的函数名,c++,profiling,perf,name-mangling,C++,Profiling,Perf,Name Mangling,在看了CppCon 2015的演讲后,我想给perf一个机会来介绍一些节目。我下载了那个家伙在演讲中使用的同一个谷歌基准库,用适当的开关编译了我的程序,将它链接到它,然后用perf记录了一次运行。“报告”选项为我提供了以下信息: 如您所见,函数名的可读性不强。我认为这与C++名称的修改有关。有趣的是,所有的函数名在视频中都正确地显示在演讲人的身上,但我却没有。我不认为这是一种完全丢失符号信息的情况,因为在这种情况下我只能看到内存地址。出于某种原因,PrF不能“撤销”C++的名字对我来说,这是令

在看了CppCon 2015的演讲后,我想给perf一个机会来介绍一些节目。我下载了那个家伙在演讲中使用的同一个谷歌基准库,用适当的开关编译了我的程序,将它链接到它,然后用perf记录了一次运行。“报告”选项为我提供了以下信息:

如您所见,函数名的可读性不强。我认为这与C++名称的修改有关。有趣的是,所有的函数名在视频中都正确地显示在演讲人的身上,但我却没有。我不认为这是一种完全丢失符号信息的情况,因为在这种情况下我只能看到内存地址。出于某种原因,PrF不能“撤销”C++的名字对我来说,这是令人沮丧的。

我使用的是gcc(g++)5.2.1版,perf是4.2.6版,我在编译时使用这些开关:

-I-L-O3-std=c++14-gdwarf-2-fno-rtti-Wall-pedantic-lbenchmark-pthread

我之所以不使用
-fno省略帧指针
,是因为我使用了
-gdwarf-2
选项,该选项将调试信息保留在dwarf可执行文件中,这是在这种情况下保留帧指针的替代方法。这也意味着我将调用图“dwarf”传递给
perf record
。无论如何,我也尝试了帧指针方法,它给出了相同的结果,所以这并不重要


那么为什么PrF不撤销C++名字在这种情况下的错误呢?这与使用GCC有什么关系吗?当然,这意味着我使用的是libstdc++?

perf report
给您提供了诸如
\u Z*
\u ZN*
\u ZL*
等混乱的名称时,这意味着编译
perf
工具时没有访问Demanling函数或禁用了它。Makefiles中有检测demangler的代码:

测试在
tools/build/feature
目录中:如果使用libelf(,
-lelf
链接)的
elf\u begin
功能的测试程序可用,则libelf功能启用(并返回一些内容?是否有运行测试?当内核构建器机器无法使用
/test libelf.bin
直接运行目标机器elf二进制文件,并且必须对实际机器或某个用户/系统qemu使用ssh时,交叉构建如何?)

并且perf实现中执行Demanling的代码(使用
cplus\u demangle
如果定义了\u cplus\u demangle\u支持,则使用no demangle是在makefile之后设置no demangle,使用bfd.h和
bfd\u demangle
函数):

或者,您可以按照中的建议更新/重新编译性能


4^看起来你在Ubuntu上。我怀疑这就是你的问题和解决方案:–billyw 3'16 17:31


我正在使用Arch Linux,
perf report
显示正确的符号需求。perf的手册页还显示默认情况下启用的
--demangle
选项。由于我没有看到与您相同的行为,我没有答案,但您看到的不是预期的默认行为。我尝试手动添加该开关也一样,但没有改变anything@GabrielSouthern你也在使用gcc吗?gcc——gcc(gcc)5.2.0版看起来你在Ubuntu上。我怀疑这就是你的问题和解决方案:
# Define NO_DEMANGLE if you do not want C++ symbol demangling.
# Define NO_LIBELF if you do not want libelf dependency (e.g. cross-builds)
ifdef NO_LIBELF
...
  NO_DEMANGLE := 1
...
else
  ifeq ($(feature-libelf), 0)
    ifeq ($(feature-glibc), 1)
      LIBC_SUPPORT := 1
    endif
    ...
    ifeq ($(LIBC_SUPPORT),1)
      ...
      NO_DEMANGLE := 1
    ...
#ifdef HAVE_CPLUS_DEMANGLE_SUPPORT
extern char *cplus_demangle(const char *, int);

static inline char *bfd_demangle(void __maybe_unused *v, const char *c, int i)
{
    return cplus_demangle(c, i);
}
#else
#ifdef NO_DEMANGLE
static inline char *bfd_demangle(void __maybe_unused *v,
                 const char __maybe_unused *c,
                 int __maybe_unused i)
{
    return NULL;
}
#else
#define PACKAGE 'perf'
#include <bfd.h>
#endif
perf report | c++filt | less
perf annotate function_name | c++filt | less
# or: perf annotate -s function_name | c++filt | less