0

我正在使用 gdb 来调试 NS-2,它是一个网络协议模拟器。它需要一个 .tcl 文件作为输入并解释它。[我认为是翻译。]

有些代码是用 tcl(事件和网络组件的创建)编写的,有些是用 C++ 编写的(尤其是数据包格式、代理等)。

我在 C++ 中创建了一个代理,我想在某个函数调用时停止它,以便我可以看到堆栈跟踪并找到在它之前调用了哪些其他类。

这就是我所做的:

我的 MyAgent::function 之一出现了一些错误,它给出了 Segmentation Fault 并且 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

现在它运行并且不会在任何地方停止。:(

我确信这个函数正在被调用,因为当发生分段错误时,它在那个函数处停止。

谢谢

4

2 回答 2

1

您可以在该函数中添加断点:

(gdb) 中断 MyAgent::function()

您必须确保使用获取调试符号所需的任何选项进行编译。在 GCC 上,使用-gor-ggdb选项。

于 2013-02-21T08:48:31.740 回答
0

您需要-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 才能使用此选项)

于 2013-02-21T13:38:33.147 回答