C++ GDB和NS2:如何在某个函数调用时停止程序

C++ GDB和NS2:如何在某个函数调用时停止程序,c++,gdb,tcl,breakpoints,ns2,C++,Gdb,Tcl,Breakpoints,Ns2,我正在使用gdb调试NS-2,它是网络协议的模拟器。它接受一个.tcl文件作为输入并解释它。[我认为这是一名翻译。] 有些代码是用TCL(事件和网络组件的创建)编写的,有些是用C++编写的(特别是包格式、代理等)。 我在C++中创建了一个代理,我想在某个函数调用中停止它,这样我就可以看到堆栈跟踪并找到它之前调用的其他类。 这就是我所做的: 我的一个MyAgent::函数中出现了一些错误,它给出了分段错误,gdb在那里自动停止。然后我可以看到堆栈跟踪。我纠正了错误 现在当我跑的时候 gdb

我正在使用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)中断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以获得此选项)

我认为它与“b MyAgent::function()相同”。我也做了这个。它没有停止。@ASHISHNEGI让你用调试符号编译了吗?很抱歉,我不知道调试符号或优化的代码。我应该如何处理生成文件?查找类似于CFLAGS的内容。在那里你可能会看到-O2或类似的内容。将其替换为-O0。这将禁用优化(这会干扰调试)@ASHISHNEGI如果您使用的是g++,那么使用
-g
编译调试符号,或者更好地使用
-ggdb
。请参阅
-j 100
使100个编译器同时启动。这类似于一个分叉炸弹,可能会导致资源消耗!始终明智地使用
-j
,我只会在最短的时间内使用它(可用的内核数-1),因此对于四核机器,我只将其设置为
-j3
@ekarak,我在我的机器上没有遇到这个问题(可能我的磁盘太慢了?)。我更新了答案,以使用更少的并行进程以防万一。