Hi! I''m in the process of adding USDT probes to MySQL Proxy and am experiencing some problems with my approach. For example, I have one probe that fires when the state of a connection changes (the state machine is based on the MySQL protocol): (FYI, this is all done on OS X but everything is applicable to OpenSolaris as well) the provider .d file contains: -------- provider mysql_proxy { probe state__change(int, short, void *); }; -------- In a source file I invoke the probe with: MYSQL_PROXY_STATE_CHANGE(event_fd, events, con); event_fd and events are int and short, respectively. con actually is: network_mysqld_con *con; Now the problems start: I meant to pass in high-level information into the probe, because that will maximize the flexibility of writing scripts. But now writing a D script that makes use of con means either - including the structs and enums in the script - including the original header file and using that - doing lots and lots of error prone copyin(arg2 + xxx, sizeof(type)), which is neither elegant nor nice on the script author Because ''typedef struct { ... } network_mysqld_con'' is actually a non- trivial struct and refers to various other structs and enums it''s not a good idea to copy it in. Things _will_ get out of sync. Including the original header didn''t work either, because that''s eventually pulling in system headers that define functions which break the script compilation (I''ve seen this problem on both OS X and OpenSolaris. E.g. OS X chokes on /usr/include/sys/_structs.h) Which leaves me with option 3 and that''s equally burdensome and errorprone, especially given the multitude of structs I have to deal with. Much of the flexibility about DTrace would be sacrificed if I would pass in only a few specific members of the structs, too. What is the current best-practice for this kind of situation? [1] I have read about DTrace translators (<http://blogs.sun.com/tdd/entry/example_of_a_dtrace_translator >) but I think that''s only available for DTrace >= 1.5, correct? Apple''s implementation seems to be 1.2.2, if I can believe its output. Also, the translators seem to make it easier for the script writer, but can''t solve the underlying maintenance problem. Essentially I''m coming to think that this calls for a simple tool that takes struct definitions and produces suitable D code for prying them apart again, without pulling in all of the headers involved. Then the actual struct access could either be implemented using translators if available or by using copyin(arg + offset, sizeof()). The entire thing could futher be hidden behind macros, which could live in header files shipped with the actual product. Those would be generated at build time. Does that even remotely sound like a good idea? Thanks, -k [1] I''ve seen http://src.opensolaris.org/source/xref/jds/spec-files/trunk/patches/Python-07-dtrace.diff#263 and http://prefetch.net/projects/apache_modtrace/scripts/ apachetop.pl as examples and both seem to go down a path I don''t really wanna tread... :( -- Kay Roepke Software Engineer, MySQL Enterprise Tools Sun Microsystems GmbH Sonnenallee 1, DE-85551 Kirchheim-Heimstetten Geschaeftsfuehrer: Thomas Schroeder, Wolfang Engels, Dr. Roland Boemer Vorsitz d. Aufs.rat.: Martin Haering HRB MUC 161028
James McIlree
2008-Jun-17 20:57 UTC
[dtrace-discuss] Passing pointer-to-struct to USDT probes
On Jun 17, 2008, at 4:47 AM, Kay R?pke wrote:> > Now the problems start: I meant to pass in high-level information into > the probe, because that will maximize the flexibility of writing > scripts. > But now writing a D script that makes use of con means either > - including the structs and enums in the script > - including the original header file and using that > - doing lots and lots of error prone copyin(arg2 + xxx, > sizeof(type)), which is neither elegant nor nice on the script author > > Because ''typedef struct { ... } network_mysqld_con'' is actually a non- > trivial struct and refers to various other structs and enums it''s not > a good idea to copy it in. Things _will_ get out of sync.At first glance, it seems like user space CTF would be a big win here. James M
John Levon
2008-Jun-17 22:45 UTC
[dtrace-discuss] Passing pointer-to-struct to USDT probes
On Tue, Jun 17, 2008 at 01:57:20PM -0700, James McIlree wrote:> > Now the problems start: I meant to pass in high-level information into > > the probe, because that will maximize the flexibility of writing > > scripts. > > But now writing a D script that makes use of con means either > > - including the structs and enums in the script > > - including the original header file and using that > > - doing lots and lots of error prone copyin(arg2 + xxx, > > sizeof(type)), which is neither elegant nor nice on the script author > > > > Because ''typedef struct { ... } network_mysqld_con'' is actually a non- > > trivial struct and refers to various other structs and enums it''s not > > a good idea to copy it in. Things _will_ get out of sync. > > At first glance, it seems like user space CTF would be a big > win here.Well, the easiest fix is to do one, or both, of fixing system headers to be DTrace-friendly (hello, Solaris stat_impl.h), or improving the DTrace parser to understand such headers and ignore the relevant bits regards john