6

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

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

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

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

我想看到的是myHeader.hppin和 for 函数的注释源myProgram.cpp

相反,我看到了 kcachegrind 的 Flat Profile 窗口,其中列出了所有被调用的函数,包括其中的函数myHeader.hpp-这很棒。现在,kcachegrind 将函数的位置报告myHeader.hpp为 from 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...>

我试过的:

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

  • 使用 -O0 编译以删除编译器优化

4

1 回答 1

6

感谢用户nm ,我正在回答我自己的问题- 我在运行一个简化示例时发现了这一点。问题出在我的编译指令上,我正在编译为一个目标文件,-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()main.cpp 的功能以及bisect_sine()来自头文件的功能。

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

于 2014-04-13T22:05:44.933 回答