我正在尝试使用$ 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编译的
  • 删除编译器优化
  • 最佳答案

    我要感谢用户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(产生通过调试main编译的可执行-g),然后运行valgrind --tool=callgrind ./main即可。这将产生预期的callgrind.out.<PID>文件,可以由kcachegrind读取。然后,源注释将可用于main.cpp的main()函数以及头文件中的bisect_sine()

    因此,原来是编译问题。如果我对编译成可执行文件,目标文件,共享对象,yada yada yada有更多了解,那么我就不会陷入困境。

    关于c++ - kcachegrind:没有可用于以下功能的源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22995407/

    10-11 06:25