您的位置:首页 > 其它

(转)ns2输出调试信息及trace

2011-07-29 17:13 253 查看
在使用NS2进行协议仿真的过程中,对于调试信息的输出通常采取三两种方式,一种是使用fprintf,另一种是sprintf。

1、 fprintf

将格式化数据写入流式文件中

fprintf(stderr, "%s: got my own REQUEST\n", __FUNCTION__); //其中stderr是标准错误输出,这里会输出到控制台上

2、sprintf

2.1 输出到字符串中

sprintf(logtarget_->pt_->buffer(), "THIS IS A TEST!!!");

logtarget_->pt_->dump();

//这里的THIS IS A TEST就是要输出的内容,实际上这里是采用字符串流的方式将文本输出到了.tr文件中

2.2 输出到tcl

char out[100];

// Prepare the output to the Tcl interpreter. Calculate the round

// trip time

sprintf(out, "%s recv %d %3.1f", name(),

hdrip->src_.addr_ >> Address::instance().NodeShift_[1],

(Scheduler::instance().clock()-hdr->send_time) * 1000);

Tcl& tcl = Tcl::instance();

tcl.eval(out);

#in tcl scripts, for example Agent/Ping protocol

Agent/Ping instproc recv {from rtt} {

$self instvar node_

puts "node [$node_ id] received ping answer from \

$from with round-trip-time $rtt ms."

}

Trace文件的写入需要包的发送和接收触发,但是也可在程序 中控件它的发生。这时我们需要一个Trace*变量:

Trace* logtarget_;

对这个变量的初始化,可以在command函数中。

logtarget_ = (Trace*)TclObject::lookup(argv[2]);

这样就可以通过logtarget_在任何时候,把要写入的信息写入到Trace文件 中去。如:

sprintf(logtarget_->pt_->buffer(),"hello world");

logtarget_->pt_->dump(); //写入缓存

Trace文件的写入技巧:

每向buffer()写入一次数据,就需要dump()一次。如果在dump()之前又执行了一次sprintf,那后一次会黑覆盖前一次的内容,即buffer的指针并不会自动移动。如果要实现指针移动,就要记住每次写入后的offset。

sprintf(logtarget_->pt_->buffer(),"hello world");

sprintf(logtarget_->pt_->buffer(),"Hi");

logtarget_->pt_->dump();

//只有"Hi","hello world"被覆盖了。

sprintf(logtarget_->pt_->buffer(),"hello world");

offset = strlen(logtarget->pt_->buffer());

sprintf(logtarget_->pt_->buffer() + offset,"Hi");

logtarget_->pt_->dump();



sprintf(logtarget_->pt_->buffer(),"hello world");

logtarget_->pt_->dump();

sprintf(logtarget_->pt_->buffer(),"Hi");

logtarget_->pt_->dump();

效果一样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: