1*4882a593Smuzhiyun<?xml version="1.0" encoding="ISO-8859-1"?> 2*4882a593Smuzhiyun<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" 3*4882a593Smuzhiyun "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [ 4*4882a593Smuzhiyun <!ENTITY % defs SYSTEM "/xserver/doc/xml/xserver.ent"> %defs; 5*4882a593Smuzhiyun]> 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun<article id="Xserver-DTrace"> 8*4882a593Smuzhiyun <articleinfo> 9*4882a593Smuzhiyun <title>Xserver Provider for DTrace</title> 10*4882a593Smuzhiyun <author> 11*4882a593Smuzhiyun <firstname>Alan</firstname><surname>Coopersmith</surname> 12*4882a593Smuzhiyun <affiliation> 13*4882a593Smuzhiyun <orgname>Oracle Corporation</orgname> 14*4882a593Smuzhiyun <orgdiv>Solaris Engineering</orgdiv> 15*4882a593Smuzhiyun </affiliation> 16*4882a593Smuzhiyun </author> 17*4882a593Smuzhiyun <releaseinfo>X Server Version &xserver.version;</releaseinfo> 18*4882a593Smuzhiyun <copyright><year>2005</year><year>2006</year><year>2007</year><year>2010</year><year>2020</year> 19*4882a593Smuzhiyun <holder>Oracle and/or its affiliates.</holder> 20*4882a593Smuzhiyun </copyright> 21*4882a593Smuzhiyun <legalnotice id="copyright"> 22*4882a593Smuzhiyun <para> 23*4882a593SmuzhiyunPermission is hereby granted, free of charge, to any person obtaining a 24*4882a593Smuzhiyuncopy of this software and associated documentation files (the "Software"), 25*4882a593Smuzhiyunto deal in the Software without restriction, including without limitation 26*4882a593Smuzhiyunthe rights to use, copy, modify, merge, publish, distribute, sublicense, 27*4882a593Smuzhiyunand/or sell copies of the Software, and to permit persons to whom the 28*4882a593SmuzhiyunSoftware is furnished to do so, subject to the following conditions: 29*4882a593Smuzhiyun </para><para> 30*4882a593SmuzhiyunThe above copyright notice and this permission notice (including the next 31*4882a593Smuzhiyunparagraph) shall be included in all copies or substantial portions of the 32*4882a593SmuzhiyunSoftware. 33*4882a593Smuzhiyun </para><para> 34*4882a593SmuzhiyunTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 35*4882a593SmuzhiyunIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 36*4882a593SmuzhiyunFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 37*4882a593SmuzhiyunTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 38*4882a593SmuzhiyunLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 39*4882a593SmuzhiyunFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 40*4882a593SmuzhiyunDEALINGS IN THE SOFTWARE. 41*4882a593Smuzhiyun </para> 42*4882a593Smuzhiyun </legalnotice> 43*4882a593Smuzhiyun </articleinfo> 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun <sect1 id="introduction"> 46*4882a593Smuzhiyun <title>Introduction</title> 47*4882a593Smuzhiyun <para> 48*4882a593Smuzhiyun This page provides details on a 49*4882a593Smuzhiyun <ulink url="http://dtrace.org/guide/chp-usdt.html">statically defined user application tracing provider</ulink> 50*4882a593Smuzhiyun for the 51*4882a593Smuzhiyun <ulink url="http://dtrace.org/blogs/about/">DTrace</ulink> 52*4882a593Smuzhiyun facility in <productname>Solaris</productname> 10, 53*4882a593Smuzhiyun <productname>MacOS X</productname> 10.5, and later releases. This 54*4882a593Smuzhiyun provider instruments various points in the X server, to allow 55*4882a593Smuzhiyun tracing what client applications are up to. DTrace probes may be used 56*4882a593Smuzhiyun with <ulink url="http://sourceware.org/systemtap/">SystemTap</ulink> 57*4882a593Smuzhiyun on GNU/Linux systems. 58*4882a593Smuzhiyun </para> 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun <para> 61*4882a593Smuzhiyun The provider was integrated into the X.Org git master repository 62*4882a593Smuzhiyun with Solaris 10 & OpenSolaris support for the Xserver 1.4 release, 63*4882a593Smuzhiyun released in 2007 with X11R7.3. Support for DTrace on MacOS X 64*4882a593Smuzhiyun was added in Xserver 1.7. 65*4882a593Smuzhiyun </para> 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun <para> 68*4882a593Smuzhiyun These probes expose the request and reply structure of the X protocol 69*4882a593Smuzhiyun between clients and the X server, so an understanding of that basic 70*4882a593Smuzhiyun nature will aid in learning how to use these probes. 71*4882a593Smuzhiyun </para> 72*4882a593Smuzhiyun </sect1> 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun <sect1 id="probes"> 75*4882a593Smuzhiyun <title>Available probes</title> 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun <para> 78*4882a593Smuzhiyun Due to the way User-Defined DTrace probes work, arguments to 79*4882a593Smuzhiyun these probes all bear undistinguished names of 80*4882a593Smuzhiyun <parameter>arg0</parameter>, <parameter>arg1</parameter>, 81*4882a593Smuzhiyun <parameter>arg2</parameter>, etc. These tables should help you 82*4882a593Smuzhiyun determine what the real data is for each of the probe arguments. 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun <table id="Probes_and_their_arguments"> 85*4882a593Smuzhiyun <title>Probes and their arguments</title> 86*4882a593Smuzhiyun <tgroup cols='9'> 87*4882a593Smuzhiyun <colspec colname="probe" colwidth="2*"/> 88*4882a593Smuzhiyun <colspec colname="desc" colwidth="3*"/> 89*4882a593Smuzhiyun <colspec colname="arg0" colwidth="1*"/> 90*4882a593Smuzhiyun <colspec colname="arg1" colwidth="1*"/> 91*4882a593Smuzhiyun <colspec colname="arg2" colwidth="1*"/> 92*4882a593Smuzhiyun <colspec colname="arg3" colwidth="1*"/> 93*4882a593Smuzhiyun <colspec colname="arg4" colwidth="1*"/> 94*4882a593Smuzhiyun <colspec colname="arg5" colwidth="1*"/> 95*4882a593Smuzhiyun <colspec colname="arg6" colwidth="1*"/> 96*4882a593Smuzhiyun <spanspec spanname="all" namest="probe" nameend="arg4"/> 97*4882a593Smuzhiyun <thead> 98*4882a593Smuzhiyun <row> 99*4882a593Smuzhiyun <entry>Probe name</entry> 100*4882a593Smuzhiyun <entry>Description</entry> 101*4882a593Smuzhiyun <entry>arg0</entry> 102*4882a593Smuzhiyun <entry>arg1</entry> 103*4882a593Smuzhiyun <entry>arg2</entry> 104*4882a593Smuzhiyun <entry>arg3</entry> 105*4882a593Smuzhiyun <entry>arg4</entry> 106*4882a593Smuzhiyun <entry>arg5</entry> 107*4882a593Smuzhiyun <entry>arg6</entry> 108*4882a593Smuzhiyun </row> 109*4882a593Smuzhiyun </thead> 110*4882a593Smuzhiyun <tbody> 111*4882a593Smuzhiyun <row> 112*4882a593Smuzhiyun <entry spanname="all" class="grouphead">Request Probes</entry> 113*4882a593Smuzhiyun </row> 114*4882a593Smuzhiyun <row> 115*4882a593Smuzhiyun <entry>request-start</entry> 116*4882a593Smuzhiyun <entry>Called just before processing each client request.</entry> 117*4882a593Smuzhiyun <entry><parameter>requestName</parameter></entry> 118*4882a593Smuzhiyun <entry><parameter>requestCode</parameter></entry> 119*4882a593Smuzhiyun <entry><parameter>requestLength</parameter></entry> 120*4882a593Smuzhiyun <entry><parameter>clientId</parameter></entry> 121*4882a593Smuzhiyun <entry><parameter>requestBuffer</parameter></entry> 122*4882a593Smuzhiyun <entry nameend="arg5" class="unused"/> 123*4882a593Smuzhiyun <entry nameend="arg6" class="unused"/> 124*4882a593Smuzhiyun </row> 125*4882a593Smuzhiyun <row> 126*4882a593Smuzhiyun <entry>request-done</entry> 127*4882a593Smuzhiyun <entry>Called just after processing each client request.</entry> 128*4882a593Smuzhiyun <entry><parameter>requestName</parameter></entry> 129*4882a593Smuzhiyun <entry><parameter>requestCode</parameter></entry> 130*4882a593Smuzhiyun <entry><parameter>sequenceNumber</parameter></entry> 131*4882a593Smuzhiyun <entry><parameter>clientId</parameter></entry> 132*4882a593Smuzhiyun <entry><parameter>resultCode</parameter></entry> 133*4882a593Smuzhiyun <entry nameend="arg5" class="unused"/> 134*4882a593Smuzhiyun <entry nameend="arg6" class="unused"/> 135*4882a593Smuzhiyun </row> 136*4882a593Smuzhiyun <row> 137*4882a593Smuzhiyun <entry spanname="all" class="grouphead">Event Probes</entry> 138*4882a593Smuzhiyun </row> 139*4882a593Smuzhiyun <row> 140*4882a593Smuzhiyun <entry>send-event</entry> 141*4882a593Smuzhiyun <entry>Called just before send each event to a client.</entry> 142*4882a593Smuzhiyun <entry><parameter>clientId</parameter></entry> 143*4882a593Smuzhiyun <entry><parameter>eventCode</parameter></entry> 144*4882a593Smuzhiyun <entry><parameter>eventBuffer</parameter></entry> 145*4882a593Smuzhiyun <entry nameend="arg3" class="unused"/> 146*4882a593Smuzhiyun <entry nameend="arg4" class="unused"/> 147*4882a593Smuzhiyun <entry nameend="arg5" class="unused"/> 148*4882a593Smuzhiyun <entry nameend="arg6" class="unused"/> 149*4882a593Smuzhiyun </row> 150*4882a593Smuzhiyun <row> 151*4882a593Smuzhiyun <entry spanname="all" class="grouphead">Client Connection Probes</entry> 152*4882a593Smuzhiyun </row> 153*4882a593Smuzhiyun <row> 154*4882a593Smuzhiyun <entry>client-connect</entry> 155*4882a593Smuzhiyun <entry>Called when a new connection is opened from a client</entry> 156*4882a593Smuzhiyun <entry><parameter>clientId</parameter></entry> 157*4882a593Smuzhiyun <entry><parameter>clientFD</parameter></entry> 158*4882a593Smuzhiyun <entry nameend="arg2" class="unused"/> 159*4882a593Smuzhiyun <entry nameend="arg3" class="unused"/> 160*4882a593Smuzhiyun <entry nameend="arg4" class="unused"/> 161*4882a593Smuzhiyun <entry nameend="arg5" class="unused"/> 162*4882a593Smuzhiyun <entry nameend="arg6" class="unused"/> 163*4882a593Smuzhiyun </row> 164*4882a593Smuzhiyun <row> 165*4882a593Smuzhiyun <entry>client-auth</entry> 166*4882a593Smuzhiyun <entry>Called when client authenticates (normally just after connection opened)</entry> 167*4882a593Smuzhiyun <entry><parameter>clientId</parameter></entry> 168*4882a593Smuzhiyun <entry><parameter>clientAddr</parameter></entry> 169*4882a593Smuzhiyun <entry><parameter>clientPid</parameter></entry> 170*4882a593Smuzhiyun <entry><parameter>clientZoneId</parameter></entry> 171*4882a593Smuzhiyun <entry nameend="arg4" class="unused"/> 172*4882a593Smuzhiyun <entry nameend="arg5" class="unused"/> 173*4882a593Smuzhiyun <entry nameend="arg6" class="unused"/> 174*4882a593Smuzhiyun </row> 175*4882a593Smuzhiyun <row> 176*4882a593Smuzhiyun <entry>client-disconnect</entry> 177*4882a593Smuzhiyun <entry>Called when a client connection is closed</entry> 178*4882a593Smuzhiyun <entry><parameter>clientId</parameter></entry> 179*4882a593Smuzhiyun <entry nameend="arg1" class="unused"/> 180*4882a593Smuzhiyun <entry nameend="arg2" class="unused"/> 181*4882a593Smuzhiyun <entry nameend="arg3" class="unused"/> 182*4882a593Smuzhiyun <entry nameend="arg4" class="unused"/> 183*4882a593Smuzhiyun <entry nameend="arg5" class="unused"/> 184*4882a593Smuzhiyun <entry nameend="arg6" class="unused"/> 185*4882a593Smuzhiyun </row> 186*4882a593Smuzhiyun <row> 187*4882a593Smuzhiyun <entry spanname="all" class="grouphead">Resource Allocation Probes</entry> 188*4882a593Smuzhiyun </row> 189*4882a593Smuzhiyun <row> 190*4882a593Smuzhiyun <entry>resource-alloc</entry> 191*4882a593Smuzhiyun <entry>Called when a new resource (pixmap, gc, colormap, etc.) is allocated</entry> 192*4882a593Smuzhiyun <entry><parameter>resourceId</parameter></entry> 193*4882a593Smuzhiyun <entry><parameter>resourceTypeId</parameter></entry> 194*4882a593Smuzhiyun <entry><parameter>resourceValue</parameter></entry> 195*4882a593Smuzhiyun <entry><parameter>resourceTypeName</parameter></entry> 196*4882a593Smuzhiyun <entry nameend="arg4" class="unused"/> 197*4882a593Smuzhiyun <entry nameend="arg5" class="unused"/> 198*4882a593Smuzhiyun <entry nameend="arg6" class="unused"/> 199*4882a593Smuzhiyun </row> 200*4882a593Smuzhiyun <row> 201*4882a593Smuzhiyun <entry>resource-free</entry> 202*4882a593Smuzhiyun <entry>Called when a resource is freed</entry> 203*4882a593Smuzhiyun <entry><parameter>resourceId</parameter></entry> 204*4882a593Smuzhiyun <entry><parameter>resourceTypeId</parameter></entry> 205*4882a593Smuzhiyun <entry><parameter>resourceValue</parameter></entry> 206*4882a593Smuzhiyun <entry><parameter>resourceTypeName</parameter></entry> 207*4882a593Smuzhiyun <entry nameend="arg4" class="unused"/> 208*4882a593Smuzhiyun <entry nameend="arg5" class="unused"/> 209*4882a593Smuzhiyun <entry nameend="arg6" class="unused"/> 210*4882a593Smuzhiyun </row> 211*4882a593Smuzhiyun <row> 212*4882a593Smuzhiyun <entry spanname="all" class="grouphead">Input API probes</entry> 213*4882a593Smuzhiyun </row> 214*4882a593Smuzhiyun <row> 215*4882a593Smuzhiyun <entry>input-event</entry> 216*4882a593Smuzhiyun <entry>Called when an input event was submitted for processing</entry> 217*4882a593Smuzhiyun <entry><parameter>deviceid</parameter></entry> 218*4882a593Smuzhiyun <entry><parameter>eventtype</parameter></entry> 219*4882a593Smuzhiyun <entry><parameter>button</parameter> or 220*4882a593Smuzhiyun <parameter>keycode</parameter> or 221*4882a593Smuzhiyun <parameter>touchid</parameter></entry> 222*4882a593Smuzhiyun <entry><parameter>flags</parameter></entry> 223*4882a593Smuzhiyun <entry><parameter>nvalues</parameter></entry> 224*4882a593Smuzhiyun <entry><parameter>mask</parameter></entry> 225*4882a593Smuzhiyun <entry><parameter>values</parameter></entry> 226*4882a593Smuzhiyun </row> 227*4882a593Smuzhiyun </tbody> 228*4882a593Smuzhiyun </tgroup> 229*4882a593Smuzhiyun </table> 230*4882a593Smuzhiyun </para> 231*4882a593Smuzhiyun </sect1> 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun <sect1 id="arguments"> 234*4882a593Smuzhiyun <title>Data Available in Probe Arguments</title> 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun <para> 237*4882a593Smuzhiyun To access data in arguments of type <type>string</type>, you will need 238*4882a593Smuzhiyun to use <ulink url="http://dtrace.org/guide/chp-actsub.html#chp-actsub-copyinstr"><function>copyinstr()</function></ulink>. 239*4882a593Smuzhiyun To access data buffers referenced via <type>uintptr_t</type>'s, you will 240*4882a593Smuzhiyun need to use <ulink url="http://dtrace.org/guide/chp-actsub.html#chp-actsub-copyin"><function>copyin()</function></ulink>. 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun <table id="Probe_Arguments"> 243*4882a593Smuzhiyun <title>Probe Arguments</title> 244*4882a593Smuzhiyun <tgroup cols='3'> 245*4882a593Smuzhiyun <colspec colname="arg" colwidth="2*"/> 246*4882a593Smuzhiyun <colspec colname="type" colwidth="1*"/> 247*4882a593Smuzhiyun <colspec colname="desc" colwidth="7*"/> 248*4882a593Smuzhiyun <thead> 249*4882a593Smuzhiyun <row> 250*4882a593Smuzhiyun <entry>Argument name</entry> 251*4882a593Smuzhiyun <entry>Type</entry> 252*4882a593Smuzhiyun <entry>Description</entry> 253*4882a593Smuzhiyun </row> 254*4882a593Smuzhiyun </thead> 255*4882a593Smuzhiyun <tbody> 256*4882a593Smuzhiyun <row> 257*4882a593Smuzhiyun <entry><parameter>clientAddr</parameter></entry> 258*4882a593Smuzhiyun <entry><type>string</type></entry> 259*4882a593Smuzhiyun <entry>String representing address client connected from</entry> 260*4882a593Smuzhiyun </row> 261*4882a593Smuzhiyun <row> 262*4882a593Smuzhiyun <entry><parameter>clientFD</parameter></entry> 263*4882a593Smuzhiyun <entry><type>int</type></entry> 264*4882a593Smuzhiyun <entry>X server's file descriptor for server side of each connection</entry> 265*4882a593Smuzhiyun </row> 266*4882a593Smuzhiyun <row> 267*4882a593Smuzhiyun <entry><parameter>clientId</parameter></entry> 268*4882a593Smuzhiyun <entry><type>int</type></entry> 269*4882a593Smuzhiyun <entry>Unique integer identifier for each connection to the 270*4882a593Smuzhiyun X server</entry> 271*4882a593Smuzhiyun </row> 272*4882a593Smuzhiyun <row> 273*4882a593Smuzhiyun <entry><parameter>clientPid</parameter></entry> 274*4882a593Smuzhiyun <entry><type>pid_t</type></entry> 275*4882a593Smuzhiyun <entry>Process id of client, if connection is local 276*4882a593Smuzhiyun (from <function>getpeerucred()</function>)</entry> 277*4882a593Smuzhiyun </row> 278*4882a593Smuzhiyun <row> 279*4882a593Smuzhiyun <entry><parameter>clientZoneId</parameter></entry> 280*4882a593Smuzhiyun <entry><type>zoneid_t</type></entry> 281*4882a593Smuzhiyun <entry>Solaris: Zone id of client, if connection is local 282*4882a593Smuzhiyun (from <function>getpeerucred()</function>)</entry> 283*4882a593Smuzhiyun </row> 284*4882a593Smuzhiyun <row> 285*4882a593Smuzhiyun <entry><parameter>eventBuffer</parameter></entry> 286*4882a593Smuzhiyun <entry><type>uintptr_t</type></entry> 287*4882a593Smuzhiyun <entry>Pointer to buffer containing X event - decode using 288*4882a593Smuzhiyun structures in 289*4882a593Smuzhiyun <<ulink url="https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/blob/master/include/X11/Xproto.h"><filename class="headerfile">X11/Xproto.h</filename></ulink>> 290*4882a593Smuzhiyun and similar headers for each extension</entry> 291*4882a593Smuzhiyun </row> 292*4882a593Smuzhiyun <row> 293*4882a593Smuzhiyun <entry><parameter>eventCode</parameter></entry> 294*4882a593Smuzhiyun <entry><type>uint8_t</type></entry> 295*4882a593Smuzhiyun <entry>Event number of X event</entry> 296*4882a593Smuzhiyun </row> 297*4882a593Smuzhiyun <row> 298*4882a593Smuzhiyun <entry><parameter>resourceId</parameter></entry> 299*4882a593Smuzhiyun <entry><type>uint32_t</type></entry> 300*4882a593Smuzhiyun <entry>X resource id (XID)</entry> 301*4882a593Smuzhiyun </row> 302*4882a593Smuzhiyun <row> 303*4882a593Smuzhiyun <entry><parameter>resourceTypeId</parameter></entry> 304*4882a593Smuzhiyun <entry><type>uint32_t</type></entry> 305*4882a593Smuzhiyun <entry>Resource type id</entry> 306*4882a593Smuzhiyun </row> 307*4882a593Smuzhiyun <row> 308*4882a593Smuzhiyun <entry><parameter>resourceTypeName</parameter></entry> 309*4882a593Smuzhiyun <entry><type>string</type></entry> 310*4882a593Smuzhiyun <entry>String representing X resource type 311*4882a593Smuzhiyun (<literal>"PIXMAP"</literal>, etc.)</entry> 312*4882a593Smuzhiyun </row> 313*4882a593Smuzhiyun <row> 314*4882a593Smuzhiyun <entry><parameter>resourceValue</parameter></entry> 315*4882a593Smuzhiyun <entry><type>uintptr_t</type></entry> 316*4882a593Smuzhiyun <entry>Pointer to data for X resource</entry> 317*4882a593Smuzhiyun </row> 318*4882a593Smuzhiyun <row> 319*4882a593Smuzhiyun <entry><parameter>resultCode</parameter></entry> 320*4882a593Smuzhiyun <entry><type>int</type></entry> 321*4882a593Smuzhiyun <entry>Integer code representing result status of request</entry> 322*4882a593Smuzhiyun </row> 323*4882a593Smuzhiyun <row> 324*4882a593Smuzhiyun <entry><parameter>requestBuffer</parameter></entry> 325*4882a593Smuzhiyun <entry><type>uintptr_t</type></entry> 326*4882a593Smuzhiyun <entry>Pointer to buffer containing X request - decode using 327*4882a593Smuzhiyun structures in 328*4882a593Smuzhiyun <<ulink url="https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/blob/master/include/X11/Xproto.h"><filename class="headerfile">X11/Xproto.h</filename></ulink>> 329*4882a593Smuzhiyun and similar headers for each extension</entry> 330*4882a593Smuzhiyun </row> 331*4882a593Smuzhiyun <row> 332*4882a593Smuzhiyun <entry><parameter>requestCode</parameter></entry> 333*4882a593Smuzhiyun <entry><type>uint8_t</type></entry> 334*4882a593Smuzhiyun <entry>Request number of X request or Extension</entry> 335*4882a593Smuzhiyun </row> 336*4882a593Smuzhiyun <row> 337*4882a593Smuzhiyun <entry><parameter>requestName</parameter></entry> 338*4882a593Smuzhiyun <entry><type>string</type></entry> 339*4882a593Smuzhiyun <entry>Name of X request or Extension</entry> 340*4882a593Smuzhiyun </row> 341*4882a593Smuzhiyun <row> 342*4882a593Smuzhiyun <entry><parameter>requestLength</parameter></entry> 343*4882a593Smuzhiyun <entry><type>uint16_t</type></entry> 344*4882a593Smuzhiyun <entry>Length of X request</entry> 345*4882a593Smuzhiyun </row> 346*4882a593Smuzhiyun <row> 347*4882a593Smuzhiyun <entry><parameter>sequenceNumber</parameter></entry> 348*4882a593Smuzhiyun <entry><type>uint32_t</type></entry> 349*4882a593Smuzhiyun <entry>Number of X request in in this connection</entry> 350*4882a593Smuzhiyun </row> 351*4882a593Smuzhiyun <row> 352*4882a593Smuzhiyun <entry><parameter>deviceid</parameter></entry> 353*4882a593Smuzhiyun <entry><type>int</type></entry> 354*4882a593Smuzhiyun <entry>The device's numerical ID</entry> 355*4882a593Smuzhiyun </row> 356*4882a593Smuzhiyun <row> 357*4882a593Smuzhiyun <entry><parameter>eventtype</parameter></entry> 358*4882a593Smuzhiyun <entry><type>int</type></entry> 359*4882a593Smuzhiyun <entry>Protocol event type</entry> 360*4882a593Smuzhiyun </row> 361*4882a593Smuzhiyun <row> 362*4882a593Smuzhiyun <entry><parameter>button, keycode, touchid</parameter></entry> 363*4882a593Smuzhiyun <entry><type>uint32_t</type></entry> 364*4882a593Smuzhiyun <entry>The button number, keycode or touch ID</entry> 365*4882a593Smuzhiyun </row> 366*4882a593Smuzhiyun <row> 367*4882a593Smuzhiyun <entry><parameter>flags</parameter></entry> 368*4882a593Smuzhiyun <entry><type>uint32_t</type></entry> 369*4882a593Smuzhiyun <entry>Miscellaneous event-specific server flags</entry> 370*4882a593Smuzhiyun </row> 371*4882a593Smuzhiyun <row> 372*4882a593Smuzhiyun <entry><parameter>nvalues</parameter></entry> 373*4882a593Smuzhiyun <entry><type>int8_t</type></entry> 374*4882a593Smuzhiyun <entry>Number of bits in <parameter>mask</parameter> and number of elements 375*4882a593Smuzhiyun in <parameter>values</parameter></entry> 376*4882a593Smuzhiyun </row> 377*4882a593Smuzhiyun <row> 378*4882a593Smuzhiyun <entry><parameter>mask</parameter></entry> 379*4882a593Smuzhiyun <entry><type>uint8_t*</type></entry> 380*4882a593Smuzhiyun <entry>Binary mask indicating which indices in <parameter>values</parameter> contain 381*4882a593Smuzhiyun valid data</entry> 382*4882a593Smuzhiyun </row> 383*4882a593Smuzhiyun <row> 384*4882a593Smuzhiyun <entry><parameter>values</parameter></entry> 385*4882a593Smuzhiyun <entry><type>double*</type></entry> 386*4882a593Smuzhiyun <entry>Valuator values. Values for indices for which the 387*4882a593Smuzhiyun <parameter>mask</parameter> is not set are undefined</entry> 388*4882a593Smuzhiyun </row> 389*4882a593Smuzhiyun </tbody> 390*4882a593Smuzhiyun </tgroup> 391*4882a593Smuzhiyun </table> 392*4882a593Smuzhiyun </para> 393*4882a593Smuzhiyun </sect1> 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun <sect1 id="examples"> 396*4882a593Smuzhiyun <title>Examples</title> 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun <example id="Counting_requests_by_request_name"> 399*4882a593Smuzhiyun <title>Counting requests by request name</title> 400*4882a593Smuzhiyun 401*4882a593Smuzhiyun <para> 402*4882a593Smuzhiyun This script simply increments a counter for each different request 403*4882a593Smuzhiyun made, and when you exit the script (such as by hitting 404*4882a593Smuzhiyun <keycombo action='simul'><keycap>Control</keycap><keycap>C</keycap> 405*4882a593Smuzhiyun </keycombo>) prints the counts. 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun <programlisting> 408*4882a593Smuzhiyun#!/usr/sbin/dtrace -s 409*4882a593Smuzhiyun 410*4882a593SmuzhiyunXserver*:::request-start 411*4882a593Smuzhiyun{ 412*4882a593Smuzhiyun @counts[copyinstr(arg0)] = count(); 413*4882a593Smuzhiyun} 414*4882a593Smuzhiyun </programlisting> 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun The output from a short run may appear as: 417*4882a593Smuzhiyun <screen> 418*4882a593Smuzhiyun QueryPointer 1 419*4882a593Smuzhiyun CreatePixmap 2 420*4882a593Smuzhiyun FreePixmap 2 421*4882a593Smuzhiyun PutImage 2 422*4882a593Smuzhiyun ChangeGC 10 423*4882a593Smuzhiyun CopyArea 10 424*4882a593Smuzhiyun CreateGC 14 425*4882a593Smuzhiyun FreeGC 14 426*4882a593Smuzhiyun RENDER 28 427*4882a593Smuzhiyun SetClipRectangles 40 428*4882a593Smuzhiyun </screen> 429*4882a593Smuzhiyun </para> 430*4882a593Smuzhiyun 431*4882a593Smuzhiyun <para> 432*4882a593Smuzhiyun This can be rewritten slightly to cache the string containing the name 433*4882a593Smuzhiyun of the request since it will be reused many times, instead of copying 434*4882a593Smuzhiyun it over and over from the kernel: 435*4882a593Smuzhiyun 436*4882a593Smuzhiyun <programlisting> 437*4882a593Smuzhiyun#!/usr/sbin/dtrace -s 438*4882a593Smuzhiyun 439*4882a593Smuzhiyunstring Xrequest[uintptr_t]; 440*4882a593Smuzhiyun 441*4882a593SmuzhiyunXserver*:::request-start 442*4882a593Smuzhiyun/Xrequest[arg0] == ""/ 443*4882a593Smuzhiyun{ 444*4882a593Smuzhiyun Xrequest[arg0] = copyinstr(arg0); 445*4882a593Smuzhiyun} 446*4882a593Smuzhiyun 447*4882a593SmuzhiyunXserver*:::request-start 448*4882a593Smuzhiyun{ 449*4882a593Smuzhiyun @counts[Xrequest[arg0]] = count(); 450*4882a593Smuzhiyun} 451*4882a593Smuzhiyun </programlisting> 452*4882a593Smuzhiyun </para> 453*4882a593Smuzhiyun </example> 454*4882a593Smuzhiyun 455*4882a593Smuzhiyun <example id="Get_average_CPU_time_per_request"> 456*4882a593Smuzhiyun <title>Get average CPU time per request</title> 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun <para>This script records the CPU time used between the probes at 459*4882a593Smuzhiyun the start and end of each request and aggregates it per request type. 460*4882a593Smuzhiyun 461*4882a593Smuzhiyun <programlisting> 462*4882a593Smuzhiyun#!/usr/sbin/dtrace -s 463*4882a593Smuzhiyun 464*4882a593SmuzhiyunXserver*:::request-start 465*4882a593Smuzhiyun{ 466*4882a593Smuzhiyun reqstart = vtimestamp; 467*4882a593Smuzhiyun} 468*4882a593Smuzhiyun 469*4882a593SmuzhiyunXserver*:::request-done 470*4882a593Smuzhiyun{ 471*4882a593Smuzhiyun @times[copyinstr(arg0)] = avg(vtimestamp - reqstart); 472*4882a593Smuzhiyun} 473*4882a593Smuzhiyun </programlisting> 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun The output from a sample run might look like: 476*4882a593Smuzhiyun 477*4882a593Smuzhiyun <screen> 478*4882a593Smuzhiyun ChangeGC 889 479*4882a593Smuzhiyun MapWindow 907 480*4882a593Smuzhiyun SetClipRectangles 1319 481*4882a593Smuzhiyun PolyPoint 1413 482*4882a593Smuzhiyun PolySegment 1434 483*4882a593Smuzhiyun PolyRectangle 1828 484*4882a593Smuzhiyun FreeCursor 1895 485*4882a593Smuzhiyun FreeGC 1950 486*4882a593Smuzhiyun CreateGC 2244 487*4882a593Smuzhiyun FreePixmap 2246 488*4882a593Smuzhiyun GetInputFocus 2249 489*4882a593Smuzhiyun TranslateCoords 8508 490*4882a593Smuzhiyun QueryTree 8846 491*4882a593Smuzhiyun GetGeometry 9948 492*4882a593Smuzhiyun CreatePixmap 12111 493*4882a593Smuzhiyun AllowEvents 14090 494*4882a593Smuzhiyun GrabServer 14791 495*4882a593Smuzhiyun MIT-SCREEN-SAVER 16747 496*4882a593Smuzhiyun ConfigureWindow 22917 497*4882a593Smuzhiyun SetInputFocus 28521 498*4882a593Smuzhiyun PutImage 240841 499*4882a593Smuzhiyun 500*4882a593Smuzhiyun </screen> 501*4882a593Smuzhiyun </para> 502*4882a593Smuzhiyun </example> 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun <example id="Monitoring_clients_that_connect_and_disconnect"> 505*4882a593Smuzhiyun <title>Monitoring clients that connect and disconnect</title> 506*4882a593Smuzhiyun 507*4882a593Smuzhiyun <para> 508*4882a593Smuzhiyun This script simply prints information about each client that 509*4882a593Smuzhiyun connects or disconnects from the server while it is running. 510*4882a593Smuzhiyun Since the provider is specified as <code>Xserver$1</code> instead 511*4882a593Smuzhiyun of <code>Xserver*</code> like previous examples, it won't monitor 512*4882a593Smuzhiyun all Xserver processes running on the machine, but instead expects 513*4882a593Smuzhiyun the process id of the X server to monitor to be specified as the 514*4882a593Smuzhiyun argument to the script. 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun <programlisting> 517*4882a593Smuzhiyun#!/usr/sbin/dtrace -s 518*4882a593Smuzhiyun 519*4882a593SmuzhiyunXserver$1:::client-connect 520*4882a593Smuzhiyun{ 521*4882a593Smuzhiyun printf("** Client Connect: id %d\n", arg0); 522*4882a593Smuzhiyun} 523*4882a593Smuzhiyun 524*4882a593SmuzhiyunXserver$1:::client-auth 525*4882a593Smuzhiyun{ 526*4882a593Smuzhiyun printf("** Client auth'ed: id %d => %s pid %d\n", 527*4882a593Smuzhiyun arg0, copyinstr(arg1), arg2); 528*4882a593Smuzhiyun} 529*4882a593Smuzhiyun 530*4882a593SmuzhiyunXserver$1:::client-disconnect 531*4882a593Smuzhiyun{ 532*4882a593Smuzhiyun printf("** Client Disconnect: id %d\n", arg0); 533*4882a593Smuzhiyun} 534*4882a593Smuzhiyun </programlisting> 535*4882a593Smuzhiyun 536*4882a593Smuzhiyun A sample run: 537*4882a593Smuzhiyun 538*4882a593Smuzhiyun <screen> 539*4882a593Smuzhiyun<prompt>#</prompt> <userinput>./foo.d 5790</userinput> 540*4882a593Smuzhiyun<computeroutput>dtrace: script './foo.d' matched 4 probes 541*4882a593SmuzhiyunCPU ID FUNCTION:NAME 542*4882a593Smuzhiyun 0 15774 CloseDownClient:client-disconnect ** Client Disconnect: id 65 543*4882a593Smuzhiyun 544*4882a593Smuzhiyun 2 15774 CloseDownClient:client-disconnect ** Client Disconnect: id 64 545*4882a593Smuzhiyun 546*4882a593Smuzhiyun 0 15773 EstablishNewConnections:client-connect ** Client Connect: id 64 547*4882a593Smuzhiyun 548*4882a593Smuzhiyun 0 15772 AuthAudit:client-auth ** Client auth'ed: id 64 => local host pid 2034 549*4882a593Smuzhiyun 550*4882a593Smuzhiyun 0 15773 EstablishNewConnections:client-connect ** Client Connect: id 65 551*4882a593Smuzhiyun 552*4882a593Smuzhiyun 0 15772 AuthAudit:client-auth ** Client auth'ed: id 65 => local host pid 2034 553*4882a593Smuzhiyun 554*4882a593Smuzhiyun 0 15774 CloseDownClient:client-disconnect ** Client Disconnect: id 64 555*4882a593Smuzhiyun </computeroutput> 556*4882a593Smuzhiyun </screen> 557*4882a593Smuzhiyun 558*4882a593Smuzhiyun </para> 559*4882a593Smuzhiyun </example> 560*4882a593Smuzhiyun 561*4882a593Smuzhiyun <example id="Monitoring_clients_creating_Pixmaps"> 562*4882a593Smuzhiyun <title>Monitoring clients creating Pixmaps</title> 563*4882a593Smuzhiyun 564*4882a593Smuzhiyun <para> 565*4882a593Smuzhiyun This script can be used to determine which clients are creating 566*4882a593Smuzhiyun pixmaps in the X server, printing information about each client 567*4882a593Smuzhiyun as it connects to help trace it back to the program on the other 568*4882a593Smuzhiyun end of the X connection. 569*4882a593Smuzhiyun 570*4882a593Smuzhiyun <programlisting> 571*4882a593Smuzhiyun#!/usr/sbin/dtrace -qs 572*4882a593Smuzhiyun 573*4882a593Smuzhiyunstring Xrequest[uintptr_t]; 574*4882a593Smuzhiyunstring Xrestype[uintptr_t]; 575*4882a593Smuzhiyun 576*4882a593SmuzhiyunXserver$1:::request-start 577*4882a593Smuzhiyun/Xrequest[arg0] == ""/ 578*4882a593Smuzhiyun{ 579*4882a593Smuzhiyun Xrequest[arg0] = copyinstr(arg0); 580*4882a593Smuzhiyun} 581*4882a593Smuzhiyun 582*4882a593SmuzhiyunXserver$1:::resource-alloc 583*4882a593Smuzhiyun/arg3 != 0 && Xrestype[arg3] == ""/ 584*4882a593Smuzhiyun{ 585*4882a593Smuzhiyun Xrestype[arg3] = copyinstr(arg3); 586*4882a593Smuzhiyun} 587*4882a593Smuzhiyun 588*4882a593Smuzhiyun 589*4882a593SmuzhiyunXserver$1:::request-start 590*4882a593Smuzhiyun/Xrequest[arg0] == "X_CreatePixmap"/ 591*4882a593Smuzhiyun{ 592*4882a593Smuzhiyun printf("-> %s: client %d\n", Xrequest[arg0], arg3); 593*4882a593Smuzhiyun} 594*4882a593Smuzhiyun 595*4882a593SmuzhiyunXserver$1:::request-done 596*4882a593Smuzhiyun/Xrequest[arg0] == "X_CreatePixmap"/ 597*4882a593Smuzhiyun{ 598*4882a593Smuzhiyun printf("<- %s: client %d\n", Xrequest[arg0], arg3); 599*4882a593Smuzhiyun} 600*4882a593Smuzhiyun 601*4882a593SmuzhiyunXserver$1:::resource-alloc 602*4882a593Smuzhiyun/Xrestype[arg3] == "PIXMAP"/ 603*4882a593Smuzhiyun{ 604*4882a593Smuzhiyun printf("** Pixmap alloc: %08x\n", arg0); 605*4882a593Smuzhiyun} 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun 608*4882a593SmuzhiyunXserver$1:::resource-free 609*4882a593Smuzhiyun/Xrestype[arg3] == "PIXMAP"/ 610*4882a593Smuzhiyun{ 611*4882a593Smuzhiyun printf("** Pixmap free: %08x\n", arg0); 612*4882a593Smuzhiyun} 613*4882a593Smuzhiyun 614*4882a593SmuzhiyunXserver$1:::client-connect 615*4882a593Smuzhiyun{ 616*4882a593Smuzhiyun printf("** Client Connect: id %d\n", arg0); 617*4882a593Smuzhiyun} 618*4882a593Smuzhiyun 619*4882a593SmuzhiyunXserver$1:::client-auth 620*4882a593Smuzhiyun{ 621*4882a593Smuzhiyun printf("** Client auth'ed: id %d => %s pid %d\n", 622*4882a593Smuzhiyun arg0, copyinstr(arg1), arg2); 623*4882a593Smuzhiyun} 624*4882a593Smuzhiyun 625*4882a593SmuzhiyunXserver$1:::client-disconnect 626*4882a593Smuzhiyun{ 627*4882a593Smuzhiyun printf("** Client Disconnect: id %d\n", arg0); 628*4882a593Smuzhiyun} 629*4882a593Smuzhiyun </programlisting> 630*4882a593Smuzhiyun 631*4882a593Smuzhiyun Sample output from a run of this script: 632*4882a593Smuzhiyun <screen><computeroutput> 633*4882a593Smuzhiyun** Client Connect: id 17 634*4882a593Smuzhiyun** Client auth'ed: id 17 => local host pid 20273 635*4882a593Smuzhiyun-> X_CreatePixmap: client 17 636*4882a593Smuzhiyun** Pixmap alloc: 02200009 637*4882a593Smuzhiyun<- X_CreatePixmap: client 17 638*4882a593Smuzhiyun-> X_CreatePixmap: client 15 639*4882a593Smuzhiyun** Pixmap alloc: 01e00180 640*4882a593Smuzhiyun<- X_CreatePixmap: client 15 641*4882a593Smuzhiyun-> X_CreatePixmap: client 15 642*4882a593Smuzhiyun** Pixmap alloc: 01e00181 643*4882a593Smuzhiyun<- X_CreatePixmap: client 15 644*4882a593Smuzhiyun-> X_CreatePixmap: client 14 645*4882a593Smuzhiyun** Pixmap alloc: 01c004c8 646*4882a593Smuzhiyun<- X_CreatePixmap: client 14 647*4882a593Smuzhiyun** Pixmap free: 02200009 648*4882a593Smuzhiyun** Client Disconnect: id 17 649*4882a593Smuzhiyun** Pixmap free: 01e00180 650*4882a593Smuzhiyun** Pixmap free: 01e00181 651*4882a593Smuzhiyun </computeroutput></screen> 652*4882a593Smuzhiyun 653*4882a593Smuzhiyun </para> 654*4882a593Smuzhiyun 655*4882a593Smuzhiyun </example> 656*4882a593Smuzhiyun 657*4882a593Smuzhiyun <example id="Input_API_monitoring_with_systemtap"> 658*4882a593Smuzhiyun <title>Input API monitoring with SystemTap</title> 659*4882a593Smuzhiyun 660*4882a593Smuzhiyun <para> 661*4882a593Smuzhiyun This script can be used to monitor events submitted by drivers to 662*4882a593Smuzhiyun the server for enqueuing. Due to the integration of the input API 663*4882a593Smuzhiyun probes, some server-enqueued events will show up too. 664*4882a593Smuzhiyun <programlisting> 665*4882a593Smuzhiyun # Compile+run with 666*4882a593Smuzhiyun # stap -g xorg.stp /usr/bin/Xorg 667*4882a593Smuzhiyun # 668*4882a593Smuzhiyun 669*4882a593Smuzhiyun 670*4882a593Smuzhiyun function print_valuators:string(nvaluators:long, mask_in:long, valuators_in:long) %{ 671*4882a593Smuzhiyun int i; 672*4882a593Smuzhiyun unsigned char *mask = (unsigned char*)THIS->mask_in; 673*4882a593Smuzhiyun double *valuators = (double*)THIS->valuators_in; 674*4882a593Smuzhiyun char str[128] = {0}; 675*4882a593Smuzhiyun char *s = str; 676*4882a593Smuzhiyun 677*4882a593Smuzhiyun #define BitIsSet(ptr, bit) (((unsigned char*)(ptr))[(bit)>>3] & (1 << ((bit) & 7))) 678*4882a593Smuzhiyun 679*4882a593Smuzhiyun s += sprintf(s, "nval: %d ::", (int)THIS->nvaluators); 680*4882a593Smuzhiyun for (i = 0; i < THIS->nvaluators; i++) 681*4882a593Smuzhiyun { 682*4882a593Smuzhiyun s += sprintf(s, " %d: ", i); 683*4882a593Smuzhiyun if (BitIsSet(mask, i)) 684*4882a593Smuzhiyun s += sprintf(s, "%d", (int)valuators[i]); 685*4882a593Smuzhiyun } 686*4882a593Smuzhiyun 687*4882a593Smuzhiyun sprintf(THIS->__retvalue, "%s", str); 688*4882a593Smuzhiyun %} 689*4882a593Smuzhiyun 690*4882a593Smuzhiyun probe process(@1).mark("input__event") 691*4882a593Smuzhiyun { 692*4882a593Smuzhiyun deviceid = $arg1 693*4882a593Smuzhiyun type = $arg2 694*4882a593Smuzhiyun detail = $arg3 695*4882a593Smuzhiyun flags = $arg4 696*4882a593Smuzhiyun nvaluators = $arg5 697*4882a593Smuzhiyun 698*4882a593Smuzhiyun str = print_valuators(nvaluators, $arg6, $arg7) 699*4882a593Smuzhiyun printf("Event: device %d type %d detail %d flags %#x %s\n", 700*4882a593Smuzhiyun deviceid, type, detail, flags, str); 701*4882a593Smuzhiyun } 702*4882a593Smuzhiyun </programlisting> 703*4882a593Smuzhiyun 704*4882a593Smuzhiyun Sample output from a run of this script: 705*4882a593Smuzhiyun <screen><computeroutput> 706*4882a593SmuzhiyunEvent: device 13 type 4 detail 1 flags 0x0 nval: 0 :: 707*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 1 :: 0: 1 708*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -1 709*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -1 710*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 4 1: -3 711*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 3 1: -3 712*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 3 1: -2 713*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -2 714*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -2 715*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -2 716*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 1: -1 717*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 1: -1 718*4882a593SmuzhiyunEvent: device 13 type 5 detail 1 flags 0x0 nval: 0 :: 719*4882a593Smuzhiyun </computeroutput></screen> 720*4882a593Smuzhiyun 721*4882a593Smuzhiyun </para> 722*4882a593Smuzhiyun 723*4882a593Smuzhiyun </example> 724*4882a593Smuzhiyun 725*4882a593Smuzhiyun </sect1> 726*4882a593Smuzhiyun 727*4882a593Smuzhiyun</article> 728