kcachegrind:没有可用于以下功能的源

Posted

技术标签:

【中文标题】kcachegrind:没有可用于以下功能的源【英文标题】:kcachegrind: there is no source available for the following function 【发布时间】:2014-05-24 14:16:24 【问题描述】:

我正在尝试使用 $ valgrind --tool=callgrind ./myProgram 查看带注释的源代码,然后使用 Ubuntu 12.04 查看 $ kcachegrind(我在使用 Mac OSX 时遇到了与 $ qcachegrind 相同的问题)。

C++ 脚本myProgram.cpp 调用存在于.hpp 文件中的函数(通过#include "../include/myHeader.hpp" 等)。我这样编译myProgram.cpp

g++ -g -o myProgram myProgram.o -l<some third party lib>

我不关心查看该第三方库的带注释源。

我希望看到myHeader.hppmyProgram.cpp 中的函数的注释源

相反,我看到了 kcachegrind 的 Flat Profile 窗口,其中列出了所有被调用的函数,包括 myHeader.hpp 中的函数 - 这很棒。现在,kcachegrind 将来自myHeader.hpp 的函数的位置报告为来自myProgram - 这很奇怪。最后,当我从 Flat Profile 窗口中选择任何功能并请求查看源代码时,我遇到了:

There is no source available for the following function
<name of the selected function>
This is because no debug information is present.
Recompile the source and redo the profile run.
The function is located in the ELF object:
<some location...>

我的尝试:

使用 kcachegrind 的 GUI 将包含 myHeader.hpp 的目录添加到注释列表中。

使用 -O0 编译以移除编译器优化

【问题讨论】:

提供一个可以通过valgrind复制、粘贴、编译和运行的独立示例。我们不可能在&lt;some location&gt; 上检查&lt;some function&gt; 的问题。 【参考方案1】:

感谢用户 n.m.,我正在回答我自己的问题 - 我在运行一个简化示例时发现了这一点。问题出在我的编译指令上,我使用-g 编译为目标文件,而不是使用-g 编译为可执行文件。

这是一个如何让 kcachegrind 显示带注释的源代码的工作示例:

main.cpp 位于目录someDirectory/example

// main.cpp

#include <iostream>
#include <math.h>
#include "../include/header.hpp"
using namespace std;

int main() 
  double a=1.0; double b=4.0;
  double tol = 1E-10;
  double zero = -99;

  if (sin(a)*sin(b) < 0 && (b-a) >= tol)
  zero = bisect_sine(a,b,tol);

  cout << zero << endl;

  return 0;

头文件header.hpp 位于someDirectory/include

// header.hpp

#include <math.h>
#include <iostream>
using namespace std;

double bisect_sine(double a, double b, double tol) 

  double c;
  int step = 0; int maxsteps = 100;
  while (step < maxsteps) 
    c = (a+b)/2.0;

    if (sin(c) == 0 || (b-a)/2 < tol)
      return c;
    if (sin(a)*sin(c) >= 0)
      a = c;
    else 
      b = c;

    step+=1;
  

生成文件

# Makefile 
CXX = g++  
main: 
   $(CXX) -g -o main main.cpp
   chmod 700 main
clean:
  rm main

在所有这些之后,只需运行make(生成使用调试-g 编译的可执行文件main),然后运行valgrind --tool=callgrind ./main。这将产生预期的callgrind.out.&lt;PID&gt; 文件,可以被 kcachegrind 读取。然后,源注释将可用于 main.cpp 的 main() 函数以及头文件中的 bisect_sine()

所以,原来是编译问题。如果我对编译成可执行文件、对象文件、共享对象、yada yada yada 有更多了解,我就不会陷入这种混乱。

【讨论】:

以上是关于kcachegrind:没有可用于以下功能的源的主要内容,如果未能解决你的问题,请参考以下文章

KCachegrind:找不到命令

没有可用于在 Visual Studio 2017 中运行测试的源

kcachegrind 无法打开 callgrind 文件

那里有 Mac Os X 的 KCacheGrind 替代品吗?

优化与未优化构建的 KCachegrind 输出

Kcachegrind 覆盖列表项限制为 499