135c4bbdfSmrg<?xml version="1.0" encoding="ISO-8859-1"?> 235c4bbdfSmrg<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" 335c4bbdfSmrg "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [ 435c4bbdfSmrg <!ENTITY % defs SYSTEM "/xserver/doc/xml/xserver.ent"> %defs; 535c4bbdfSmrg]> 635c4bbdfSmrg 735c4bbdfSmrg<article id="Xserver-DTrace"> 835c4bbdfSmrg <articleinfo> 935c4bbdfSmrg <title>Xserver Provider for DTrace</title> 1035c4bbdfSmrg <author> 1135c4bbdfSmrg <firstname>Alan</firstname><surname>Coopersmith</surname> 1235c4bbdfSmrg <affiliation> 1335c4bbdfSmrg <orgname>Oracle Corporation</orgname> 1435c4bbdfSmrg <orgdiv>Solaris Engineering</orgdiv> 1535c4bbdfSmrg </affiliation> 1635c4bbdfSmrg </author> 1735c4bbdfSmrg <releaseinfo>X Server Version &xserver.version;</releaseinfo> 185a7dfde8Smrg <copyright><year>2005</year><year>2006</year><year>2007</year><year>2010</year><year>2020</year> 195a7dfde8Smrg <holder>Oracle and/or its affiliates.</holder> 2035c4bbdfSmrg </copyright> 2135c4bbdfSmrg <legalnotice id="copyright"> 2235c4bbdfSmrg <para> 2335c4bbdfSmrgPermission is hereby granted, free of charge, to any person obtaining a 2435c4bbdfSmrgcopy of this software and associated documentation files (the "Software"), 2535c4bbdfSmrgto deal in the Software without restriction, including without limitation 2635c4bbdfSmrgthe rights to use, copy, modify, merge, publish, distribute, sublicense, 2735c4bbdfSmrgand/or sell copies of the Software, and to permit persons to whom the 2835c4bbdfSmrgSoftware is furnished to do so, subject to the following conditions: 2935c4bbdfSmrg </para><para> 3035c4bbdfSmrgThe above copyright notice and this permission notice (including the next 3135c4bbdfSmrgparagraph) shall be included in all copies or substantial portions of the 3235c4bbdfSmrgSoftware. 3335c4bbdfSmrg </para><para> 3435c4bbdfSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 3535c4bbdfSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 3635c4bbdfSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 3735c4bbdfSmrgTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 3835c4bbdfSmrgLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 3935c4bbdfSmrgFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 4035c4bbdfSmrgDEALINGS IN THE SOFTWARE. 4135c4bbdfSmrg </para> 4235c4bbdfSmrg </legalnotice> 4335c4bbdfSmrg </articleinfo> 4435c4bbdfSmrg 4535c4bbdfSmrg <sect1 id="introduction"> 4635c4bbdfSmrg <title>Introduction</title> 4735c4bbdfSmrg <para> 4835c4bbdfSmrg This page provides details on a 495a7dfde8Smrg <ulink url="http://dtrace.org/guide/chp-usdt.html">statically defined user application tracing provider</ulink> 5035c4bbdfSmrg for the 515a7dfde8Smrg <ulink url="http://dtrace.org/blogs/about/">DTrace</ulink> 5235c4bbdfSmrg facility in <productname>Solaris</productname> 10, 5335c4bbdfSmrg <productname>MacOS X</productname> 10.5, and later releases. This 5435c4bbdfSmrg provider instruments various points in the X server, to allow 5535c4bbdfSmrg tracing what client applications are up to. DTrace probes may be used 5635c4bbdfSmrg with <ulink url="http://sourceware.org/systemtap/">SystemTap</ulink> 5735c4bbdfSmrg on GNU/Linux systems. 5835c4bbdfSmrg </para> 5935c4bbdfSmrg 6035c4bbdfSmrg <para> 61ed6184dfSmrg The provider was integrated into the X.Org code base 6235c4bbdfSmrg with Solaris 10 & OpenSolaris support for the Xserver 1.4 release, 6335c4bbdfSmrg released in 2007 with X11R7.3. Support for DTrace on MacOS X 6435c4bbdfSmrg was added in Xserver 1.7. 6535c4bbdfSmrg </para> 6635c4bbdfSmrg 6735c4bbdfSmrg <para> 6835c4bbdfSmrg These probes expose the request and reply structure of the X protocol 6935c4bbdfSmrg between clients and the X server, so an understanding of that basic 7035c4bbdfSmrg nature will aid in learning how to use these probes. 7135c4bbdfSmrg </para> 7235c4bbdfSmrg </sect1> 7335c4bbdfSmrg 7435c4bbdfSmrg <sect1 id="probes"> 7535c4bbdfSmrg <title>Available probes</title> 7635c4bbdfSmrg 7735c4bbdfSmrg <para> 7835c4bbdfSmrg Due to the way User-Defined DTrace probes work, arguments to 7935c4bbdfSmrg these probes all bear undistinguished names of 8035c4bbdfSmrg <parameter>arg0</parameter>, <parameter>arg1</parameter>, 8135c4bbdfSmrg <parameter>arg2</parameter>, etc. These tables should help you 8235c4bbdfSmrg determine what the real data is for each of the probe arguments. 8335c4bbdfSmrg 8435c4bbdfSmrg <table id="Probes_and_their_arguments"> 8535c4bbdfSmrg <title>Probes and their arguments</title> 8635c4bbdfSmrg <tgroup cols='9'> 8735c4bbdfSmrg <colspec colname="probe" colwidth="2*"/> 8835c4bbdfSmrg <colspec colname="desc" colwidth="3*"/> 8935c4bbdfSmrg <colspec colname="arg0" colwidth="1*"/> 9035c4bbdfSmrg <colspec colname="arg1" colwidth="1*"/> 9135c4bbdfSmrg <colspec colname="arg2" colwidth="1*"/> 9235c4bbdfSmrg <colspec colname="arg3" colwidth="1*"/> 9335c4bbdfSmrg <colspec colname="arg4" colwidth="1*"/> 9435c4bbdfSmrg <colspec colname="arg5" colwidth="1*"/> 9535c4bbdfSmrg <colspec colname="arg6" colwidth="1*"/> 9635c4bbdfSmrg <spanspec spanname="all" namest="probe" nameend="arg4"/> 9735c4bbdfSmrg <thead> 9835c4bbdfSmrg <row> 9935c4bbdfSmrg <entry>Probe name</entry> 10035c4bbdfSmrg <entry>Description</entry> 10135c4bbdfSmrg <entry>arg0</entry> 10235c4bbdfSmrg <entry>arg1</entry> 10335c4bbdfSmrg <entry>arg2</entry> 10435c4bbdfSmrg <entry>arg3</entry> 10535c4bbdfSmrg <entry>arg4</entry> 10635c4bbdfSmrg <entry>arg5</entry> 10735c4bbdfSmrg <entry>arg6</entry> 10835c4bbdfSmrg </row> 10935c4bbdfSmrg </thead> 11035c4bbdfSmrg <tbody> 11135c4bbdfSmrg <row> 11235c4bbdfSmrg <entry spanname="all" class="grouphead">Request Probes</entry> 11335c4bbdfSmrg </row> 11435c4bbdfSmrg <row> 11535c4bbdfSmrg <entry>request-start</entry> 11635c4bbdfSmrg <entry>Called just before processing each client request.</entry> 11735c4bbdfSmrg <entry><parameter>requestName</parameter></entry> 11835c4bbdfSmrg <entry><parameter>requestCode</parameter></entry> 11935c4bbdfSmrg <entry><parameter>requestLength</parameter></entry> 12035c4bbdfSmrg <entry><parameter>clientId</parameter></entry> 12135c4bbdfSmrg <entry><parameter>requestBuffer</parameter></entry> 12235c4bbdfSmrg <entry nameend="arg5" class="unused"/> 12335c4bbdfSmrg <entry nameend="arg6" class="unused"/> 12435c4bbdfSmrg </row> 12535c4bbdfSmrg <row> 12635c4bbdfSmrg <entry>request-done</entry> 12735c4bbdfSmrg <entry>Called just after processing each client request.</entry> 12835c4bbdfSmrg <entry><parameter>requestName</parameter></entry> 12935c4bbdfSmrg <entry><parameter>requestCode</parameter></entry> 13035c4bbdfSmrg <entry><parameter>sequenceNumber</parameter></entry> 13135c4bbdfSmrg <entry><parameter>clientId</parameter></entry> 13235c4bbdfSmrg <entry><parameter>resultCode</parameter></entry> 13335c4bbdfSmrg <entry nameend="arg5" class="unused"/> 13435c4bbdfSmrg <entry nameend="arg6" class="unused"/> 13535c4bbdfSmrg </row> 13635c4bbdfSmrg <row> 13735c4bbdfSmrg <entry spanname="all" class="grouphead">Event Probes</entry> 13835c4bbdfSmrg </row> 13935c4bbdfSmrg <row> 14035c4bbdfSmrg <entry>send-event</entry> 14135c4bbdfSmrg <entry>Called just before send each event to a client.</entry> 14235c4bbdfSmrg <entry><parameter>clientId</parameter></entry> 14335c4bbdfSmrg <entry><parameter>eventCode</parameter></entry> 14435c4bbdfSmrg <entry><parameter>eventBuffer</parameter></entry> 14535c4bbdfSmrg <entry nameend="arg3" class="unused"/> 14635c4bbdfSmrg <entry nameend="arg4" class="unused"/> 14735c4bbdfSmrg <entry nameend="arg5" class="unused"/> 14835c4bbdfSmrg <entry nameend="arg6" class="unused"/> 14935c4bbdfSmrg </row> 15035c4bbdfSmrg <row> 15135c4bbdfSmrg <entry spanname="all" class="grouphead">Client Connection Probes</entry> 15235c4bbdfSmrg </row> 15335c4bbdfSmrg <row> 15435c4bbdfSmrg <entry>client-connect</entry> 15535c4bbdfSmrg <entry>Called when a new connection is opened from a client</entry> 15635c4bbdfSmrg <entry><parameter>clientId</parameter></entry> 15735c4bbdfSmrg <entry><parameter>clientFD</parameter></entry> 15835c4bbdfSmrg <entry nameend="arg2" class="unused"/> 15935c4bbdfSmrg <entry nameend="arg3" class="unused"/> 16035c4bbdfSmrg <entry nameend="arg4" class="unused"/> 16135c4bbdfSmrg <entry nameend="arg5" class="unused"/> 16235c4bbdfSmrg <entry nameend="arg6" class="unused"/> 16335c4bbdfSmrg </row> 16435c4bbdfSmrg <row> 16535c4bbdfSmrg <entry>client-auth</entry> 16635c4bbdfSmrg <entry>Called when client authenticates (normally just after connection opened)</entry> 16735c4bbdfSmrg <entry><parameter>clientId</parameter></entry> 16835c4bbdfSmrg <entry><parameter>clientAddr</parameter></entry> 16935c4bbdfSmrg <entry><parameter>clientPid</parameter></entry> 17035c4bbdfSmrg <entry><parameter>clientZoneId</parameter></entry> 17135c4bbdfSmrg <entry nameend="arg4" class="unused"/> 17235c4bbdfSmrg <entry nameend="arg5" class="unused"/> 17335c4bbdfSmrg <entry nameend="arg6" class="unused"/> 17435c4bbdfSmrg </row> 17535c4bbdfSmrg <row> 17635c4bbdfSmrg <entry>client-disconnect</entry> 17735c4bbdfSmrg <entry>Called when a client connection is closed</entry> 17835c4bbdfSmrg <entry><parameter>clientId</parameter></entry> 17935c4bbdfSmrg <entry nameend="arg1" class="unused"/> 18035c4bbdfSmrg <entry nameend="arg2" class="unused"/> 18135c4bbdfSmrg <entry nameend="arg3" class="unused"/> 18235c4bbdfSmrg <entry nameend="arg4" class="unused"/> 18335c4bbdfSmrg <entry nameend="arg5" class="unused"/> 18435c4bbdfSmrg <entry nameend="arg6" class="unused"/> 18535c4bbdfSmrg </row> 18635c4bbdfSmrg <row> 18735c4bbdfSmrg <entry spanname="all" class="grouphead">Resource Allocation Probes</entry> 18835c4bbdfSmrg </row> 18935c4bbdfSmrg <row> 19035c4bbdfSmrg <entry>resource-alloc</entry> 19135c4bbdfSmrg <entry>Called when a new resource (pixmap, gc, colormap, etc.) is allocated</entry> 19235c4bbdfSmrg <entry><parameter>resourceId</parameter></entry> 19335c4bbdfSmrg <entry><parameter>resourceTypeId</parameter></entry> 19435c4bbdfSmrg <entry><parameter>resourceValue</parameter></entry> 19535c4bbdfSmrg <entry><parameter>resourceTypeName</parameter></entry> 19635c4bbdfSmrg <entry nameend="arg4" class="unused"/> 19735c4bbdfSmrg <entry nameend="arg5" class="unused"/> 19835c4bbdfSmrg <entry nameend="arg6" class="unused"/> 19935c4bbdfSmrg </row> 20035c4bbdfSmrg <row> 20135c4bbdfSmrg <entry>resource-free</entry> 20235c4bbdfSmrg <entry>Called when a resource is freed</entry> 20335c4bbdfSmrg <entry><parameter>resourceId</parameter></entry> 20435c4bbdfSmrg <entry><parameter>resourceTypeId</parameter></entry> 20535c4bbdfSmrg <entry><parameter>resourceValue</parameter></entry> 20635c4bbdfSmrg <entry><parameter>resourceTypeName</parameter></entry> 20735c4bbdfSmrg <entry nameend="arg4" class="unused"/> 20835c4bbdfSmrg <entry nameend="arg5" class="unused"/> 20935c4bbdfSmrg <entry nameend="arg6" class="unused"/> 21035c4bbdfSmrg </row> 21135c4bbdfSmrg <row> 21235c4bbdfSmrg <entry spanname="all" class="grouphead">Input API probes</entry> 21335c4bbdfSmrg </row> 21435c4bbdfSmrg <row> 21535c4bbdfSmrg <entry>input-event</entry> 21635c4bbdfSmrg <entry>Called when an input event was submitted for processing</entry> 21735c4bbdfSmrg <entry><parameter>deviceid</parameter></entry> 21835c4bbdfSmrg <entry><parameter>eventtype</parameter></entry> 21935c4bbdfSmrg <entry><parameter>button</parameter> or 22035c4bbdfSmrg <parameter>keycode</parameter> or 22135c4bbdfSmrg <parameter>touchid</parameter></entry> 22235c4bbdfSmrg <entry><parameter>flags</parameter></entry> 22335c4bbdfSmrg <entry><parameter>nvalues</parameter></entry> 22435c4bbdfSmrg <entry><parameter>mask</parameter></entry> 22535c4bbdfSmrg <entry><parameter>values</parameter></entry> 22635c4bbdfSmrg </row> 22735c4bbdfSmrg </tbody> 22835c4bbdfSmrg </tgroup> 22935c4bbdfSmrg </table> 23035c4bbdfSmrg </para> 23135c4bbdfSmrg </sect1> 23235c4bbdfSmrg 23335c4bbdfSmrg <sect1 id="arguments"> 23435c4bbdfSmrg <title>Data Available in Probe Arguments</title> 23535c4bbdfSmrg 23635c4bbdfSmrg <para> 23735c4bbdfSmrg To access data in arguments of type <type>string</type>, you will need 2385a7dfde8Smrg to use <ulink url="http://dtrace.org/guide/chp-actsub.html#chp-actsub-copyinstr"><function>copyinstr()</function></ulink>. 23935c4bbdfSmrg To access data buffers referenced via <type>uintptr_t</type>'s, you will 2405a7dfde8Smrg need to use <ulink url="http://dtrace.org/guide/chp-actsub.html#chp-actsub-copyin"><function>copyin()</function></ulink>. 24135c4bbdfSmrg 24235c4bbdfSmrg <table id="Probe_Arguments"> 24335c4bbdfSmrg <title>Probe Arguments</title> 24435c4bbdfSmrg <tgroup cols='3'> 24535c4bbdfSmrg <colspec colname="arg" colwidth="2*"/> 24635c4bbdfSmrg <colspec colname="type" colwidth="1*"/> 24735c4bbdfSmrg <colspec colname="desc" colwidth="7*"/> 24835c4bbdfSmrg <thead> 24935c4bbdfSmrg <row> 25035c4bbdfSmrg <entry>Argument name</entry> 25135c4bbdfSmrg <entry>Type</entry> 25235c4bbdfSmrg <entry>Description</entry> 25335c4bbdfSmrg </row> 25435c4bbdfSmrg </thead> 25535c4bbdfSmrg <tbody> 25635c4bbdfSmrg <row> 25735c4bbdfSmrg <entry><parameter>clientAddr</parameter></entry> 25835c4bbdfSmrg <entry><type>string</type></entry> 25935c4bbdfSmrg <entry>String representing address client connected from</entry> 26035c4bbdfSmrg </row> 26135c4bbdfSmrg <row> 26235c4bbdfSmrg <entry><parameter>clientFD</parameter></entry> 26335c4bbdfSmrg <entry><type>int</type></entry> 26435c4bbdfSmrg <entry>X server's file descriptor for server side of each connection</entry> 26535c4bbdfSmrg </row> 26635c4bbdfSmrg <row> 26735c4bbdfSmrg <entry><parameter>clientId</parameter></entry> 26835c4bbdfSmrg <entry><type>int</type></entry> 26935c4bbdfSmrg <entry>Unique integer identifier for each connection to the 27035c4bbdfSmrg X server</entry> 27135c4bbdfSmrg </row> 27235c4bbdfSmrg <row> 27335c4bbdfSmrg <entry><parameter>clientPid</parameter></entry> 27435c4bbdfSmrg <entry><type>pid_t</type></entry> 27535c4bbdfSmrg <entry>Process id of client, if connection is local 27635c4bbdfSmrg (from <function>getpeerucred()</function>)</entry> 27735c4bbdfSmrg </row> 27835c4bbdfSmrg <row> 27935c4bbdfSmrg <entry><parameter>clientZoneId</parameter></entry> 28035c4bbdfSmrg <entry><type>zoneid_t</type></entry> 28135c4bbdfSmrg <entry>Solaris: Zone id of client, if connection is local 28235c4bbdfSmrg (from <function>getpeerucred()</function>)</entry> 28335c4bbdfSmrg </row> 28435c4bbdfSmrg <row> 28535c4bbdfSmrg <entry><parameter>eventBuffer</parameter></entry> 28635c4bbdfSmrg <entry><type>uintptr_t</type></entry> 28735c4bbdfSmrg <entry>Pointer to buffer containing X event - decode using 28835c4bbdfSmrg structures in 2895a7dfde8Smrg <<ulink url="https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/blob/master/include/X11/Xproto.h"><filename class="headerfile">X11/Xproto.h</filename></ulink>> 29035c4bbdfSmrg and similar headers for each extension</entry> 29135c4bbdfSmrg </row> 29235c4bbdfSmrg <row> 29335c4bbdfSmrg <entry><parameter>eventCode</parameter></entry> 29435c4bbdfSmrg <entry><type>uint8_t</type></entry> 29535c4bbdfSmrg <entry>Event number of X event</entry> 29635c4bbdfSmrg </row> 29735c4bbdfSmrg <row> 29835c4bbdfSmrg <entry><parameter>resourceId</parameter></entry> 29935c4bbdfSmrg <entry><type>uint32_t</type></entry> 30035c4bbdfSmrg <entry>X resource id (XID)</entry> 30135c4bbdfSmrg </row> 30235c4bbdfSmrg <row> 30335c4bbdfSmrg <entry><parameter>resourceTypeId</parameter></entry> 30435c4bbdfSmrg <entry><type>uint32_t</type></entry> 30535c4bbdfSmrg <entry>Resource type id</entry> 30635c4bbdfSmrg </row> 30735c4bbdfSmrg <row> 30835c4bbdfSmrg <entry><parameter>resourceTypeName</parameter></entry> 30935c4bbdfSmrg <entry><type>string</type></entry> 31035c4bbdfSmrg <entry>String representing X resource type 31135c4bbdfSmrg (<literal>"PIXMAP"</literal>, etc.)</entry> 31235c4bbdfSmrg </row> 31335c4bbdfSmrg <row> 31435c4bbdfSmrg <entry><parameter>resourceValue</parameter></entry> 31535c4bbdfSmrg <entry><type>uintptr_t</type></entry> 31635c4bbdfSmrg <entry>Pointer to data for X resource</entry> 31735c4bbdfSmrg </row> 31835c4bbdfSmrg <row> 31935c4bbdfSmrg <entry><parameter>resultCode</parameter></entry> 32035c4bbdfSmrg <entry><type>int</type></entry> 32135c4bbdfSmrg <entry>Integer code representing result status of request</entry> 32235c4bbdfSmrg </row> 32335c4bbdfSmrg <row> 32435c4bbdfSmrg <entry><parameter>requestBuffer</parameter></entry> 32535c4bbdfSmrg <entry><type>uintptr_t</type></entry> 32635c4bbdfSmrg <entry>Pointer to buffer containing X request - decode using 32735c4bbdfSmrg structures in 3285a7dfde8Smrg <<ulink url="https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/blob/master/include/X11/Xproto.h"><filename class="headerfile">X11/Xproto.h</filename></ulink>> 32935c4bbdfSmrg and similar headers for each extension</entry> 33035c4bbdfSmrg </row> 33135c4bbdfSmrg <row> 33235c4bbdfSmrg <entry><parameter>requestCode</parameter></entry> 33335c4bbdfSmrg <entry><type>uint8_t</type></entry> 33435c4bbdfSmrg <entry>Request number of X request or Extension</entry> 33535c4bbdfSmrg </row> 33635c4bbdfSmrg <row> 33735c4bbdfSmrg <entry><parameter>requestName</parameter></entry> 33835c4bbdfSmrg <entry><type>string</type></entry> 33935c4bbdfSmrg <entry>Name of X request or Extension</entry> 34035c4bbdfSmrg </row> 34135c4bbdfSmrg <row> 34235c4bbdfSmrg <entry><parameter>requestLength</parameter></entry> 34335c4bbdfSmrg <entry><type>uint16_t</type></entry> 34435c4bbdfSmrg <entry>Length of X request</entry> 34535c4bbdfSmrg </row> 34635c4bbdfSmrg <row> 34735c4bbdfSmrg <entry><parameter>sequenceNumber</parameter></entry> 34835c4bbdfSmrg <entry><type>uint32_t</type></entry> 34935c4bbdfSmrg <entry>Number of X request in in this connection</entry> 35035c4bbdfSmrg </row> 35135c4bbdfSmrg <row> 35235c4bbdfSmrg <entry><parameter>deviceid</parameter></entry> 35335c4bbdfSmrg <entry><type>int</type></entry> 35435c4bbdfSmrg <entry>The device's numerical ID</entry> 35535c4bbdfSmrg </row> 35635c4bbdfSmrg <row> 35735c4bbdfSmrg <entry><parameter>eventtype</parameter></entry> 35835c4bbdfSmrg <entry><type>int</type></entry> 35935c4bbdfSmrg <entry>Protocol event type</entry> 36035c4bbdfSmrg </row> 36135c4bbdfSmrg <row> 36235c4bbdfSmrg <entry><parameter>button, keycode, touchid</parameter></entry> 36335c4bbdfSmrg <entry><type>uint32_t</type></entry> 36435c4bbdfSmrg <entry>The button number, keycode or touch ID</entry> 36535c4bbdfSmrg </row> 36635c4bbdfSmrg <row> 36735c4bbdfSmrg <entry><parameter>flags</parameter></entry> 36835c4bbdfSmrg <entry><type>uint32_t</type></entry> 36935c4bbdfSmrg <entry>Miscellaneous event-specific server flags</entry> 37035c4bbdfSmrg </row> 37135c4bbdfSmrg <row> 37235c4bbdfSmrg <entry><parameter>nvalues</parameter></entry> 37335c4bbdfSmrg <entry><type>int8_t</type></entry> 37435c4bbdfSmrg <entry>Number of bits in <parameter>mask</parameter> and number of elements 37535c4bbdfSmrg in <parameter>values</parameter></entry> 37635c4bbdfSmrg </row> 37735c4bbdfSmrg <row> 37835c4bbdfSmrg <entry><parameter>mask</parameter></entry> 37935c4bbdfSmrg <entry><type>uint8_t*</type></entry> 38035c4bbdfSmrg <entry>Binary mask indicating which indices in <parameter>values</parameter> contain 38135c4bbdfSmrg valid data</entry> 38235c4bbdfSmrg </row> 38335c4bbdfSmrg <row> 38435c4bbdfSmrg <entry><parameter>values</parameter></entry> 38535c4bbdfSmrg <entry><type>double*</type></entry> 38635c4bbdfSmrg <entry>Valuator values. Values for indices for which the 38735c4bbdfSmrg <parameter>mask</parameter> is not set are undefined</entry> 38835c4bbdfSmrg </row> 38935c4bbdfSmrg </tbody> 39035c4bbdfSmrg </tgroup> 39135c4bbdfSmrg </table> 39235c4bbdfSmrg </para> 39335c4bbdfSmrg </sect1> 39435c4bbdfSmrg 39535c4bbdfSmrg <sect1 id="examples"> 39635c4bbdfSmrg <title>Examples</title> 39735c4bbdfSmrg 39835c4bbdfSmrg <example id="Counting_requests_by_request_name"> 39935c4bbdfSmrg <title>Counting requests by request name</title> 40035c4bbdfSmrg 40135c4bbdfSmrg <para> 40235c4bbdfSmrg This script simply increments a counter for each different request 40335c4bbdfSmrg made, and when you exit the script (such as by hitting 40435c4bbdfSmrg <keycombo action='simul'><keycap>Control</keycap><keycap>C</keycap> 40535c4bbdfSmrg </keycombo>) prints the counts. 40635c4bbdfSmrg 40735c4bbdfSmrg <programlisting> 40835c4bbdfSmrg#!/usr/sbin/dtrace -s 40935c4bbdfSmrg 41035c4bbdfSmrgXserver*:::request-start 41135c4bbdfSmrg{ 41235c4bbdfSmrg @counts[copyinstr(arg0)] = count(); 41335c4bbdfSmrg} 41435c4bbdfSmrg </programlisting> 41535c4bbdfSmrg 41635c4bbdfSmrg The output from a short run may appear as: 41735c4bbdfSmrg <screen> 41835c4bbdfSmrg QueryPointer 1 41935c4bbdfSmrg CreatePixmap 2 42035c4bbdfSmrg FreePixmap 2 42135c4bbdfSmrg PutImage 2 42235c4bbdfSmrg ChangeGC 10 42335c4bbdfSmrg CopyArea 10 42435c4bbdfSmrg CreateGC 14 42535c4bbdfSmrg FreeGC 14 42635c4bbdfSmrg RENDER 28 42735c4bbdfSmrg SetClipRectangles 40 42835c4bbdfSmrg </screen> 42935c4bbdfSmrg </para> 43035c4bbdfSmrg 43135c4bbdfSmrg <para> 43235c4bbdfSmrg This can be rewritten slightly to cache the string containing the name 43335c4bbdfSmrg of the request since it will be reused many times, instead of copying 43435c4bbdfSmrg it over and over from the kernel: 43535c4bbdfSmrg 43635c4bbdfSmrg <programlisting> 43735c4bbdfSmrg#!/usr/sbin/dtrace -s 43835c4bbdfSmrg 43935c4bbdfSmrgstring Xrequest[uintptr_t]; 44035c4bbdfSmrg 44135c4bbdfSmrgXserver*:::request-start 44235c4bbdfSmrg/Xrequest[arg0] == ""/ 44335c4bbdfSmrg{ 44435c4bbdfSmrg Xrequest[arg0] = copyinstr(arg0); 44535c4bbdfSmrg} 44635c4bbdfSmrg 44735c4bbdfSmrgXserver*:::request-start 44835c4bbdfSmrg{ 44935c4bbdfSmrg @counts[Xrequest[arg0]] = count(); 45035c4bbdfSmrg} 45135c4bbdfSmrg </programlisting> 45235c4bbdfSmrg </para> 45335c4bbdfSmrg </example> 45435c4bbdfSmrg 45535c4bbdfSmrg <example id="Get_average_CPU_time_per_request"> 45635c4bbdfSmrg <title>Get average CPU time per request</title> 45735c4bbdfSmrg 45835c4bbdfSmrg <para>This script records the CPU time used between the probes at 45935c4bbdfSmrg the start and end of each request and aggregates it per request type. 46035c4bbdfSmrg 46135c4bbdfSmrg <programlisting> 46235c4bbdfSmrg#!/usr/sbin/dtrace -s 46335c4bbdfSmrg 46435c4bbdfSmrgXserver*:::request-start 46535c4bbdfSmrg{ 46635c4bbdfSmrg reqstart = vtimestamp; 46735c4bbdfSmrg} 46835c4bbdfSmrg 46935c4bbdfSmrgXserver*:::request-done 47035c4bbdfSmrg{ 47135c4bbdfSmrg @times[copyinstr(arg0)] = avg(vtimestamp - reqstart); 47235c4bbdfSmrg} 47335c4bbdfSmrg </programlisting> 47435c4bbdfSmrg 47535c4bbdfSmrg The output from a sample run might look like: 47635c4bbdfSmrg 47735c4bbdfSmrg <screen> 47835c4bbdfSmrg ChangeGC 889 47935c4bbdfSmrg MapWindow 907 48035c4bbdfSmrg SetClipRectangles 1319 48135c4bbdfSmrg PolyPoint 1413 48235c4bbdfSmrg PolySegment 1434 48335c4bbdfSmrg PolyRectangle 1828 48435c4bbdfSmrg FreeCursor 1895 48535c4bbdfSmrg FreeGC 1950 48635c4bbdfSmrg CreateGC 2244 48735c4bbdfSmrg FreePixmap 2246 48835c4bbdfSmrg GetInputFocus 2249 48935c4bbdfSmrg TranslateCoords 8508 49035c4bbdfSmrg QueryTree 8846 49135c4bbdfSmrg GetGeometry 9948 49235c4bbdfSmrg CreatePixmap 12111 49335c4bbdfSmrg AllowEvents 14090 49435c4bbdfSmrg GrabServer 14791 49535c4bbdfSmrg MIT-SCREEN-SAVER 16747 49635c4bbdfSmrg ConfigureWindow 22917 49735c4bbdfSmrg SetInputFocus 28521 49835c4bbdfSmrg PutImage 240841 49935c4bbdfSmrg 50035c4bbdfSmrg </screen> 50135c4bbdfSmrg </para> 50235c4bbdfSmrg </example> 50335c4bbdfSmrg 50435c4bbdfSmrg <example id="Monitoring_clients_that_connect_and_disconnect"> 50535c4bbdfSmrg <title>Monitoring clients that connect and disconnect</title> 50635c4bbdfSmrg 50735c4bbdfSmrg <para> 50835c4bbdfSmrg This script simply prints information about each client that 50935c4bbdfSmrg connects or disconnects from the server while it is running. 51035c4bbdfSmrg Since the provider is specified as <code>Xserver$1</code> instead 51135c4bbdfSmrg of <code>Xserver*</code> like previous examples, it won't monitor 51235c4bbdfSmrg all Xserver processes running on the machine, but instead expects 51335c4bbdfSmrg the process id of the X server to monitor to be specified as the 51435c4bbdfSmrg argument to the script. 51535c4bbdfSmrg 51635c4bbdfSmrg <programlisting> 51735c4bbdfSmrg#!/usr/sbin/dtrace -s 51835c4bbdfSmrg 51935c4bbdfSmrgXserver$1:::client-connect 52035c4bbdfSmrg{ 52135c4bbdfSmrg printf("** Client Connect: id %d\n", arg0); 52235c4bbdfSmrg} 52335c4bbdfSmrg 52435c4bbdfSmrgXserver$1:::client-auth 52535c4bbdfSmrg{ 52635c4bbdfSmrg printf("** Client auth'ed: id %d => %s pid %d\n", 52735c4bbdfSmrg arg0, copyinstr(arg1), arg2); 52835c4bbdfSmrg} 52935c4bbdfSmrg 53035c4bbdfSmrgXserver$1:::client-disconnect 53135c4bbdfSmrg{ 53235c4bbdfSmrg printf("** Client Disconnect: id %d\n", arg0); 53335c4bbdfSmrg} 53435c4bbdfSmrg </programlisting> 53535c4bbdfSmrg 53635c4bbdfSmrg A sample run: 53735c4bbdfSmrg 53835c4bbdfSmrg <screen> 53935c4bbdfSmrg<prompt>#</prompt> <userinput>./foo.d 5790</userinput> 54035c4bbdfSmrg<computeroutput>dtrace: script './foo.d' matched 4 probes 54135c4bbdfSmrgCPU ID FUNCTION:NAME 54235c4bbdfSmrg 0 15774 CloseDownClient:client-disconnect ** Client Disconnect: id 65 54335c4bbdfSmrg 54435c4bbdfSmrg 2 15774 CloseDownClient:client-disconnect ** Client Disconnect: id 64 54535c4bbdfSmrg 54635c4bbdfSmrg 0 15773 EstablishNewConnections:client-connect ** Client Connect: id 64 54735c4bbdfSmrg 54835c4bbdfSmrg 0 15772 AuthAudit:client-auth ** Client auth'ed: id 64 => local host pid 2034 54935c4bbdfSmrg 55035c4bbdfSmrg 0 15773 EstablishNewConnections:client-connect ** Client Connect: id 65 55135c4bbdfSmrg 55235c4bbdfSmrg 0 15772 AuthAudit:client-auth ** Client auth'ed: id 65 => local host pid 2034 55335c4bbdfSmrg 55435c4bbdfSmrg 0 15774 CloseDownClient:client-disconnect ** Client Disconnect: id 64 55535c4bbdfSmrg </computeroutput> 55635c4bbdfSmrg </screen> 55735c4bbdfSmrg 55835c4bbdfSmrg </para> 55935c4bbdfSmrg </example> 56035c4bbdfSmrg 56135c4bbdfSmrg <example id="Monitoring_clients_creating_Pixmaps"> 56235c4bbdfSmrg <title>Monitoring clients creating Pixmaps</title> 56335c4bbdfSmrg 56435c4bbdfSmrg <para> 56535c4bbdfSmrg This script can be used to determine which clients are creating 56635c4bbdfSmrg pixmaps in the X server, printing information about each client 56735c4bbdfSmrg as it connects to help trace it back to the program on the other 56835c4bbdfSmrg end of the X connection. 56935c4bbdfSmrg 57035c4bbdfSmrg <programlisting> 57135c4bbdfSmrg#!/usr/sbin/dtrace -qs 57235c4bbdfSmrg 57335c4bbdfSmrgstring Xrequest[uintptr_t]; 57435c4bbdfSmrgstring Xrestype[uintptr_t]; 57535c4bbdfSmrg 57635c4bbdfSmrgXserver$1:::request-start 57735c4bbdfSmrg/Xrequest[arg0] == ""/ 57835c4bbdfSmrg{ 57935c4bbdfSmrg Xrequest[arg0] = copyinstr(arg0); 58035c4bbdfSmrg} 58135c4bbdfSmrg 58235c4bbdfSmrgXserver$1:::resource-alloc 58335c4bbdfSmrg/arg3 != 0 && Xrestype[arg3] == ""/ 58435c4bbdfSmrg{ 58535c4bbdfSmrg Xrestype[arg3] = copyinstr(arg3); 58635c4bbdfSmrg} 58735c4bbdfSmrg 58835c4bbdfSmrg 58935c4bbdfSmrgXserver$1:::request-start 59035c4bbdfSmrg/Xrequest[arg0] == "X_CreatePixmap"/ 59135c4bbdfSmrg{ 59235c4bbdfSmrg printf("-> %s: client %d\n", Xrequest[arg0], arg3); 59335c4bbdfSmrg} 59435c4bbdfSmrg 59535c4bbdfSmrgXserver$1:::request-done 59635c4bbdfSmrg/Xrequest[arg0] == "X_CreatePixmap"/ 59735c4bbdfSmrg{ 59835c4bbdfSmrg printf("<- %s: client %d\n", Xrequest[arg0], arg3); 59935c4bbdfSmrg} 60035c4bbdfSmrg 60135c4bbdfSmrgXserver$1:::resource-alloc 60235c4bbdfSmrg/Xrestype[arg3] == "PIXMAP"/ 60335c4bbdfSmrg{ 60435c4bbdfSmrg printf("** Pixmap alloc: %08x\n", arg0); 60535c4bbdfSmrg} 60635c4bbdfSmrg 60735c4bbdfSmrg 60835c4bbdfSmrgXserver$1:::resource-free 60935c4bbdfSmrg/Xrestype[arg3] == "PIXMAP"/ 61035c4bbdfSmrg{ 61135c4bbdfSmrg printf("** Pixmap free: %08x\n", arg0); 61235c4bbdfSmrg} 61335c4bbdfSmrg 61435c4bbdfSmrgXserver$1:::client-connect 61535c4bbdfSmrg{ 61635c4bbdfSmrg printf("** Client Connect: id %d\n", arg0); 61735c4bbdfSmrg} 61835c4bbdfSmrg 61935c4bbdfSmrgXserver$1:::client-auth 62035c4bbdfSmrg{ 62135c4bbdfSmrg printf("** Client auth'ed: id %d => %s pid %d\n", 62235c4bbdfSmrg arg0, copyinstr(arg1), arg2); 62335c4bbdfSmrg} 62435c4bbdfSmrg 62535c4bbdfSmrgXserver$1:::client-disconnect 62635c4bbdfSmrg{ 62735c4bbdfSmrg printf("** Client Disconnect: id %d\n", arg0); 62835c4bbdfSmrg} 62935c4bbdfSmrg </programlisting> 63035c4bbdfSmrg 63135c4bbdfSmrg Sample output from a run of this script: 63235c4bbdfSmrg <screen><computeroutput> 63335c4bbdfSmrg** Client Connect: id 17 63435c4bbdfSmrg** Client auth'ed: id 17 => local host pid 20273 63535c4bbdfSmrg-> X_CreatePixmap: client 17 63635c4bbdfSmrg** Pixmap alloc: 02200009 63735c4bbdfSmrg<- X_CreatePixmap: client 17 63835c4bbdfSmrg-> X_CreatePixmap: client 15 63935c4bbdfSmrg** Pixmap alloc: 01e00180 64035c4bbdfSmrg<- X_CreatePixmap: client 15 64135c4bbdfSmrg-> X_CreatePixmap: client 15 64235c4bbdfSmrg** Pixmap alloc: 01e00181 64335c4bbdfSmrg<- X_CreatePixmap: client 15 64435c4bbdfSmrg-> X_CreatePixmap: client 14 64535c4bbdfSmrg** Pixmap alloc: 01c004c8 64635c4bbdfSmrg<- X_CreatePixmap: client 14 64735c4bbdfSmrg** Pixmap free: 02200009 64835c4bbdfSmrg** Client Disconnect: id 17 64935c4bbdfSmrg** Pixmap free: 01e00180 65035c4bbdfSmrg** Pixmap free: 01e00181 65135c4bbdfSmrg </computeroutput></screen> 65235c4bbdfSmrg 65335c4bbdfSmrg </para> 65435c4bbdfSmrg 65535c4bbdfSmrg </example> 65635c4bbdfSmrg 65735c4bbdfSmrg <example id="Input_API_monitoring_with_systemtap"> 65835c4bbdfSmrg <title>Input API monitoring with SystemTap</title> 65935c4bbdfSmrg 66035c4bbdfSmrg <para> 66135c4bbdfSmrg This script can be used to monitor events submitted by drivers to 66235c4bbdfSmrg the server for enqueuing. Due to the integration of the input API 66335c4bbdfSmrg probes, some server-enqueued events will show up too. 66435c4bbdfSmrg <programlisting> 66535c4bbdfSmrg # Compile+run with 66635c4bbdfSmrg # stap -g xorg.stp /usr/bin/Xorg 66735c4bbdfSmrg # 66835c4bbdfSmrg 66935c4bbdfSmrg 67035c4bbdfSmrg function print_valuators:string(nvaluators:long, mask_in:long, valuators_in:long) %{ 67135c4bbdfSmrg int i; 67235c4bbdfSmrg unsigned char *mask = (unsigned char*)THIS->mask_in; 67335c4bbdfSmrg double *valuators = (double*)THIS->valuators_in; 67435c4bbdfSmrg char str[128] = {0}; 67535c4bbdfSmrg char *s = str; 67635c4bbdfSmrg 67735c4bbdfSmrg #define BitIsSet(ptr, bit) (((unsigned char*)(ptr))[(bit)>>3] & (1 << ((bit) & 7))) 67835c4bbdfSmrg 67935c4bbdfSmrg s += sprintf(s, "nval: %d ::", (int)THIS->nvaluators); 68035c4bbdfSmrg for (i = 0; i < THIS->nvaluators; i++) 68135c4bbdfSmrg { 68235c4bbdfSmrg s += sprintf(s, " %d: ", i); 68335c4bbdfSmrg if (BitIsSet(mask, i)) 68435c4bbdfSmrg s += sprintf(s, "%d", (int)valuators[i]); 68535c4bbdfSmrg } 68635c4bbdfSmrg 68735c4bbdfSmrg sprintf(THIS->__retvalue, "%s", str); 68835c4bbdfSmrg %} 68935c4bbdfSmrg 69035c4bbdfSmrg probe process(@1).mark("input__event") 69135c4bbdfSmrg { 69235c4bbdfSmrg deviceid = $arg1 69335c4bbdfSmrg type = $arg2 69435c4bbdfSmrg detail = $arg3 69535c4bbdfSmrg flags = $arg4 69635c4bbdfSmrg nvaluators = $arg5 69735c4bbdfSmrg 69835c4bbdfSmrg str = print_valuators(nvaluators, $arg6, $arg7) 69935c4bbdfSmrg printf("Event: device %d type %d detail %d flags %#x %s\n", 70035c4bbdfSmrg deviceid, type, detail, flags, str); 70135c4bbdfSmrg } 70235c4bbdfSmrg </programlisting> 70335c4bbdfSmrg 70435c4bbdfSmrg Sample output from a run of this script: 70535c4bbdfSmrg <screen><computeroutput> 70635c4bbdfSmrgEvent: device 13 type 4 detail 1 flags 0x0 nval: 0 :: 70735c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 1 :: 0: 1 70835c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -1 70935c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -1 71035c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 4 1: -3 71135c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 3 1: -3 71235c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 3 1: -2 71335c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -2 71435c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -2 71535c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -2 71635c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 1: -1 71735c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 1: -1 71835c4bbdfSmrgEvent: device 13 type 5 detail 1 flags 0x0 nval: 0 :: 71935c4bbdfSmrg </computeroutput></screen> 72035c4bbdfSmrg 72135c4bbdfSmrg </para> 72235c4bbdfSmrg 72335c4bbdfSmrg </example> 72435c4bbdfSmrg 72535c4bbdfSmrg </sect1> 72635c4bbdfSmrg 72735c4bbdfSmrg</article> 728