[dtrace-discuss] When does ufunc/func work?

Diomidis Spinellis dds at aueb.gr
Thu Dec 7 08:20:55 PST 2006


I'm trying to profile the time spent in libc functions in a large build job (building Perl), and I have trouble getting ufunc and func working.  (func() is not strictly needed; I was just hoping to use it in order to profile idle time.)

Here's the story.  I've written a dtrace script to start a separate dtrace process for each invoked command:

int fileid;

proc:::exec-success
/pid == $target || progenyof($target)/
{
        self->traceme = 1;
        @proc[execname] = count();
}

/* This should fire AFTER libc has been dloaded. */
syscall::setcontext:entry
/self->traceme/
{
        self->traceme = 0;
        stop();
        system("dtrace -q -s /export/home/dds/src/dtrace/libc.d -o /export/home/
dds/src/dtrace/data/%07d-%d.out %d &", ++fileid, pid, pid);
}

and a script for actually profiling user and kernel functions:

BEGIN {
        system("prun %d", $1);
}

/*
 * The process we were launched to watch is terminating.
 * We should also exit, because our work is done.
 */
proc:::exit
/pid == $1/
{
        printf("\nCommand: %s\n", execname);
        exit(0);
}

profile-997Hz
/arg1 != NULL && pid == $1/
{
        @u[ufunc(arg1)] = count();
}

profile-997Hz
/arg2 != NULL/
{
        @k[func(arg2)] = count();
}

END
{
        printf("\nUser functions\n");
        trunc(@u, 100);
        printa(@u);
        printf("\nKernel functions\n");
        trunc(@k, 20);
        printa(@k);
}

However, when I profile a run using these scripts, all I get is hexadecimal addresses:

User functions

  0xd2ef4caa                                                       10
  0xd2ef4c78                                                       20
  0xd2ef4c8a                                                       20
  0xd2ef4c9c                                                       20

Kernel functions

  0x92269c                                                          1
  0x929ee2                                                          1
  0x931610                                                          1

[...]

I've been able to obtain user function addresses by specifying a command directly in the command line.  For example,

dtrace -n profile-937Hz'/arg1 != NULL/{@u[ufunc(arg1)] = count()}' -c ~/bin/run-stcmp
gives me:
  libc.so.1`strcmp                                                140

However, I've never suceeded in obtaining kernel function names.  Running 
dtrace -n profile-1234Hz'/arg2 != NULL/{@k[func(arg2)] = count()}END{trunc(@k, 10);printa(@k);}'
gives me:
  0x9fbf4c                                                          1
  0xa6fc19                                                          1
  0xaabb59                                                          1
  0xabb648                                                          1

So my questions are:
- What is needed for ufunc() to work?  I would think that even when dtrace attaches to a pid, it could get the process's namelist through /proc/$pid/path/a.out.
- Why isn't func() working?  Do I need a specific / custom kernel build?  I'm runnning snv_50 i86pc.
 
 
This message posted from opensolaris.org


More information about the dtrace-discuss mailing list