2010-10-25 11 views
5

Próbowałem już uruchomić valgrind (memcheck i massif) w aplikacji, którą napisałem, ale wszystko, co otrzymuję, to adresy dla uruchamianych funkcji.Valgrind nie zwróci wierszy źródłowych!

--------------------------------- 
Context accounted for 0.6% of measured spacetime 
    0x805F29A: (within prog_name) 
    0x8141740: (within prog_name) 

Called from: 
    0.6% : 0x812E077: (within prog_name) 

--------------------------------- 
Context accounted for 0.5% of measured spacetime 
    0x805F29A: (within prog_name) 
    0x81418FB: (within prog_name) 

Called from: 
    0.5% : 0x812E077: (within prog_name) 

Skompilowałem moją aplikację z flagą -g umieścić symbole debugowania w. Czy jest jakiś inny powód valgrind nie pokaże linię źródłowy?

EDYCJA: valgrind wersja 3.2.1-Debian; g ++ 4.3.1

+1

Nie jestem pewien, ale jeśli ty 'gdb prog_name' swoją aplikację i wypróbuj coś takiego jak' break 0x812E077', czy 'gdb' pokazuje numery linii? (Nie powinieneś nawet "uruchamiać" programu, po prostu ładuj go 'gdb'.) – aschepler

+0

@aschepler - Próbowałem. Ilekroć próbuję to zrobić, gdb nie może znaleźć funkcji o nazwie "0x812E077" i pyta, czy jest w bibliotece, która zostanie załadowana później ... więc to nie zadziałało. –

+1

Ups, powinno to być 'break * 0x812E077'. Ale cieszę się, że znalazłeś poprawkę. – aschepler

Odpowiedz

8

odkryłem, że przeszedł w obu -g i -ggdb flagi do g++ w czasie kompilacji. Pominięcie flagi -g spowodowało, że problem zniknął.

1

Podejrzewam, że nie wspomniałeś o prawidłowych flagach i domyślnych flagach.

- taka flaga powinna być włączona, proszę spojrzeć na inne flagi i włączyć je.

--Cheers

2

Istnieje kilka możliwych powodów:

  • może być przypadkowo pozbawiony swój plik wykonywalny (najbardziej prawdopodobne wyjaśnienie),
  • może być wykonywanie kodu JITted (chociaż adres nie wygląda na to walizka).

Co mówi file prog_name? Jeśli mówi "rozebrany", to jest problem. Możesz również sprawdzić, czy inne narzędzia, np. GDB, co symbol jest pod adresem 0x805F29A:

gdb prog_name 
(gdb) info symbol 0x805F29A 
+0

Nigdy nie dostałem rozebranej wiadomości. Nie wiem na pewno, ale podejrzewam, że pomieszanie flag "-g" i "-ggdb" zepsuło to. –

+0

@sheepsimulator Możesz podejrzewać wszystko, co chcesz, ale jeśli chcesz, abyśmy ci pomogli, podaj informacje, o które prosimy: co dokładnie oznacza "nazwa prog_name"? co dokładnie oznacza symbol informacyjny GDB? –

+0

Doceniam twój pokaz wsparcia, ale ten problem zniknął, gdy pominąłem flagę -g podczas kompilacji. Rozważam odpowiedź na moje pytanie. –

1

Dla innych czytelników z podobnym problemem (miałem to samo, ale moje opcje kompilatora gdzie ok): Okazuje się, że valgrind potrzebuje ścieżkę do pliku wykonywalnego, jeśli ciebie Nie podawaj tego, ale będzie działać poprawnie, ale nie da ci numerów linii. W moim przypadku było wykonywalne w innym katalogu, który był na mojej drodze, ale aby uzyskać informacje na linii musiałem uruchomić

valgrind --leak-check = pełna path_to_myprogram/myprogram