[Click] How to add new information to ns trace files.
Michael Neufeld
Michael.Neufeld at colorado.edu
Wed Dec 22 09:46:47 EST 2004
I don't think you can safely do a direct cast to a C++ object of an OTcl
object reference passed in as a Tcl argument. For example, there's the
following code over in dsr_proto.cc:
if(strcasecmp(argv[1], "tracetarget") == 0) {
tracetarget = (Trace*) TclObject::lookup(argv[2]);
if(tracetarget == 0)
return TCL_ERROR;
return TCL_OK;
Note the call to TclObject::lookup which is performed on the handle
which comes through before the cast occurs.
-Mike
Michael Voorhaen wrote:
> Hi,
>
> I am trying to modify nsclick to allow me to add trace information to
> the ns trace files from any click element. I have looked through the
> interface code between ns and click and added a new function to simclick.h:
>
> int simclick_sim_trace(simclick_sim simins, simclick_click clickinst,
> const unsigned char* data, const char* logentry);
>
> This function is then implemented in classifier-click.cc. So right now
> I've gotten up to the point where I can send the information that needs
> to be traced to ns2. But when I configure my ClickClassifier with a
> Trace object and try to add something to the trace, I keep getting
> segmentation faults. I suspect this is because the object I am getting
> from my ns configuration script is not a Trace object or at least not a
> correct one. Since if I create the a trace object in the c++ code I
> don't get the segmentation faults.
>
> I've copied the relevant code snippets below. I started from the dsr
> code as an example of how to add new trace information to the trace
> files. When trying to add something I get the following error:
>
> ClickClassifier: after va_start 85ec488 2
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x0805c7e2 in BaseTrace::buffer (this=0x2) at basetrace.h:50
> 50 basetrace.h: No such file or directory.
> in basetrace.h
>
> In fact the logtarget_ (see below) points to some object, but
> logtarget_->pt_ points to 2. Which is weird since a trace object
> creates a basetrace object in it's constructor. Can someone help me with
> this problem. I guess that I am doing something wrong in my tcl script,
> but the documentation on this is so vague. I've tried a lot of thing but
> I don't see any solution.
>
> Best Regards,
> Michael
>
> Code snippets below:
>
> In classifier-click.cc
>
> if(strcmp(argv[1], "tracetarget") == 0) {
> printf("ClickClassifier: tracetarget called\n");
> logtarget_ = (Trace *) argv[2];
> return TCL_OK;
> }
>
> ---------------------
>
> In classifier-click.cc
>
> int
> simclick_sim_trace(simclick_sim siminst, simclick_click clickinst, const
> unsigned char* data, const char* logentry) {
> //printf("classifier-click.cc: need to implement simclick_sim_trace\n");
> ClickClassifier* theclassifier = (ClickClassifier*)siminst;
> theclassifier->trace("t");
> return 1;
> }
>
> ------------------------------
>
> In classifier-click.cc
>
> void
> ClickClassifier::trace(char* fmt, ...)
> {
> va_list ap;
>
> printf("ClickClassifier: start\n");
>
> if (!logtarget_) {
> printf("ClickClassifier: need to configure tracetarget\n");
> return;
> }
> printf("ClickClassifier: after !logtarget_\n");
> va_start(ap, fmt);
> printf("ClickClassifier: after va_start %x %x \n", logtarget_,
> logtarget_->pt_);
> vsprintf(logtarget_->pt_->buffer(), fmt, ap);
> printf("ClickClassifier: after vs_printf\n");
> logtarget_->pt_->dump();
> printf("ClickClassifier: after dump\n");
> va_end(ap);
> printf("ClickClassifier: after va_end\n");
> }
>
> ----------------------------
>
> in the ns script:
>
> set T [new Trace/Generic]
> $T target [$ns_ set nullAgent_]
> $T attach $tracefd
> $T set src_ [$node_bb_($i) id]
> [$node_bb_($i) entry] tracetarget $T
> [$node_bb_($i) entry] loadclick "olsr_2int.click"
>
>
>
> _______________________________________________
> click mailing list
> click at amsterdam.lcs.mit.edu
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
More information about the click
mailing list