[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