Thanks Chad, but I don't think that this is the problem.  The this->rAcqArr 
points to the beginning of an array in the traced process.  I initialize it in 
a previous clause that has exactly the same probe:

pid$target::ReportTx:entry
/arg1 != 0 /
{
  this->dataP = (ProfData*)copyin(arg2, sizeof(ProfData));
  this->numEntries = this->dataP->numRAcqEntries;
  this->rAcqArr = this->dataP->racqInfoArr;
}

So the value of this->rAcqArr should be live until all clauses with the same 
probe are done executing.

Moreover, I know that the value that I'm getting is valid, because I had the 
following printf statement:

pid$target::ReportTx:entry
/arg1 != 0 && this->numEntries != 0/
{
  printf("NumEntries: %lld\n", (long long)this->numEntries);
  this->entry = 
(ReadAcqEntry*)copyin((uintptr_t)&(this->rAcqArr[this->numEntries-1]),
                                      sizeof(ReadAcqEntry));

  this->pcInt = (uintptr_t)(this->entry->pc);
/*  this->instr = stringof(this->pcInt);*/

  printf("%p\t%d\t%d\t%d\n",
         this->entry->pc,
         this->entry->acqNum,
         this->entry->upgradeNum + this->entry->contUpgradeNum,
         this->entry->contUpgradeNum);
  this->numEntries--;
}

and the results look fine.  The only problem is when I un-comment the stringof 
statement.

I even tried using this->entry->pc as a key to an aggregation, with no 
problems.  I only encountered the problem when I tried to convert it to a 
string.

So, I can printf this->entry->pc (with %p flag), I can use it as a key to an 
aggregation, but I cannot convert it to a string --- any idea why?

As an aside, I noticed that the invalid address specified in the error message 
is different that the value of this->entry->pc.

Thanks again,
Yossi
-- 
This message posted from opensolaris.org
_______________________________________________
dtrace-discuss mailing list
dtrace-discuss@opensolaris.org

Reply via email to