GDB: точка прерывания ошибки в функциях класса шаблона в файлах заголовков

Я использовал две разные версии GDB, обе дают проблемы в следующем коде:

Вырезанный код в 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());
 }
}
</z></t></class>

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.

Почему он пытается установить 23 точки останова для одного? И далее вниз, он дает ошибку на 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".

При запуске программы он даже не принимает точку останова Если я наружу функцию ASSERTp, она ломается. Затем. если я иду "ВВЕРХ", а тип break, он успешно вставляет точку останова (break MyFile.h:2533). [таким образом, он как-то находит файл/строку после запуска программы]. Однако, несмотря на установленную точку останова, при повторном запуске программы она не останавливается на строке 2533, а только на 2534 (точка останова в функции ASSERTp).

Мои вопросы:

1) Может ли кто-нибудь помочь мне решить эту проблему?

2) У меня часто возникали проблемы с кодом шаблона и GDB. Есть ли хороший и бесплатный отладчик С++ для шаблонов?

3) Не очень важно, но вопрос на стороне, если это имеет значение: какая версия предпочтительнее? 7.1 кажется более сложным, но я помню, на некоторых прогонах это дает меньше проблем.

Информация о системе:

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
3 ответа

gdb устанавливает другую точку останова для каждого созданного шаблона, т.е. для каждого другого типа, предполагаемого T (и, возможно, Z) в вашей программе. Однако адреса, которые он пытается установить точки останова на 0x121, кажутся слишком низкими и, вероятно, соответствуют некоторым местоположениям системы. Вероятно, поэтому gdb не может установить точки останова.

Вы должны попробовать gdb 7.2, возможно, это поможет.

Кроме того, e2dbg - это отладчик другого типа для Linux, но он не настолько зрелый, как gdb. http://www.eresi-project.org/wiki/TheEmbeddedELFDebugger


Я видел нечто подобное (используя GDB 7.0), где точка останова, установленная в функции шаблона, никогда не попадала.

Наш проект построен с использованием старой версии g++ (намного старше версии, поставляемой в моем дистрибутиве). Я обнаружил, что, построив версию GDB, используя тот же самый компилятор, мы развиваемся с тем, что проблема была решена.


Я не из любого другого отладчика для Linux, но я никогда не испытывал таких проблем, как вы объяснили.

Вы сформулировали свой вопрос очень хорошо (так вы, вероятно, сделали), но вы скомпилировали ваши источники с помощью отладочных символов?

ИЗМЕНИТЬ

btw Я не пробовал gdb 7.1 - только версия 6.8. Если вы считаете, что это очень плохо, попробуйте использовать последнюю версию версии 6.

licensed under cc by-sa 3.0 with attribution.