kcachegrind:以下函数没有可用的源代码



我正在尝试使用 $ 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 的平面配置文件窗口,其中包含所有被调用的函数的列表,包括myHeader.hpp中的函数 - 这很棒。 现在,kcachegrind 将来自myHeader.hpp的函数的位置报告为来自myProgram - 这很奇怪。 最后,当我从平面配置文件窗口中选择任何函数并请求查看源代码时,我遇到了:

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(生成使用调试-g编译的可执行main(,然后运行valgrind --tool=callgrind ./main。 这将生成预期的callgrind.out.<PID>文件,该文件可由 kcachegrind 读取。 然后,源注释将可用于 main 的main()功能.cpp以及头文件中的bisect_sine()

所以,这被证明是一个编译问题。 如果我更多地了解编译成可执行文件,目标文件,共享对象,yada yada yada,我就不会陷入这种混乱。

相关内容

  • 没有找到相关文章

最新更新