NS3之路---Tweaking

TWEAKING

首先,关于这一章,实在不知道这个名字该如何翻译,因此在此直接使用英文。

但是主要讲了三部分内容,分别介绍了对日志模块、命令行参数、跟踪系统的使用。

  1. 日志模块

在前面使用过的first.cc中已经简单介绍了下相关的日志类。一般来说,大规模的系统中都会使用日志记录相关信息,ns3同样如此。而通常只有标准错误(stderr)信息才会被输出到控制台。某些系统也会将警告信息输出。我们需要了解的是,日志的存在给我们提供了详细的系统运行过程,使我们的调试过程变得相对容易。

Ns3日志模块提供了一个很好的日志系统,我们可以随时随地的从中获取我们想要的信息。目前ns3定义了7种日志类型(LOG_TYPE)。

l  LOG_ERROR:错误信息,相关宏为NS_LOG_ERROR

l  LOG_WARN:警告信息,相关宏为NS_LOG_WARN

l  LOG_DEBUG:调试信息,相关宏为NS_LOG_DEBUG

l  LOG_INFO:程序运行过程信息,宏为NS_LOG_INFO

l  LOG_FUNCTION:函数调用的描述信息,宏为NS_LOG_FUNCTION(成员函数)和NS_LOG_FUNCTION_NOARGS(静态函数)

l  LOG_LOGIC:函数逻辑信息,宏为NS_LOG_LOGIC

l  LOG_ALL:记录以上所有信息,没有宏。

对于以上每种日志类型,也有等级之分,从上至下递增。使用LOG_LEVEL_TYPE启动层级作用。默认情况下,日志类型等级以下的信息都会被记录(包括自身)。例如使用LOG_INFO只记录宏NS_LOG_INFO定义的信息,而LOG_LEVEL_INFO,则会记录NS_LOG_ERROR,NS_LOG_WARN,NS_LOG_DEBUG定义的信息。

Ns3也提供了另外一个无条件日志类,NS_LOG_UNCOND,记录相关无条件信息。

启动NS_LOG

在第一个例子中,在运行完之后可以看到一系列的输出信息。这些日志信息是由UdpEchoServerApplication和UdpEchoClientApplication记录的,我们可以通过修改NS_LOG环境变量,让其输出信息满足我们的需求。

在first.cc中,有个例子启用了UdpEchoServerApplication的日志:

LogComponentEnable (“UdpEchoServerApplication”, LOG_LEVEL_INFO);

从这句代码中可以看到将UdpEchoServerApplication这个组件的日志等级设置为INFO并将其启用。该过程也可以通过以下方法完成:

l  使用命令行参数设置NS_LOG环境变量

$ export NS_LOG = UdpEchoServerApplication = LEVEL_ALL

上述命令的作用其实就相当于在程序中做如下设置,其中左边是要修改的组件的名字(不是类的名字),右边则是日志的类型:

UdpEchoServerApplication = LEVEL_ALL

如此一来就改变了获取到的日志信息量。

另外为了看出是哪个组件的信息, 我们可以再上述命令中添加一项:

$ export ‘NS_LOG = UdpEchoServerApplication = LEVEL_ALL | prefix_func’

注意到,上述条件必须添加单引号。而且在日志等级和前缀之间使用竖线表示OR操作。于是我们就能够清楚的看到信息是来自于哪个组件。上述命令只记录了一个组件,如果要修改多个组件呢?我们可以使用冒号来表示,如下:

$ export ‘NS_LOG = UdpEchoServerApplication = LEVEL_ALL | prefix_func :   UdpEchoClientApplication = LEVEL_ALL | prefix_func ’

除了查看组件名字的前缀,我们也可以查看当前仿真时间,使用prefix_time,同样也使用竖线分隔。

设置全部组件的情况使用 * 作为通配符,替换上述的组件名字即可。

$ export ‘NS_LOG = * = LEVEL_ALL | prefix_func’

Ns3支持标准输出的重定向操作,将输出到屏幕的信息重新定位到文件中。

$ ./waf --run  PROGRAMFILE  >  LOG.out  2 >& 1

PS:>符号是重定向符号,那么1和2分别表示什么呢? 首先在Linux中,每个进程都和三个系统文件相关联,分别为标准输入stdin、标准输出stdout、标准错误stderr,而这三者对应的文件描述符分别为0,1,2。

并且,2 > 1表示的是将标准错误重定向到文件1中,而不是标准输出。因此需要使用&符号来表示,固为:2 > & 1的格式。

在代码中添加日志记录部分。通过宏调用日志组件,并将其添加到程序中。

日志组件的定义:

NS_LOG_COMPONENT_DEFINE (“First”);

定义完该组件之后变可以通过修改NS_LOG环境变量记录相关信息,例如:

$ export  NS_LOG = First = LEVEL_TYPE

在重新制定日志的相关信息之前,需要将之前建立的日志等级清除掉:

$ export NS_LOG =

  1. 2.   使用命令行参数

Ns3中提供了解析命令行参数的机制,可以通过命令行来设置程序中局部或者全局的变量。但要使用该解析器,就必须在使用之前先声明,如下:

int main (int argc,  char * argv[]) {

……

CommandLine cmd;       //声明了命令行对象

cmd.Parse(argc, argv);   //调用自定义方法解析参数

……

}

为了确认是否解析正确,可以通过打印相关参数识别。Ns3提供了--PrintHelp命令,使用打印函数不需要添加VALUE值,修改程序中的参数时需要有VALUE值。使用双引号将程序名称和参数包起来,如:

$ ./waf –run “YOUR-PROGRAM   --COMPONENT [= VALUE]”

钩子

(等待解析…….)

  1. 3.   使用跟踪系统

Ns3仿真在于将输出保存起来,用于后期分析。因此,其开发出了一套追踪系统,分为三个层次。

基本用户:直接使用系统产生标准的追踪源,允许自定义追踪源的产生组件。

中间用户:可以对系统的输出格式进行修改以满足自身的需求,也可以再不修改核心代码的情况下,添加新的追踪源。

高级用户:修改核心代码,添加任何想要追踪的细节源。

ASCII文件追踪

在程序运行之前(Simulator.Run())定义好ASCII文件,程序开始之后便开始了跟踪。最终结果是产生*.tr文件。下面定义了ASCII追踪实例,该实例创造一个文件流并跟踪你定义的组件变量。

AsciiTraceHelper ascii;

YOUR-COMPONENT-NAME.EnableAsciiAll (ascii.CreateFileStream(“*.tr”));

tr文件可以使用编辑器打开。具体解析过程涉及相关知识较多,详细参考NS3 tutorial第46-48页。

PCAP追踪

使用YOUR-COMPONENT-NAME.EnablePcapAll(“NAME”);便可以生成Pcap的追踪文件,值得说明的是NAME不需要后缀,会自动生成。

Pcap文件的打开工具有两种。1是图形化界面的WireShark,作为包嗅探器,可以显示整个运作过程。2是Linux提供的tcpdump命令。无法使用编辑器打开该类文件。

原文地址:https://www.cnblogs.com/yibobo-blog/p/4940549.html