一、Logging Module
ns3的日志记录可以完全禁用,逐个组件启用,或全局启用,日志记录按照详细程度分为以下几个级别 :
- LOG_ERROR—记录错误消息
- LOG_WARN—记录警告消息
- LOG_DEBUG—记录相对罕见、特别调试消息
- LOG_INFO—记录关于程序进程的信息消息
- LOG_FUNCTION—记录调用的每个函数
- LOG_LOGIC—记录描述函数内逻辑流的消息
- LOG_ALL—记录上面提到的所有内容
对于每个LOG_TYPE,还有一个LOG_LEVEL_TYPE,如果使用它,日志除了记录当前其级别之外,还记录它上面的所有级别。(因此,LOG_ERROR和LOG_LEVEL_ERROR以及LOG_ALL和LOG_LEVEL_ALL在功能上是等价的。)例如,启用LOG_INFO将只启用NS_LOG_INFO提供的消息,而启用LOG_LEVEL_INFO也将启用NS_LOG_DEBUG、NS_LOG_WARN和NS_LOG_ERROR宏提供的消息。
此外还提供了一个总是无条件显示的日志记录宏NS_LOG_UNCOND,无条件地记录关联的消息
可以使用 shell环境变量(NS_LOG) 或通过日志记录 系统函数调用 来设置日志记录。
以first.cc为例:
初始代码下打印如下图
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
在终端输入命令修改LOG级别:
export NS_LOG=UdpEchoClientApplication=level_all
再次运行first.cc:
通过命令行输入 export NS_LOG=""
关闭之前配置的level_all属性,此时任何LOG信息都不再打印。
在first.cc中加入一行打印输出信息NS_LOG_INFO("Creating Topology");
运行first.cc,终端中并没有打印:
为了查看新增的打印信息,必须启用级别大于等于NS_LOG_INFO的日志记录组件,在终端输入:
export NS_LOG=FirstScriptExample=info
运行first.cc,此时可以看到新增的信息“Creating Topology”被打印出来:
二、从命令行修改脚本参数
2.1 声明命令行解析器
在主函数main开始部分输入:
CommandLine cmd;
cmd.Parse(argc, argv);
2.2 命令行语句
见官方tutorial
如果删去first.cc中配置传输速率、信道时延的两行代码,点到点网络设备的数据速率将从5Mbps降低到默认的32768bps。
三、Tracing system
通过在脚本文件中加入如下代码来获取打印输出
#include <iostream>
int main(){
std::cout << "The value of x is " << 1 << std::endl;
}
3.1 ASCII Tracing
在Simulator::Run();
前加入后运行
AsciiTraceHelper ascii;
pointToPoint.EnableAsciiAll(ascii.CreateFileStream("myfirst.tr"));
在ns-3.39目录下输出一个文件myfirst.tr:
每行的开头有一个符号,这些符号的意义分别是:
+:在设备队列上发生了排队操作;
-:在设备队列上发生了退出队列操作;
d:删除了一个数据包,通常是因为队列已满;
r:网络设备接收到一个数据包。
通过上面的文件可以看到udp头8B,Ipv4头20B,ttl为64等等信息。
3.2 PCAP Tracing
ns-3设备助手也可用于创建.pcap格式的跟踪文件。首字母缩写词pcap(通常用小写字母)表示数据包捕获(packet capture),实际上是一个包含.pcap文件格式定义的API。
用于启用pcap跟踪的代码:pointToPoint.EnablePcapAll("myfirst");
加入此行代码并运行,将在ns-3.39目录下看到名为“myfirst-0-0.pcap”和“myfirst-1-0.pcap”的文件,它们分别是Node0-device0和Node1-device0的pcap跟踪记录。
使用tcpdump查看生成的两个文件,在命令行输入:
tcpdump -nn -tt -r myfirst-0-0.pcap
也可以在Wireshark中打开.pcap文件。