Date: Tue, 22 Jan 2013 19:03:16 -0500 From: Ryan Stone <rysto32@gmail.com> To: Yuri <yuri@rawbw.com> Cc: FreeBSD Hackers <hackers@freebsd.org> Subject: Re: Why DTrace sensor is listed but not called? Message-ID: <CAFMmRNxvLU4WA7uV3TkixEz6vh8NDc%2BARM_b2d8igHAMXKy-EQ@mail.gmail.com> In-Reply-To: <50FEEB6C.7090303@rawbw.com> References: <50FEEB6C.7090303@rawbw.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Jan 22, 2013 at 2:41 PM, Yuri <yuri@rawbw.com> wrote:
> I tried to create my own DTrace sensors (for debugging purposes) through
> adding of the simple function like this:
> static u_int
> xxx_my_trace(int arg) {
> return 1;
> }
>
> It is listed in dtrace -l with its entry and return sensors.
> 8143 fbt kernel xxx_my_trace entry
> 8144 fbt kernel xxx_my_trace return
> This function is called, I know for sure because it is called from another
> procedure which does get traced by DTrace.
> However, these sensors are never triggered when run through dtrace(1M)
> #!/usr/sbin/dtrace -s
> ::xxx_my_trace:entry
> {
> printf("xxx_my_trace");
> }
> It does print the following, but nothing else:
> dtrace: script './dt.d' matched 1 probe
>
> Adding __attribute__((noinline)) doesn't help.
>
> What is the problem? Why dtrace sensors aren't invoked?
>
Offhand, I can't of why this isn't working. However there is already a way
to add new DTrace probes to the kernel, and it's quite simple, so you could
try it:
/* The headers that you need to include. */
#include "opt_kdtrace.h"
#include <sys/kernel.h>
#include <sys/sdt.h>
/* Declare a DTrace provider */
SDT_PROVIDER_DEFINE(your_provider);
/*
* Declare the DTrace probe
your_provider:your_module:your_function:your_probe. You may
* leave your_module or your_function blank. Most Solaris probes do, like
sched:::dequeue.
* We declare this probe to take 1 argument (DEFINE1) of type int.
*
* probe_uniquifier can be chosen arbitrarily if you like, but convention
is to make it the same
* as your_probe. The exception is if your-probe contains a character that
is not valid in a C
* (like a -, as in sched:::on-cpu). In that case the invalid character is
usually replaced with an
* underscore.
*/
SDT_PROBE_DEFINE1(your_provider, your_module, your_function,
probe_uniquifier, your_probe, "int");
To call a probe:
SDT_PROBE1(your_provider, your_module, your_function, probe_uniquifier,
my_int_arg);
(There is a wiki page on this, but it is out of date. I will clean it up).
Your D script would look like:
#!/usr/sbin/dtrace -s
your_provider:your_module:your_function:your_probe
{
printf("xxx_my_trace");
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFMmRNxvLU4WA7uV3TkixEz6vh8NDc%2BARM_b2d8igHAMXKy-EQ>
