Я использую GDB для отладки NS-2, который является симулятором для сетевых протоколов. Он принимает файл .tcl в качестве входных данных и интерпретирует его. [Я думаю, что это переводчик.]
Часть кода написана на tcl (события и создание сетевых компонентов), а часть на C ++ (особенно форматы пакетов, агенты и т. Д.).
Я создал агент в C ++ и хочу остановить его при вызове некоторой функции, чтобы я мог видеть трассировку стека и определять, какие другие классы были вызваны до него.
Вот что я сделал:
Произошла какая-то ошибка в одной из моих функций MyAgent ::, и она выдавала ошибку сегментации, и GDB автоматически останавливался там. Я мог тогда видеть след стека. Я исправил ошибку.
Теперь, когда я бегу
gdb ./ns
b MyAgent::function()
/*
When i press TAB after writing "b MyA" it gives me all functions
of my class :). when i press enter after above command --
it asks me "Breakpoint on future shared library load" and i say Yes.
I hope this is ok ??
*/
r myfiles/myWireless.tcl
Теперь он работает и не останавливается нигде. 🙁
Я уверен, что эта функция вызывается, потому что когда произошла ошибка сегментации, она остановилась на этой функции.
Спасибо
Вы можете добавить точку останова в этой функции:
(gdb) break MyAgent :: function ()
Вы должны убедиться, что скомпилированы с любыми опциями, необходимыми для получения отладочных символов. На GCC используйте -g
или же -ggdb
опции.
Вам нужно -args
возможность указать tcl
сценарий, который будет выполнен.
Бежать gdb
как это:
gdb -args ./ns path/to/tcl/script.tcl
Чтобы включить флаг отладки для кода C ++, если это еще не сделано, переконфигурируйте установку ns2 с помощью:
./configure --enable-debug ;# plus any other flags you use for configuring
make clean
make -j 3 ;# -j for faster compiling
make install ;# optional
Вы также можете использовать --with-tcldebug=...
, для отладки кода tcl (для этой опции сначала нужно установить tcldebug)