2015-04-07 13 views
6

Mam problem z debugowaniem aplikacji w C++ za pomocą zdalnej sesji GDB, która ma dużą bazę kodu i dlatego zawiera (po skompilowaniu z flagami "-O2", "-g", "-DNDEBUG" ") duży plik z informacjami debugowania (1,1 Gb).W jaki sposób GDB radzi sobie z dużymi (> 1 GB) plikami debugowania?

Niestety, nie mogę po prostu używać częściowych tabel symboli podczas debugowania, ponieważ cały czas debugger pomija część aplikacji i nie jestem w stanie ustawić tam punktów przerwania i zobaczyć kod podczas debugowania.

Jako rozwiązanie tego problemu, mogę wykonać następujące polecenie po mam przyłączone do systemu TARGET:

symbol-file -readnow [path-to-file-with-debugging-info] 

ta rozszerza pełne tablice symboli. Ale w tym przypadku GDB po prostu zabrakło pamięci uderzając 13 Gb lub nawet więcej pamięci RAM (podczas gdy mam tylko 16 Gb dostępne na moim komputerze). Ten problem jest już wymieniony w GDB Wiki i jest znany.

Moje pytanie brzmi: jak sobie radzić z GDB w tym przypadku, kiedy potrzebuję pełnych tablic symboli, ale GDB wymaga ogromnej ilości pamięci, aby ją rozwinąć?

Z góry dziękuję!

+0

Częściowe tabele symboli to optymalizacja gdb. Jeśli nie działają, to jest to błąd gdb, który powinieneś złożyć. Normalni użytkownicy nigdy nie powinni potrzebować '-readnow' - jest to raczej opcja dewelopera gdb i/lub obejście błędu. –

Odpowiedz

0

Ponieważ radzenie sobie z dużymi plikami debugowania jest słabością GDB, optymalnym sposobem w tym przypadku było zmniejszenie rozmiaru pliku * .dbg za pomocą symboli debugowania nie dla wszystkich modułów aplikacji, ale tylko dla tych, które będą debugować faktycznie występują.

W tym przypadku z plikiem ~ 150 MB * .dbg i używaniem debugera DS-5 potrzebowałem tylko 2,5 GB pamięci RAM, co jest dopuszczalne.

1

Możesz spróbować użyć złotego linkera z opcją --compress-debug-sections=zlib. Spowoduje to zmniejszenie rozmiaru informacji debugowania. gdb może czytać skompresowane informacje debugowania od wersji 7.0.

+0

Dziękuję za tę wskazówkę, ale niestety mam tendencję do używania wspólnego środowiska kompilacji, a tam nie wolno używać innego łącznika/kompilatora/etc. –

Powiązane problemy