首页 > 代码库 > 6、ns-3数据跟踪
6、ns-3数据跟踪
两类跟踪技术:一类是直接将执行过程显示在命令行中,有助于调试仿真脚本,ns-3用Logging系统。另一类是更为常用的将采集到的数据直接存放在一个文件中,以便后期的处理与分析,ns-3使用的是Tracing系统。
1、Logging系统
v 有7个等级,有低到高,高的包含低的消息:
LOG_ERROR——记录错误信息
LOG_WARN——记录警告信息
LOG_DEBUG——记录一些调试信息
LOG_INFO——记录一些程序相关的信息
LOG_FUNCTION——当有函数被调用时,该调用信息就被记录
LOG_LOGIC——对于整体逻辑的描述
LOG_ALL——包含上述的所有信息
LOG_TYPE和LOG_LEVEL_TYPE功能一样。
v 通过cc文件程序里面添加记录信息
First文件中的两个激活记录信息的语句:
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
所以会有结果:
v 通过环境变量修改记录系统等级
可以在编译脚本前使用export命令修改NS_LOG的值,比如针对first.cc这个例子,就可以这样做:
在终端输入:
export ‘NS_LOG=UdpEchoClientApplication=level_all:UdpEchoServerApplication=level_all‘
注意等号的右边是小写字符,和在程序中改不同。
截图:
然后再在终端运行
#./waf --run first
注意三点:1、要在root用户下,2、run前面是两个杆,3、运行目录在ns-3的源码目录
截图如下:
v 添加函数前缀
只要在脚本的语句中改为:
export ‘NS_LOG=UdpEchoClientApplication=level_all|prefix_func:UdpEchoServerApplication=level_all|prefix_func‘
如果要添加函数调用时间,那么就是添加语句
export ‘NS_LOG=UdpEchoClientApplication=level_all|prefix_func|prefix_time:UdpEchoServerApplication=level_all|prefix_func|prefix_time‘
v 自定义Logging代码
在main函数前面添加语句:
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");//这个可以自己取
在main函数开始时,注册:
LogComponentEnable ("FirstScriptExample", LOG_LEVEL_INFO);//可以用环境变量来export NS_LOG=FirstScriptExample=level_info
然后在函数里面用类似的语句来输出信息:
NS_LOG_INFO("Create Topology");
文件的语句:
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");
int
main (int argc, char *argv[])
{
Time::SetResolution (Time::NS);
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
LogComponentEnable ("FirstScriptExample", LOG_LEVEL_INFO);
NS_LOG_INFO("Create Topology");
……
}
结果截图:
v 命令行参数
在main函数里面可以调用函数Parse。
int
main (int argc, char *argv[])
{
……
CommandLine cmd;
cmd.Parse(argc,argv);
……
}
其中CommandLine类写着:
--PrintHelp:打印帮助信息
--PrintGroups:打印住列表
--PrintTypeIds:打印所有TypeIds
--PrintGroup=[group]:打印所有TypeIds of group
--PrintAttributes=[typeid]:打印所有属性
--PrintGlobals:打印全局列表
然后运行
./waf --run "first --PrintAttributes=ns3::PointToPointNetDevice"
可以看到属性的结果:
v 挂钩自己的变量
用户可以添加自己的变量,修改first.cc代码:
int
main (int argc, char *argv[])
{
……
uint32_t nPackets=1;
CommandLine cmd;
cmd.AddValue("nPackets","Number of packet to echo", nPackets);//使得变量nPackets可以在命令行修改的。参数、帮助、值
cmd.Parse(argc,argv);//一定在上面三个函数之后
……
//echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("MaxPackets", UintegerValue (nPackets));
……
}
输入./waf --run "first --PrintHelp"可以看到用户定义的参数:--nPackets: Number of packet to echo [1]
执行下面命令:./waf --run "first --nPackets=2"
可以看到发送两个包。
2、Tracing系统
该系统用于存储大量信息。包含三个基本概念:Tracing Sources、Tracing Sink以及将前面二者连接在一起的机制。下面两种是封装好的Helper类:
v ASCII Tracing
它是以ASCII格式的信息输出的。在Simulator::Run()代码前添加如下代码就可以:
AsciiTraceHelper ascii;
pointToPoint.EnableAsciiAll(ascii.CreateFileStream("myfirst.tr"));
Simulator::Run ();
v PCAP Tracing
它是以PCAP格式的信息输出的。在Simulator::Run()代码前添加如下代码就可以:
pointToPoint.EnablePcapAll("myfirst");
Simulator::Run ();