2013-02-21 50 views
0

我正在使用gdb调试NS-2,它是网络协议的模拟器。它需要一个.tcl文件作为输入并解释它。 [我认为它是一个解释。]GDB和NS2:如何在某些函数调用时停止程序

某些代码被写在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 

现在运行,并没有在任何地方停止。 :(

我相信,这个函数被调用,因为当分割故障是发生的历史,它是在该功能停止

感谢

回答

1

您可以在函数中添加一个断点。

(GDB)破MyAgent ::()函数

您必须确保与任何选项NEC编译需要调试符号。在GCC上,使用-g-ggdb选项。

+0

我认为这是同为“b MyAgent ::函数()”。我也是这样做的。它并没有停止。 – 2013-02-21 09:08:25

+0

你正在调试优化的代码吗? – dbrank0 2013-02-21 10:42:09

+0

@ASHISHNEGI你有编译调试符号吗? – juanchopanza 2013-02-21 10:46:30

0

您需要-args选项来指定tcl脚本将被执行。

./configure --enable-debug  ;# plus any other flags you use for configuring 
make clean 
make -j 3     ;# -j for faster compiling 
make install     ;# optional 

您也可以使用:像这样

运行gdb:与

gdb -args ./ns path/to/tcl/script.tcl 

要启用调试标志,以C++代码,如果没有做它已经,重新配置您的NS2安装目录该--with-tcldebug=...,用于调试TCL代码(您需要首先安装tcldebug此选项)

+0

'-j 100'导致一百个编译器同时启动。这与叉形炸弹相似,可能会导致资源耗尽!总是明智地使用'-j',我只使用它(可用内核的数量 - 1),所以对于四核机器,我只将它设置为'-j 3' – ekarak 2015-11-10 07:41:39

+0

@ekarak我还没遇到这个问题在我的机器上(也许我的磁盘太慢了?)。尽管如此,我更新了答案以使用更少的并行进程。 – user000001 2015-11-10 08:43:59