Шагая в шаблонные классы с GDB - PullRequest
4 голосов
/ 20 ноября 2011

Я работаю над реализацией сбалансированного дерева в c ++, но требование назначения состоит в том, что я должен использовать шаблонные классы. Я думал о том, чтобы сначала сделать это с помощью int, а затем преобразовать в шаблоны, но тестовый код, который нам дают, по умолчанию использует шаблоны.

Когда я компилирую свой код с помощью g ++ class.h test.cxx -Wall -g -O0, кажется, что все работает нормально, пока я не попаду в gdb, где он не вступит в реализацию шаблона. Мой файл реализации шаблона включен в конец файла заголовка, и GDB позволит мне устанавливать точки останова внутри него, но на самом деле он никогда не входит в функцию. Я использовал GDB через Emacs, но он также не работал напрямую в GDB. Я ожидал бы, что шаг переключается на файл шаблона, когда GDB попадает в функцию, которая там подразумевается, но вместо этого он говорит мне, что строка, на которую он думает, что должен идти, на самом деле не существует. Вот типичный сеанс:

(gdb) break set.template:7
Breakpoint 3 at 0x400c46: file set.template, line 7.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/students/jeffris/csci2270/btree/debug

Breakpoint 1, main () at debug.cxx:9
(gdb) step

Breakpoint 3, set (this=0x7fffffffe550) at set.template:7
Line number 7 out of range; set.template has 1 lines.
(gdb) 
set()
Line number 8 out of range; set.template has 1 lines.
(gdb)  
Line number 9 out of range; set.template has 1 lines.
(gdb) 
Line number 10 out of range; set.template has 1 lines.
(gdb) 
main () at debug.cxx:10
(gdb) 
main_savitch_11::set<int>::empty (this=0x7fffffffe550) at set.template:70
Line number 70 out of range; set.template has 1 lines.
(gdb) 
empty
Line number 71 out of range; set.template has 1 lines.
(gdb)  
Line number 72 out of range; set.template has 1 lines.
(gdb) 

Я видел несколько постов в сети, где другие люди сталкивались с подобными проблемами, но все темы исчезли без разрешения. Я пробовал несколько способов компиляции кода, в том числе в отдельных частях, а затем связать все это вместе, но не игра в кости. У всех остальных в моем классе такая же проблема, но они довольствовались использованием операторов cout для отладки, что является очень медленным способом отладки с 10 функциями, вызывающими друг друга. Кто-нибудь еще испытал это и нашел решение?

1 Ответ

3 голосов
/ 20 ноября 2011

Проблема выглядит так, как будто GDB на платформе, которую вы используете для отладки, не может найти разделители конца строки для вашего set.template файла. Например, символы отладки, кажется, указывают на правильный номер строки:

(gdb) break set.template:7
Breakpoint 3 at 0x400c46: file set.template, line 7.

Но тогда вы получаете это сообщение об ошибке,

Line number 7 out of range; set.template has 1 lines.

Таким образом, GDB видит ваш файл set.template, но не может правильно проанализировать его и увидеть разделители конца строки, чтобы на самом деле сказать, на какой номер строки смотреть. Это может произойти, например, если вы написали файл в Linux, а затем скомпилировали его в Windows. Linux / Unix нужен только перевод строки для новой строки, тогда как для Windows требуется сочетание возврата каретки + перевода строки. Поэтому откройте файл set.template в текстовом редакторе на платформе, на которой вы отлаживаете, и убедитесь, что ваш файл не является однострочным. Могут быть и другие причины, по которым GDB задыхается в строках вашего файла, но эта неспособность увидеть конец строки в вашем фактическом кодовом файле в основном является причиной ваших проблем и не имеет ничего общего с неспособностью отлаживать шаблоны ... GDB может отлаживать шаблоны просто отлично.

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