zoukankan      html  css  js  c++  java
  • 【NS2】TCL debug (转载)

    1.使用NS2进行模拟,就不可避免的会接触TCL/OTCL和C/C++。两者配合使用。一般设置场景啊,业务流啊,都使用TCL/OTCL来编写脚 本。要进行路由实验模拟的话,同一类的实验,这些脚本基本上是差不多的。所以其实没有必要在这种脚本语言上花费太多的时间。最主要的就是用C/C++来实 现自己的路由算法,这才是考验你基本功的地方。


    2.算法出来之后,就开始模拟了。要使得自己写的新路由算法能在NS2上跑,就需 要修改一些文件,使得NS2能够认识你的路由算法。主要包括NS2_HOME/ns-2.30/tcl/lib/ns-lib.tcl, NS2_HOME/ns-2.30/tcl/lib/ns-packet.tcl,NS2_HOME/ns-2.30/common/packet.h。 具体的可以参考《NS与网络模拟》这本书。然后需要重新进行编译和运行。一般不可能第一次运行就通过,通常会出现各种各样的错误。但是NS2给出的错误信 息很有限,基本上没有起到任何帮助。这就需要进行调试。调试NS2脚本(TCL/OTCL)的工具tcldbg,调试C/C++的当然首推gdb了。

    安装配置tcldbg的过程如下(都是在Linux下):

    首先安装tcldbg:
    ./configure --with-tcl=<tclConfig.sh的目录>
    make
    make install
    需要说明的是,我们要先找到NS2的tclConfig.sh文件所在的目录,通常是位于NS2_HOME/tcl*.*.*/unix/tclConfig.sh。

    为了能在ns2中使用tcldbg,需要重新配置编译NS2,步骤如下:
    ./configure --with-tcldebug=/usr/local/lib/tcldbg2.0/ 
    make
    其中/usr/local/lib/tcldbg2.0/是tcldbg的lib文件安装目录,不同的系统可能不一样,同样先找到准确的位置。

    这样,就可以在NS2中调试TCL/OTCL脚本了。设断点的方法是,直接在脚本文件中相应的位置加上debug 1。一些基本的命令如下:
    s 单步执行(进入进程)
    n 单步执行(不进入进程)
    c 继续
    r 继续执行直到从过程中返回
    u 转至上级作用域
    d 转至下级作用域
    w 列出调用栈
    b 设置,清除或显示断点
    h 帮助

    运行脚本,就会在相应的断点位置停下来,可以使用puts命令来打印输出各种变量的值。info也是一个我常用的命令。
    info exists <variable>
    <variable> info class //查询一个对象的类名
    <variable> info instances //查询一个类的所有实例
    <variable> info instprocs //查询一个类的所有实例过程
    <variable> info vars
    <variable> info superclass/subclass //查询一个类的超类/子类

    如 果认为错误出在C/C++代码部分(通常都是这样),那么就需要用gdb进行调试了。一般UNIX和Linux都有gdb,可以直接使用。不过,要指出的 是,需要修改Makefile文件,重新编译代码,生成含有调试信息的程序,才可以进行调试。方法是在CCOPT宏上增加-g选项。调试过程如下:
    首先,敲入gdb ns(进入调试),此时显示的应该是(gdb)
    设置断点: b 文件名(xxxx.cc或者xxx.h):行数
    运行tcl脚本: r 文件名(xxx.tcl)
    调试命令:n,s
    显示变量: p 变量名
    删除断点 d 断点编号
    查看断点信息: i b
    还有很多其他命令,都可以通过h的帮助来查看。

    注意:以上凡是涉及到文件名的地方一定要注意路径,而且是相对于当前gdb工作目录的相对路径。同样可以通过cd和pwd命令来修改和查看工作目录。

    其实调试出现在C/C++部分的错误,我们可以先不设置断点,在gdb的环境下运行,一般都会显示出具体出错的地点,包括文件名和行数。然后我们在这里设断点,进行深入的调试。

    我在实验模拟部分出现了多次“段错误”的错误,通过调试发现,均为对空指针进行了操作,导致了非法访问。


    3.关于xgraph,其实比较简单,不过我发现网上查到的一些资料所介绍的部分内嵌命令并不起作用,或者并不一样。估计是版本发生变化的原因吧。
    xgraph -x "x坐标的标题" -y "y坐标的标题" <xgraph的数据文件>
    xgraph的数据文件格式如下:
    TitleText: 所绘出图片的标题
    "Alpha
    x1      y1
    x2      y2

    "beta
    x1      y1
    x2      y2

    其中Alpha和beta分别是两条折线的名称

  • 相关阅读:
    十二星座职业成功忠告
    一文为你详解Unique SQL原理和应用
    如何在软件发布计划中自动化语义化版本与变更日志
    云图说 | 云上资源管控有神器!关于IAM,你想知道的都在这里!
    15年华为云视频架构师采访实录:揭秘未来音视频行业的科技趋势!
    【智简联接,万物互联】华为云·云享专家董昕:Serverless和微服务下, IoT的变革蓄势待发
    让你的产品更懂世界:如何提升场景文本识别中的语言模型
    一文带你彻底了解大数据处理引擎Flink内存管理
    未雨绸缪,数据保护之NBU介质备份
    六个步骤,从零开始教你搭建基于WordPress的个人博客
  • 原文地址:https://www.cnblogs.com/helloWaston/p/4544875.html
Copyright © 2011-2022 走看看