2011-01-12 7 views
7

użyłem dwie różne wersje GDB zarówno dać problemy w następującym kodzie:GDB: ustawienie błąd punkt załamania w funkcji klasy szablonów w plikach nagłówkowych

okrojone kod w MyFile.h:

template<class T> 
struct ABC: PQR<T> { 
    void flow(PP pp) { 
    const QX qx = XYZ<Z>::foo(pp); // Trying to set a breakpoint here, line no. 2533 
    ASSERTp(qx >= last_qx()); 
    } 
} 

GDB 7.1:

Reading symbols from /path_to_exec/exec...done. 
(gdb) break MyFile.h:2533 
Note: breakpoint 1 also set at pc 0x121. 
Note: breakpoint 1 also set at pc 0x121. 
Note: breakpoint 1 also set at pc 0x121. 
Note: breakpoint 1 also set at pc 0x156. 
Note: breakpoint 1 also set at pc 0x156. 
Note: breakpoint 1 also set at pc 0x121. 
Note: breakpoint 1 also set at pc 0x121. 
Note: breakpoint 1 also set at pc 0x121. 
Note: breakpoint 1 also set at pc 0x121. 
Note: breakpoint 1 also set at pc 0x121. 
Note: breakpoint 1 also set at pc 0x121. 
Note: breakpoint 1 also set at pc 0x156. 
Note: breakpoint 1 also set at pc 0x156. 
Note: breakpoint 1 also set at pc 0x121. 
Breakpoint 1 at 0x44e5c4: file PacketEngine.h, line 2533. (23 locations) 
(gdb) run 
Starting program: /path_to_exec/exec -options 
Warning: 
Cannot insert breakpoint 1. 
Error accessing memory address 0x121: Input/output error. 
Cannot insert breakpoint 1. 
Error accessing memory address 0x156: Input/output error. 

Dlaczego próbuje ustawić 23 punktów przerwania jednego? I dalej w dół, to daje błąd na run

GDB 6.3:

This GDB was configured as "x86_64-redhat-linux-gnu"...Using host libthread_db library "/lib64/tls/libthread_db.so.1". 

(gdb) break MyFile.h:2533 
No line 2533 in file "MyFile.h". 

Na początku programu, to nawet nie zaakceptować breakpoint Jeśli złamię w funkcji ASSERTp, to przerwy. Następnie. jeśli przejdę w "UP" i przerwę typu, pomyślnie wstawi punkt przerwania (break MyFile.h:2533). [stąd w jakiś sposób znajduje plik/linię po uruchomieniu programu]. Jednak, pomimo ustawiania punktu przerwania, podczas ponownego uruchamiania programu nie zatrzymuje się na linii 2533, ale tylko 2534 (punkt przerwania w funkcji ASSERTp).

Moje pytania:

1) Czy ktoś może mi pomóc rozwiązać ten problem?

2) Często miałem problemy z kodem szablonu i GDB. Czy jest jakiś dobry darmowy debugger C++ dla szablonów?

3) Niezbyt ważne, ale pytanie uboczne, jeśli to ma znaczenie: Która wersja jest lepsza? Wydaje się, że 7.1 jest bardziej błędny, ale pamiętam, że w niektórych seriach daje mniej problemów.


informacji System:

uname -a 
Linux ... 2.6.9-67.ELsmp #1 SMP Fri Nov 16 12:49:06 EST 2007 x86_64 x86_64 x86_64 GNU/Linux 

file /usr/bin/gdb #### GDB 6.3 
/usr/bin/gdb: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), stripped 

file ~/local/bin/gdb #### GDB 7.1 
/home/user/local/bin/gdb: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), not stripped 

file /path_to_exec/exec 
/path_to_exec/exec: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), not stripped 
+0

Podstawa kod jest duża i silnie matrycy, więc powielanie błędów może być trudne :(. Stąd jakieś wskazówki, aby zawęzić problemu są mile widziane. –

Odpowiedz

0

Ja nie jestem żadnym innym debugger dla systemu Linux, ale nigdy nie doświadczyła takich problemów, jak wyjaśnił.

Sformułowałeś swoje pytanie naprawdę ładnie (więc prawdopodobnie zrobiłeś), ale czy skompilowałeś swoje źródła z symbolami debugowania?

EDIT

btw nie próbowałem gdb 7.1 - tylko wersja 6.8. Jeśli uważasz, że jest bardzo błędny, spróbuj użyć ostatniej wersji wersji 6.

+0

Tak, zrobiłem używać -g flagi. Ponadto, niestety, Wciąż napotykam dwa rodzaje problemów z punktami przerwania gdb (1) w plikach nagłówkowych 2)). Nasz kod jest silnie szablonowy [głębokie zagnieżdżanie szablonów] (i jest bardzo duży - setki K linii) - więc muszę zaakceptować, że błędy mogą nie być łatwe do odtworzenia. –

+0

@ JP19 "setki K's linii" - to WTF na własną rękę. Może gdb ma problemy z dużymi plikami? Największy plik, który wypróbowałem, to 10k i wszystko było w porządku. –

+0

Przepraszam, miałem na myśli całkowitą liczbę linii. Chodzi mi o to, że odtworzenie błędu może być trudne :(Dlatego wszelkie wskazówki dotyczące problemu są mile widziane, większość plików jest na pewno mniej niż 10 000. –

0

Widziałem coś podobnego (przy użyciu GDB 7.0), w którym punkt przerwania ustawiony w funkcji szablonu nigdy nie jest trafiony.

Nasz projekt jest zbudowany przy użyciu starej wersji G ++ (znacznie starszej niż wersja dostarczona w mojej dystrybucji). Zauważyłem, że budując wersję GDB przy użyciu tego samego kompilatora rozwinęliśmy problem, który został rozwiązany.

+0

To jest interesujące. * Myślę, że * wersja 7.1, którą próbowałem, została zbudowana z tego samego G ++ co nasz kod, ale nie jestem pewna, sprawdzę to. –

0

gdb ustawia inny punkt przerwania dla każdego tworzonego szablonu, tj. Dla każdego innego typu przyjętego przez T (i być może Z) w twoim programie.Jednak adresy, które próbuje ustawić punkty przerwania na 0x121 wydają się być zbyt niskie i prawdopodobnie odpowiadają pewnym lokalizacjom systemu. Prawdopodobnie dlatego gdb nie może ustawić punktów przerwania.

Powinieneś spróbować gdb 7.2, być może to pomoże.

Ponadto e2dbg to inny typ debuggera dla systemu Linux, ale nie jest tak dojrzały jak gdb. http://www.eresi-project.org/wiki/TheEmbeddedELFDebugger

Powiązane problemy