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
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. –