GDB: ошибка установки точки останова в функциях класса шаблона в заголовочных файлах - PullRequest
7 голосов
/ 12 января 2011

Я использовал две разные версии 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

ГБД 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, она сломается. Затем. если я иду "UP" и набираю 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

Ответы [ 3 ]

0 голосов
/ 13 января 2011

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

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

0 голосов
/ 02 марта 2011

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

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

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

0 голосов
/ 12 января 2011

У меня нет другого отладчика для linux, но я никогда не сталкивался с такими проблемами, как вы объяснили.

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

РЕДАКТИРОВАТЬ

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...