首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kcache差制:下面的函数没有可用的源代码

Kcache差制:下面的函数没有可用的源代码
EN

Stack Overflow用户
提问于 2014-04-10 17:49:51
回答 1查看 4K关注 0票数 6

我试图使用$ valgrind --tool=callgrind ./myProgram查看带注释的源代码,然后使用Ubuntu12.04查看$ kcachegrind (使用Mac的$ qcachegrind也有同样的问题)。

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

代码语言:javascript
复制
g++ -g -o myProgram myProgram.o -l<some third party lib>

在这里,我不关心查看第三方库的带注释的源代码。

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

相反,我看到了的平面配置文件窗口,其中列出了调用的所有函数,包括myHeader.hpp中的函数--这很棒。现在,kcache差伦将来自myHeader.hpp的函数的位置报告为来自myProgram --这是很奇怪的。最后,当我从平面配置文件窗口选择任何函数并请求查看源代码时,都会遇到以下情况:

代码语言:javascript
复制
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...>

我尝试过的:

  • 使用kcache差伦的GUI将保存myHeader.hpp的目录添加到注释列表中。
  • 使用-O0编译以删除编译器优化
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-13 22:05:44

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

下面是一个关于如何让kcache差使显示带注释的源代码的工作示例:

main.cpp生活在someDirectory/example目录中

代码语言:javascript
复制
// 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

代码语言:javascript
复制
// 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

代码语言:javascript
复制
# 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>文件,该文件可以由kcache差事读取。然后,源注释将用于main.cpp的main()函数以及头文件中的bisect_sine()

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22995407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档