2011-01-12 1 views
7

я использовал две разные версии 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()); 
    } 
} 

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. Есть ли хороший & бесплатный отладчик C++ для шаблонов?

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 
+0

код база велика и сильно шаблонный, поэтому воспроизведение ошибка может быть трудно :(. Следовательно, любые советы, чтобы сузить проблему радушны. –

ответ

0

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

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

EDIT

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

+0

Да, я использовал -g флаги. Кроме того, к сожалению, Я продолжаю сталкиваться с двумя типами проблем с gdb (1) точкой разрыва в файлах заголовков 2) шаблонов). Наш код сильно затенен [глубокое вложение шаблонов] (и очень велико - сотни строк K) - поэтому я должен признать, что ошибки могут быть нелегко восстановить. –

+0

@ JP19 «сотни линий K» - это WTF самостоятельно. Может быть, у gdb проблемы с большими файлами? Самый большой файл, который я пробовал, был 10k, и все было в порядке. –

+0

К сожалению, я имел в виду общее количество строк. То, что я пытаюсь передать, заключается в том, что воспроизведение ошибки может быть затруднено :(Поэтому любые советы по устранению проблемы приветствуются. Большинство файлов имеют менее 10K строк. –

0

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

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

+0

Это интересно. Я * думаю * версия 7.1, которую я пробовал, была построена с тем же G ++, что и наш код, но не уверен. Я проверю это. –

0

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

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

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