【问题标题】:GDB and NS2: how to stop program at some Function callGDB 和 NS2:如何在某些函数调用处停止程序
【发布时间】:2023-03-22 17:34:01
【问题描述】:

我正在使用 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

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

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

谢谢

【问题讨论】:

    标签: c++ gdb tcl breakpoints ns2


    【解决方案1】:

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

    (gdb) 中断 MyAgent::function()

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

    【讨论】:

    • 我认为它与“b MyAgent::function()”相同。我也做了这个。它没有停止。
    • @ASHISHNEGI 你用调试符号编译了吗?
    • 很抱歉,我不了解调试符号或优化代码。我应该对 Makefile 做什么?
    • 寻找类似 CFLAGS 的东西。在那里你可能会看到 -O2 或类似的东西。将其替换为 -O0。这会禁用优化(这会干扰调试)。
    • @ASHISHNEGI 如果您使用 g++,则使用 -g 编译调试符号,甚至更好的是使用 -ggdb。见here
    【解决方案2】:

    您需要-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)

    【讨论】:

    • -j 100 导致一百个编译器同时启动。这类似于分叉炸弹,可能导致资源耗尽!始终明智地使用-j,我只使用它到(可用核心数 - 1),所以对于四核机器,我只将它设置为-j 3
    • @ekarak 我的机器上没有遇到这个问题(也许我的磁盘太慢了?)。我更新了答案以使用更少的并行进程以防万一。
    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 2018-01-28
    • 2013-09-26
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多