1、在调试代码时候,一直没有弄明白NS_LOG中的各种函数是如何使用的,甚至现在运行程序只知道,./waf –run,至于输出调试信息,现在真的是没有弄明白,不利于代码的理解和调试。
2、通过命令行,改变实验变量,观察实验结果,./waf --run "sb" --command-template="%s --help"
会出现程序参数和一般参数
比如修改distance(default=50),./waf --run "sb" --command-template="%s --distance=200",会明显实验结果在distance=200时,收发数据包为0,distance距离导致收发双方不能正常通信。
这种通过命令行的方法,只会改变一次运行结果,不会改变文件中的值,下次运行时,distance仍然=50,对于观察实验结果来说,很方便,尤其是把每次改变结果值,写成脚本,运行很方便
3、gdb调试,个人认为比较笨拙,不过在eclipse没安装成功,这也是一个小调试的方法。 ./waf --run "sb" --command-template="gdb %s"
,进入到gdb调试环境中,l,break,r,finish,next,进行调试。
4、NS3中的logging系统,功能也很强大,只是现在使用很少,记录各模块中的输出信息,对调试的执行有帮助。
在程序中”wifi-example-sim.cc”发现,使用了”NS_LOG_COMPONENT_DEFINE”和”NS_LOG_INFO”以及”NS_LOG_ERROR”这3种形式的函数;
比如,我想在运行程序”wifi-example-sim.cc”时,输出NS_LOG_INFO函数中的信息,首先找到NS_LOG_COMPONENT_DEFINE("WiFiDistanceExperiment")
,之后通过命令行 $ export NS_LOG=WiFiDistanceExperiment=info
$ ./waf --run "sb"
观察程序运行情况;
因为该程序,”NS_LOG_ERROR”未执行到,所以,没有信息输出。
5、 $ export NS_LOG=WiFiDistanceExperiment=all:WiFiDistanceApps=all
$ ./waf --run "sb"
可以看到”wifi-example-sim.cc”和”wifi-example-apps.cc”中的NS_LOG信息,便于理解程序运行。
分析程序,从main函数运行,“Create traffic source & sink”之后,创建对象,调用WiFiDistanceApps::Sender和WiFiDistanceApps::Receiver(使用了NS_LOG_FUNCTION_NOARGS,输出函数的名字,这应该只在静态函数中使用;大多数成员函数应该使用NS_LOG_FUNCTION()),之后开始Simulator::Run()
6、如果显示函数前缀,$ export 'NS_LOG=WiFiDistanceExperiment=all|prefix_func|prefix_time:WiFiDistanceApps=all|prefix_func|prefix_time'
$ ./waf --run "sb"
可以得到很详细的函数调用,以及函数调用的时间,有时候也是一种负担,因为太详细,终端不容易观察,可以输出到文本文件中查看$ ./waf --run "sb" >&sb.txt
可以通过$ gedit sb.txt
查看输出信息。
7、为了方便,经常定义
bool verbose=false;
WifiHelper wifi;
if(verbose)
{
wifi.EnableLogComponents();
}//turn on all wifi logging
8、同样也可以定义:
bool tracing=false;//turn on ascii and pcap tracing;
if(tracing == true)
{
AsciiTraceHelper ascii;
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default();
wifiPhy.EnableAsciiAll(ascii.CreateFileStream("wifi-simple-adhoc-grid.tr"));
wifiPhy.EnablePcap("wifi-simple-adhoc-grid",devices);
NetdeviceContainer devices = wifi.Install(wifiPhy,wifiMac,c);
}
export NS_LOG=UdpEchoClientApplication=level_all
export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:UdpEchoServerApplication=level_all|prefix_func'
export 'NS_LOG=*=level_all|prefix_func|prefix_time'
unset NS_LOG//关闭所有的NS-LOG