Hi all,

There was a discussion about this a while back, but now some new information has come to light:

Consider the situation where a thread calls a leaf function which does not create a stack frame (such as atomic_*). The following toy program demonstrates this scenario:

--- begin backtrace.c ------------
#include <atomic.h>
unsigned int x;
int foo() {
    int y = 1;
    while(y != 100) {
        y = atomic_swap_32(&x, y);
    }
    return x;
}
int main() {
    return 10 + foo();
}
--- end backtrace.c ------------

If we grab stack frames by instrumenting the function directly -- "pid$target::atomic_swap_32:entry {...@counts[ustack()]=count();}" -- then we get:

              libc.so.1`atomic_swap_32
              a.out`foo+0x2c
              a.out`main+0x4
              a.out`_start+0x108
          1054138

If, on the other hand, we profile the process -- "profile-7777us/pid==$target/ {...@counts[ustack()]=count(); }" -- and grab stack frames again, we get (among other far rarer variants):

              libc.so.1`atomic_swap_32
              a.out`main+0x4
              a.out`_start+0x108
             1167

Note that this is *not* related to tail calls (there are none here). Since in both cases $pc is the same, the problem must be due to either the profile probe's way of saving process context or else the stack walking code doing something wrong under profiling...

Ideas?
Ryan

_______________________________________________
dtrace-discuss mailing list
dtrace-discuss@opensolaris.org

Reply via email to