我正在尝试使用$ 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>
我不关心查看第三方lib的注释源。
对于myHeader.hpp
和myProgram.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
的目录添加到Annotations列表中。
使用-O0编译以删除编译器优化
答案 0 :(得分:4)
感谢用户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,我就不会陷入这种混乱。