kcachegrind: нет источника, доступного для следующей функции

Я пытаюсь просмотреть аннотированный источник, используя $ 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 для удаления оптимизаций компилятора

5

Решение

Я отвечаю на свой вопрос благодаря пользователю Н.М. — Я обнаружил это при запуске упрощенного примера. Проблема была с моей инструкцией по компиляции, я компилировал в объектный файл с -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() из заголовочного файла.

Так, это оказалось проблемой компиляции. Если бы я понял больше о компиляции в исполняемые файлы, объектные файлы, общие объекты, я бы не попал в этот беспорядок.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]