Я пытаюсь просмотреть аннотированный источник, используя $ valgrind --tool=callgrind ./myProgram
с последующим $ kcachegrind
используя Ubuntu 12.04 (и у меня та же проблема с $ 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.hpp
и для myProgram.cpp
,
Вместо этого я вижу Окно плоского профиля kcachegrind со списком всех вызываемых функций, включая функции в 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...>
Что я пробовал:
добавил каталог холдинга myHeader.hpp
в список аннотаций с помощью графического интерфейса kcachegrind.
скомпилирован с использованием -O0 для удаления оптимизаций компилятора
Я отвечаю на свой вопрос благодаря пользователю Н.М. — Я обнаружил это при запуске упрощенного примера. Проблема была с моей инструкцией по компиляции, я компилировал в объектный файл с -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
# 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()
из заголовочного файла.
Так, это оказалось проблемой компиляции. Если бы я понял больше о компиляции в исполняемые файлы, объектные файлы, общие объекты, я бы не попал в этот беспорядок.
Других решений пока нет …