From 07f55660c528502151429eefc7badf8d768d6673 Mon Sep 17 00:00:00 2001 From: wcohen Date: Fri, 3 Feb 2012 17:07:36 +0000 Subject: [PATCH] Pull in the new SystemTap Beginners Guide (1.7) --- SystemTap_Beginners_Guide.pdf | Bin 665302 -> 665312 bytes .../Common_Content/css/common.css | 1495 +++++++ .../Common_Content/css/default.css | 3 + .../Common_Content/css/lang.css | 2 + .../Common_Content/css/overrides.css | 51 + .../Common_Content/css/print.css | 16 + .../Common_Content/images/1.png | Bin 0 -> 690 bytes .../Common_Content/images/1.svg | 22 + .../Common_Content/images/10.png | Bin 0 -> 982 bytes .../Common_Content/images/10.svg | 22 + .../Common_Content/images/11.png | Bin 0 -> 806 bytes .../Common_Content/images/11.svg | 22 + .../Common_Content/images/12.png | Bin 0 -> 953 bytes .../Common_Content/images/12.svg | 22 + .../Common_Content/images/13.png | Bin 0 -> 1015 bytes .../Common_Content/images/13.svg | 22 + .../Common_Content/images/14.png | Bin 0 -> 933 bytes .../Common_Content/images/14.svg | 22 + .../Common_Content/images/15.png | Bin 0 -> 996 bytes .../Common_Content/images/15.svg | 22 + .../Common_Content/images/16.png | Bin 0 -> 1030 bytes .../Common_Content/images/16.svg | 22 + .../Common_Content/images/17.png | Bin 0 -> 870 bytes .../Common_Content/images/17.svg | 22 + .../Common_Content/images/18.png | Bin 0 -> 1001 bytes .../Common_Content/images/18.svg | 22 + .../Common_Content/images/19.png | Bin 0 -> 1013 bytes .../Common_Content/images/19.svg | 22 + .../Common_Content/images/2.png | Bin 0 -> 808 bytes .../Common_Content/images/2.svg | 22 + .../Common_Content/images/20.png | Bin 0 -> 1121 bytes .../Common_Content/images/20.svg | 22 + .../Common_Content/images/21.png | Bin 0 -> 981 bytes .../Common_Content/images/21.svg | 22 + .../Common_Content/images/22.png | Bin 0 -> 1057 bytes .../Common_Content/images/22.svg | 22 + .../Common_Content/images/23.png | Bin 0 -> 1120 bytes .../Common_Content/images/23.svg | 22 + .../Common_Content/images/24.png | Bin 0 -> 1083 bytes .../Common_Content/images/24.svg | 31 + .../Common_Content/images/25.png | Bin 0 -> 1182 bytes .../Common_Content/images/25.svg | 31 + .../Common_Content/images/26.png | Bin 0 -> 1215 bytes .../Common_Content/images/26.svg | 31 + .../Common_Content/images/27.png | Bin 0 -> 1086 bytes .../Common_Content/images/27.svg | 31 + .../Common_Content/images/28.png | Bin 0 -> 1251 bytes .../Common_Content/images/28.svg | 31 + .../Common_Content/images/29.png | Bin 0 -> 1212 bytes .../Common_Content/images/29.svg | 31 + .../Common_Content/images/3.png | Bin 0 -> 868 bytes .../Common_Content/images/3.svg | 22 + .../Common_Content/images/30.png | Bin 0 -> 1267 bytes .../Common_Content/images/30.svg | 31 + .../Common_Content/images/31.png | Bin 0 -> 1083 bytes .../Common_Content/images/31.svg | 31 + .../Common_Content/images/32.png | Bin 0 -> 1244 bytes .../Common_Content/images/32.svg | 31 + .../Common_Content/images/33.png | Bin 0 -> 1279 bytes .../Common_Content/images/33.svg | 31 + .../Common_Content/images/34.png | Bin 0 -> 1178 bytes .../Common_Content/images/34.svg | 31 + .../Common_Content/images/35.png | Bin 0 -> 1235 bytes .../Common_Content/images/35.svg | 31 + .../Common_Content/images/36.png | Bin 0 -> 1286 bytes .../Common_Content/images/36.svg | 31 + .../Common_Content/images/37.png | Bin 0 -> 1155 bytes .../Common_Content/images/37.svg | 31 + .../Common_Content/images/38.png | Bin 0 -> 1325 bytes .../Common_Content/images/38.svg | 31 + .../Common_Content/images/39.png | Bin 0 -> 1300 bytes .../Common_Content/images/39.svg | 31 + .../Common_Content/images/4.png | Bin 0 -> 794 bytes .../Common_Content/images/4.svg | 22 + .../Common_Content/images/40.png | Bin 0 -> 1145 bytes .../Common_Content/images/40.svg | 31 + .../Common_Content/images/5.png | Bin 0 -> 853 bytes .../Common_Content/images/5.svg | 22 + .../Common_Content/images/6.png | Bin 0 -> 865 bytes .../Common_Content/images/6.svg | 22 + .../Common_Content/images/7.png | Bin 0 -> 742 bytes .../Common_Content/images/7.svg | 22 + .../Common_Content/images/8.png | Bin 0 -> 862 bytes .../Common_Content/images/8.svg | 22 + .../Common_Content/images/9.png | Bin 0 -> 860 bytes .../Common_Content/images/9.svg | 22 + .../Common_Content/images/bkgrnd_greydots.png | Bin 0 -> 157 bytes .../images/bullet_arrowblue.png | Bin 0 -> 177 bytes .../Common_Content/images/documentation.png | Bin 0 -> 623 bytes .../Common_Content/images/dot.png | Bin 0 -> 98 bytes .../Common_Content/images/dot2.png | Bin 0 -> 98 bytes .../Common_Content/images/green.png | Bin 0 -> 176 bytes .../Common_Content/images/h1-bg.png | Bin 0 -> 565 bytes .../Common_Content/images/image_left.png | Bin 0 -> 1114 bytes .../Common_Content/images/image_right.png | Bin 0 -> 4092 bytes .../Common_Content/images/important.png | Bin 0 -> 2080 bytes .../Common_Content/images/important.svg | 106 + .../Common_Content/images/logo.png | Bin 0 -> 1114 bytes .../Common_Content/images/note.png | Bin 0 -> 1241 bytes .../Common_Content/images/note.svg | 111 + .../Common_Content/images/red.png | Bin 0 -> 163 bytes .../Common_Content/images/shade.png | Bin 0 -> 101 bytes .../Common_Content/images/shine.png | Bin 0 -> 146 bytes .../Common_Content/images/stock-go-back.png | Bin 0 -> 828 bytes .../images/stock-go-forward.png | Bin 0 -> 828 bytes .../Common_Content/images/stock-go-up.png | Bin 0 -> 760 bytes .../Common_Content/images/stock-home.png | Bin 0 -> 808 bytes .../Common_Content/images/title_logo.png | Bin 0 -> 13399 bytes .../Common_Content/images/title_logo.svg | 109 + .../Common_Content/images/warning.png | Bin 0 -> 1340 bytes .../Common_Content/images/warning.svg | 89 + .../Common_Content/images/watermark-draft.png | Bin 0 -> 25365 bytes .../Common_Content/images/yellow.png | Bin 0 -> 175 bytes .../SystemTap_Beginners_Guide-Preface.html | 90 + .../appe-Publican-Revision_History.html | 12 + SystemTap_Beginners_Guide/arrayoperators.html | 13 + .../arrayops-aggregates.html | 42 + .../arrayops-conditionals.html | 43 + .../arrayops-deleting.html | 44 + .../arrayops-foreach.html | 30 + .../arrayops-increment.html | 12 + .../arrayops-readvalues.html | 11 + .../associativearrays.html | 15 + .../commandlineargssect.html | 8 + .../cross-compiling.html | 59 + SystemTap_Beginners_Guide/errors.html | 56 + .../futexcontentionsect.html | 54 + .../handlerconditionalstatements.html | 49 + .../images/gnuplotsample.png | Bin 0 -> 8286 bytes SystemTap_Beginners_Guide/images/icon.svg | 3936 +++++++++++++++++ SystemTap_Beginners_Guide/index.html | 18 + .../inodewatch2sect.html | 29 + SystemTap_Beginners_Guide/inodewatchsect.html | 35 + .../intro-systemtap-vs-others.html | 13 + SystemTap_Beginners_Guide/introduction.html | 19 + SystemTap_Beginners_Guide/ioblktimesect.html | 47 + SystemTap_Beginners_Guide/iotimesect.html | 119 + SystemTap_Beginners_Guide/ix01.html | 3 + SystemTap_Beginners_Guide/mainsect-disk.html | 113 + .../mainsect-profiling.html | 59 + SystemTap_Beginners_Guide/paracallgraph.html | 55 + SystemTap_Beginners_Guide/pr01s02.html | 9 + SystemTap_Beginners_Guide/references.html | 23 + SystemTap_Beginners_Guide/runtimeerror.html | 21 + .../scriptconstructions.html | 24 + SystemTap_Beginners_Guide/scripts.html | 85 + .../syscallsbyprocpidsect.html | 91 + .../systemtapscript-handler.html | 107 + .../targetavailable.html | 15 + .../targetvariables.html | 47 + .../threadtimessect.html | 67 + SystemTap_Beginners_Guide/timeoutssect.html | 148 + SystemTap_Beginners_Guide/topsyssect.html | 56 + SystemTap_Beginners_Guide/traceio2sect.html | 41 + SystemTap_Beginners_Guide/traceiosect.html | 78 + SystemTap_Beginners_Guide/typecasting.html | 11 + .../understanding-how-systemtap-works.html | 23 + .../understanding-tapsets.html | 11 + .../useful-systemtap-scripts.html | 298 ++ .../userspace-probing.html | 35 + .../using-systemtap.html | 83 + SystemTap_Beginners_Guide/using-usage.html | 64 + SystemTap_Beginners_Guide/ustack.html | 31 + .../utargetvariable.html | 17 + 164 files changed, 9384 insertions(+) create mode 100644 SystemTap_Beginners_Guide/Common_Content/css/common.css create mode 100644 SystemTap_Beginners_Guide/Common_Content/css/default.css create mode 100644 SystemTap_Beginners_Guide/Common_Content/css/lang.css create mode 100644 SystemTap_Beginners_Guide/Common_Content/css/overrides.css create mode 100644 SystemTap_Beginners_Guide/Common_Content/css/print.css create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/1.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/1.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/10.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/10.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/11.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/11.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/12.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/12.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/13.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/13.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/14.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/14.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/15.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/15.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/16.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/16.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/17.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/17.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/18.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/18.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/19.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/19.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/2.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/2.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/20.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/20.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/21.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/21.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/22.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/22.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/23.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/23.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/24.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/24.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/25.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/25.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/26.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/26.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/27.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/27.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/28.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/28.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/29.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/29.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/3.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/3.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/30.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/30.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/31.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/31.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/32.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/32.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/33.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/33.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/34.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/34.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/35.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/35.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/36.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/36.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/37.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/37.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/38.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/38.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/39.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/39.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/4.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/4.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/40.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/40.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/5.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/5.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/6.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/6.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/7.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/7.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/8.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/8.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/9.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/9.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/bkgrnd_greydots.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/bullet_arrowblue.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/documentation.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/dot.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/dot2.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/green.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/h1-bg.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/image_left.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/image_right.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/important.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/important.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/logo.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/note.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/note.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/red.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/shade.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/shine.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/stock-go-back.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/stock-go-forward.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/stock-go-up.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/stock-home.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/title_logo.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/title_logo.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/warning.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/warning.svg create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/watermark-draft.png create mode 100644 SystemTap_Beginners_Guide/Common_Content/images/yellow.png create mode 100644 SystemTap_Beginners_Guide/SystemTap_Beginners_Guide-Preface.html create mode 100644 SystemTap_Beginners_Guide/appe-Publican-Revision_History.html create mode 100644 SystemTap_Beginners_Guide/arrayoperators.html create mode 100644 SystemTap_Beginners_Guide/arrayops-aggregates.html create mode 100644 SystemTap_Beginners_Guide/arrayops-conditionals.html create mode 100644 SystemTap_Beginners_Guide/arrayops-deleting.html create mode 100644 SystemTap_Beginners_Guide/arrayops-foreach.html create mode 100644 SystemTap_Beginners_Guide/arrayops-increment.html create mode 100644 SystemTap_Beginners_Guide/arrayops-readvalues.html create mode 100644 SystemTap_Beginners_Guide/associativearrays.html create mode 100644 SystemTap_Beginners_Guide/commandlineargssect.html create mode 100644 SystemTap_Beginners_Guide/cross-compiling.html create mode 100644 SystemTap_Beginners_Guide/errors.html create mode 100644 SystemTap_Beginners_Guide/futexcontentionsect.html create mode 100644 SystemTap_Beginners_Guide/handlerconditionalstatements.html create mode 100755 SystemTap_Beginners_Guide/images/gnuplotsample.png create mode 100644 SystemTap_Beginners_Guide/images/icon.svg create mode 100644 SystemTap_Beginners_Guide/index.html create mode 100644 SystemTap_Beginners_Guide/inodewatch2sect.html create mode 100644 SystemTap_Beginners_Guide/inodewatchsect.html create mode 100644 SystemTap_Beginners_Guide/intro-systemtap-vs-others.html create mode 100644 SystemTap_Beginners_Guide/introduction.html create mode 100644 SystemTap_Beginners_Guide/ioblktimesect.html create mode 100644 SystemTap_Beginners_Guide/iotimesect.html create mode 100644 SystemTap_Beginners_Guide/ix01.html create mode 100644 SystemTap_Beginners_Guide/mainsect-disk.html create mode 100644 SystemTap_Beginners_Guide/mainsect-profiling.html create mode 100644 SystemTap_Beginners_Guide/paracallgraph.html create mode 100644 SystemTap_Beginners_Guide/pr01s02.html create mode 100644 SystemTap_Beginners_Guide/references.html create mode 100644 SystemTap_Beginners_Guide/runtimeerror.html create mode 100644 SystemTap_Beginners_Guide/scriptconstructions.html create mode 100644 SystemTap_Beginners_Guide/scripts.html create mode 100644 SystemTap_Beginners_Guide/syscallsbyprocpidsect.html create mode 100644 SystemTap_Beginners_Guide/systemtapscript-handler.html create mode 100644 SystemTap_Beginners_Guide/targetavailable.html create mode 100644 SystemTap_Beginners_Guide/targetvariables.html create mode 100644 SystemTap_Beginners_Guide/threadtimessect.html create mode 100644 SystemTap_Beginners_Guide/timeoutssect.html create mode 100644 SystemTap_Beginners_Guide/topsyssect.html create mode 100644 SystemTap_Beginners_Guide/traceio2sect.html create mode 100644 SystemTap_Beginners_Guide/traceiosect.html create mode 100644 SystemTap_Beginners_Guide/typecasting.html create mode 100644 SystemTap_Beginners_Guide/understanding-how-systemtap-works.html create mode 100644 SystemTap_Beginners_Guide/understanding-tapsets.html create mode 100644 SystemTap_Beginners_Guide/useful-systemtap-scripts.html create mode 100644 SystemTap_Beginners_Guide/userspace-probing.html create mode 100644 SystemTap_Beginners_Guide/using-systemtap.html create mode 100644 SystemTap_Beginners_Guide/using-usage.html create mode 100644 SystemTap_Beginners_Guide/ustack.html create mode 100644 SystemTap_Beginners_Guide/utargetvariable.html diff --git a/SystemTap_Beginners_Guide.pdf b/SystemTap_Beginners_Guide.pdf index 5cd86b85d980a63576a5ecad96bc719d3b73d4d8..710e12d708e4d33d23f4d101cd4e4bda1012ea6a 100644 GIT binary patch delta 91642 zcmeFYWo#u)x20)jW_FpGnVFdx%FN7k%*@Qp%*+gBE;BPjnW1dA-}k%I>N^^>M*VX% z()p2!$dihQ{j9wekt>&{DR-wSs-1r%|{IzDfDR5bE* z#OqzfpH^n$I4C>4To*Quzy19EEb{Yx6KW^+2%wDj4i-PE%uTZlxYPp|*kSur&uNT5jm$^bO#(PO+jk&4?lG zN^lD4J$9$$*g$ze>9=U6`h}9yoX6BL%C|Ip9higjk@och|6VAtYO9J%z%fS=K%sXX>gL7iSs5`Vdg`CnrwVusP_g*cZw)q}RAy z9=7G3GEy@1$v?+s0mBVTA%#`9LvNw)J7t830D|F%t-YbKxsx=hU`N0g-f*k~(&NzH z$KHdFhr6p;qLJ4p`eVq*i`L88tLfWq4bot+nTU>vbHVFetnm0PiF`p$Ug@gbP+W3F zm}os$ZJ}D-28waNOn&*<9m3X=Nq?z#56DrPDU@e9GJ@uK!%)vYfp=U- z{1s#o8&|VbzoR|O%v?avf(fq>EQU}rt5d4{-36;mhunGDj-IcQ4M{N@d5@n6wPk^s z?NXYC<)I>95C@B5nx|zx&Tousddv;iffp(F{0sm|Y`k)NsyZ8|7;TAY ztc95LlIa5EVgN`O<^)N2uTva{=p8ZW^0T~OsxA(RznJtk3 zGJzuL(0zds!RRBbG0RKM5yq^~I=Qb->>pknzxDTBbw@%*sz*EU_s@Jbz+({V9Dzky zGaN-!-WAwBYT*IJtO@*8QW4I?Q~rI9AobpRMDZWj>q~r58PoeDsxBJI-y<#JDjlhLiM4XM7nG=U4@*dL?$b?7DEZl))GWWlY-KdHJYD7 zKtRk#)<)PxT__Z&Nasrq7-ivM$fzS>FKbfS+4_A_`Fa5RShZrU_?E%kMT=_So#a$D zg>q6bS6;%)V*c!w3mQ!$s^<1GA!|z1nrSk+(BW5$zd5ESuCi%6C`zKBnwpW3`H;M5 zW__A5ZWcG=Cp+R2c!}JRN9qfOa!xH1Fnbn6McJYfy_v{)zF3iMyle$Cafx8O*4~#j z(zZCa?M48O6hj=_H@9eSF^t`{amK5L$sVNb2jO?_^#DwU8gP|kzaM@~J;31Z3Gg3k zVMz#F^POZluDOR!bYj?EWBctgJh6AurmzW|YzR@+xMgbdQ-yTcBv#EfV=&a>aU~kb zC8kq0&BW>;zddVXK^QVA{acXj2>yVW>1r9bNQeQ@hq$~bK^>Z1x=|k&Ra?$Yde%Yy zXfs%BsWdcRzeG0~i6TCNXI%vIwY2mU3T-U(9?(3*2@6Qb4fIiXt;B}g{~Sgx`YD3X zxtPEQSzQ%u*WEV6W*-o>G!EIJe$h^6&RmI%RHSqlKD$2v-WHN-6u%eI0gdi&Fe5OI z2MrDw;`UeXM6YIbMUOHp_jPJ`@ksU6A&^ZJo1yl>oz*gLE?hZGNnKRNAI{Bo#8a=; z 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%0DHJyyH}MX{j5j&jFAWrf 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 z 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
Xol-qAviDd;&kUh?q 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 .toc { + display:block; + width:24em; + height:99%; + position:fixed; + overflow:auto; + top:0px; + left:0px; + padding-left:1em; + background-color:#EEEEEE; +} + +.toc { + line-height:1.35em; +} + +.toc .glossary, +.toc .chapter, .toc .appendix { + margin-top:1em; +} + +.toc .part { + margin-top:1em; + display:block; +} + +span.glossary, +span.appendix { + display:block; + margin-top:0.5em; +} + +div { + padding-top:0px; +} + +div.section { + padding-top:1em; +} + +p, div.para, div.formalpara { + padding-top:0px; + margin-top:0.3em; + padding-bottom:0px; + margin-bottom:1em; +} + +/*Links*/ +a { + outline: none; +} + +a:link { + text-decoration:none; + border-bottom: 1px dotted ; + color:#3366cc; +} + +a:visited { + text-decoration:none; + border-bottom: 1px dotted ; + color:#003366; +} + +div.longdesc-link { + float:right; + color:#999; +} + +.toc a, .qandaset a { + font-weight:normal; +} + +/*headings*/ +h1, h2, h3, h4, h5, h6 { + color: #336699; + margin-top: 0em; + margin-bottom: 0em; + background-color: transparent; +} + +h1 { + font-size:2.0em; +} + +.titlepage h1.title { + font-size: 3.0em; + padding-top: 1em; + text-align:left; +} + +.book > .titlepage h1.title { + text-align:center; +} + +.article > .titlepage h1.title { + text-align:center; +} + +.set .titlepage > div > div > h1.title { + text-align:center; +} + +.producttitle { + margin-top: 0em; + margin-bottom: 0em; + font-size: 3.0em; + font-weight: bold; + background: #003d6e url(../images/h1-bg.png) top left repeat-x; + color: white; + text-align: center; + padding: 0.7em; +} + +.titlepage .corpauthor { + margin-top: 1em; + text-align: center; +} + +.section h1.title { + font-size: 1.6em; + padding: 0em; + color: #336699; + text-align: left; + background: white; +} + +h2 { + font-size:1.6em; +} + + +h2.subtitle, h3.subtitle { + margin-top: 1em; + margin-bottom: 1em; + font-size: 1.4em; + text-align: center; +} + +.preface > div > div > div > h2.title { + margin-top: 1em; + font-size: 2.0em; +} + +.appendix h2 { + margin-top: 1em; + font-size: 2.0em; +} + + + +h3 { + font-size:1.3em; + padding-top:0em; + padding-bottom:0em; +} +h4 { + font-size:1.1em; + padding-top:0em; + padding-bottom:0em; +} + +h5 { + font-size:1em; +} + +h6 { + font-size:1em; +} + +h5.formalpara { + font-size:1em; + margin-top:2em; + margin-bottom:.8em; +} + +.abstract h6 { + margin-top:1em; + margin-bottom:.5em; + font-size:2em; +} + +/*element rules*/ +hr { + border-collapse: collapse; + border-style:none; + border-top: 1px dotted #ccc; + width:100%; + margin-top: 3em; +} + +/* web site rules */ +ul.languages, .languages li { + display:inline; + padding:0em; +} + +.languages li a { + padding:0em .5em; + text-decoration: none; +} + +.languages li p, .languages li div.para { + display:inline; +} + +.languages li a:link, .languages li a:visited { + color:#444; +} + +.languages li a:hover, .languages li a:focus, .languages li a:active { + color:black; +} + +ul.languages { + display:block; + background-color:#eee; + padding:.5em; +} + +/*supporting stylesheets*/ + +/*unique to the webpage only*/ +.books { + position:relative; +} + +.versions li { + width:100%; + clear:both; + display:block; +} + +a.version { + font-size:2em; + text-decoration:none; + width:100%; + display:block; + padding:1em 0em .2em 0em; + clear:both; +} + +a.version:before { + content:"Version"; + font-size:smaller; +} + +a.version:visited, a.version:link { + color:#666; +} + +a.version:focus, a.version:hover { + color:black; +} + +.books { + display:block; + position:relative; + clear:both; + width:100%; +} + +.books li { + display:block; + width:200px; + float:left; + position:relative; + clear: none ; +} + +.books .html { + width:170px; + display:block; +} + +.books .pdf { + position:absolute; + left:170px; + top:0px; + font-size:smaller; +} + +.books .pdf:link, .books .pdf:visited { + color:#555; +} + +.books .pdf:hover, .books .pdf:focus { + color:#000; +} + +.books li a { + text-decoration:none; +} + +.books li a:hover { + color:black; +} + +/*products*/ +.products li { + display: block; + width:300px; + float:left; +} + +.products li a { + width:300px; + padding:.5em 0em; +} + +.products ul { + clear:both; +} + +/*revision history*/ +.revhistory { + display:block; +} + +.revhistory table { + background-color:transparent; + border-color:#fff; + padding:0em; + margin: 0; + border-collapse:collapse; + border-style:none; +} + +.revhistory td { + text-align :left; + padding:0em; + border: none; + border-top: 1px solid #fff; + font-weight: bold; +} + +.revhistory .simplelist td { + font-weight: normal; +} + +.revhistory .simplelist { + margin-bottom: 1.5em; + margin-left: 1em; +} + +.revhistory table th { + display: none; +} + + +/*credits*/ +.authorgroup div { + clear:both; + text-align: center; +} + +h3.author { + margin: 0em; + padding: 0em; + padding-top: 1em; +} + +.authorgroup h4 { + padding: 0em; + margin: 0em; + padding-top: 1em; + margin-top: 1em; +} + +.author, +.editor, +.translator, +.othercredit, +.contrib { + display: block; +} + +.revhistory .author { + display: inline; +} + +.othercredit h3 { + padding-top: 1em; +} + + +.othercredit { + margin:0em; + padding:0em; +} + +.releaseinfo { + clear: both; +} + +.copyright { + margin-top: 1em; +} + +/* qanda sets */ +.answer { + margin-bottom:1em; + border-bottom:1px dotted #ccc; +} + +.qandaset .toc { + border-bottom:1px dotted #ccc; +} + +.question { + font-weight:bold; +} + +.answer .data, .question .data { + padding-left: 2.6em; +} + +.answer label, .question label { + float:left; + font-weight:bold; +} + +/* inline syntax highlighting */ +.perl_Alert { + color: #0000ff; +} + +.perl_BaseN { + color: #007f00; +} + +.perl_BString { + color: #5C3566; +} + +.perl_Char { + color: #ff00ff; +} + +.perl_Comment { + color: #FF00FF; +} + + +.perl_DataType { + color: #0000ff; +} + + +.perl_DecVal { + color: #00007f; +} + + +.perl_Error { + color: #ff0000; +} + + +.perl_Float { + color: #00007f; +} + + +.perl_Function { + color: #007f00; +} + + +.perl_IString { + color: #5C3566; +} + + +.perl_Keyword { + color: #002F5D; +} + + +.perl_Operator { + color: #ffa500; +} + + +.perl_Others { + color: #b03060; +} + + +.perl_RegionMarker { + color: #96b9ff; +} + + +.perl_Reserved { + color: #9b30ff; +} + + +.perl_String { + color: #5C3566; +} + + +.perl_Variable { + color: #0000ff; +} + + +.perl_Warning { + color: #0000ff; +} + +/*Lists*/ +ul { + padding-left:1.6em; + list-style-image:url(../images/dot.png); + list-style-type: circle; +} + +ul ul { + list-style-image:url(../images/dot2.png); + list-style-type: circle; +} + +ol { + list-style-image:none; + list-style-type: decimal; +} + +ol ol { + list-style-type: lower-alpha; +} + +ol.arabic { + list-style-type: decimal; +} + +ol.loweralpha { + list-style-type: lower-alpha; +} + +ol.lowerroman { + list-style-type: lower-roman; +} + +ol.upperalpha { + list-style-type: upper-alpha; +} + +ol.upperroman { + list-style-type: upper-roman; +} + +dt { + font-weight:bold; + margin-bottom:0em; + padding-bottom:0em; +} + +dd { + margin:0em; + margin-left:2em; + padding-top:0em; + padding-bottom: 1em; +} + +li { + padding-top:0px; + margin-top:0em; + padding-bottom:0px; + margin-bottom:0.4em; +} + +li p, li div.para { + padding-top:0px; + margin-top:0em; + padding-bottom:0px; + margin-bottom:0.3em; +} + +/*images*/ +img { + display:block; + margin: 2em 0; +} + +.inlinemediaobject, .inlinemediaobject img { + display:inline; + margin:0em; +} + +.figure img { + display:block; + margin:0; +} + +.figure .title { + margin:0em; + margin-bottom:2em; + padding:0px; +} + +/*document modes*/ +.confidential { + background-color:#900; + color:White; + padding:.5em .5em; + text-transform:uppercase; + text-align:center; +} + +.longdesc-link { + display:none; +} + +.longdesc { + display:none; +} + +.prompt { + padding:0em .3em; +} + +/*user interface styles*/ +.screen .replaceable { +} + +.guibutton, .guilabel { + font-family: "liberation mono", "bitstream vera mono", "dejavu mono", monospace; + font-weight: bold; + white-space: nowrap; +} + +.example { + background-color: #ffffff; + border-left: 3px solid #aaaaaa; + padding-top: 1em; + padding-bottom: 0.1em; +} + +.example h6 { + padding-left: 10px; +} + +.example-contents { + padding-left: 10px; + background-color: #ffffff; +} + +.example-contents .para { +/* padding: 10px;*/ +} + +/*terminal/console text*/ +.computeroutput, +.option { + font-family:"liberation mono", "bitstream vera mono", "dejavu mono", monospace; + font-weight:bold; +} + +.replaceable { + font-family:"liberation mono", "bitstream vera mono", "dejavu mono", monospace; + font-style: italic; +} + +.command, .filename, .keycap, .classname, .literal { + font-family:"liberation mono", "bitstream vera mono", "dejavu mono", monospace; + font-weight:bold; +} + +/* no bold in toc */ +.toc * { + font-weight: inherit; +} + +pre { + font-family:"liberation mono", "bitstream vera mono", "dejavu mono", monospace; + display:block; + background-color: #f5f5f5; + color: #000000; + border: 1px solid #aaaaaa; + margin-bottom: 0.3em; + padding:.5em 1em; + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ + font-size: 0.9em; +} + +pre .replaceable, +pre .keycap { +} + +code { + font-family:"liberation mono", "bitstream vera mono", "dejavu mono", monospace; + white-space: nowrap; + font-weight:bold; +} + +.parameter code { + display: inline; + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ +} + +/*Notifications*/ +div.warning:before { + content:url(../images/warning.png); + padding-left: 5px; +} + +div.note:before { + content:url(../images/note.png); + padding-left: 5px; +} + +div.important:before { + content:url(../images/important.png); + padding-left: 5px; +} + +div.warning, div.note, div.important { + color: black; + margin: 0em; + padding: 0em; + background: none; + background-color: white; + margin-bottom: 1em; + border-bottom: 1px solid #aaaaaa; +} + +div.warning h2, div.note h2,div.important h2 { + margin: 0em; + padding: 0em; + color: #eeeeec; + padding-top: 0px; + padding-bottom: 0px; + height: 1.4em; + line-height: 1.4em; + font-size: 1.4em; + display:inline; +} + +div.admonition_header { + clear: both; + margin: 0em; + padding: 0em; + margin-top: -3.3em; + padding-left: 58px; + line-height: 1.0em; + font-size: 1.0em; +} + +div.warning div.admonition_header { + background: url(../images/red.png) top left repeat-x; + background-color: #590000; +} + +div.note div.admonition_header { + background: url(../images/green.png) top right repeat-x; + background-color: #597800; +} + +div.important div.admonition_header { + background: url(../images/yellow.png) top right repeat-x; + background-color: #a6710f; +} + +div.warning p, div.warning div.para, +div.note p, div.note div.para, +div.important p, div.important div.para { + padding: 0em; + margin: 0em; +} + +div.admonition { + border: none; + border-left: 1px solid #aaaaaa; + border-right: 1px solid #aaaaaa; + padding:0em; + margin:0em; + padding-top: 1.5em; + padding-bottom: 1em; + padding-left: 2em; + padding-right: 1em; + background-color: #eeeeec; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} + +/*Page Title*/ +#title { + display:block; + height:45px; + padding-bottom:1em; + margin:0em; +} + +#title a.left{ + display:inline; + border:none; +} + +#title a.left img{ + border:none; + float:left; + margin:0em; + margin-top:.7em; +} + +#title a.right { + padding-bottom:1em; +} + +#title a.right img { + border:none; + float:right; + margin:0em; + margin-top:.7em; +} + +/*Table*/ +table { + border:1px solid #6c614b; + width:100%; + border-collapse:collapse; +} + +table.simplelist, .calloutlist table { + border-style: none; +} + +table th { + text-align:left; + background-color:#6699cc; + padding:.3em .5em; + color:white; +} + +table td { + padding:.15em .5em; +} + +table tr.even td { + background-color:#f5f5f5; +} + +table th p:first-child, table td p:first-child, table li p:first-child, +table th div.para:first-child, table td div.para:first-child, table li div.para:first-child { + margin-top:0em; + padding-top:0em; + display:inline; +} + +th, td { + border-style:none; + vertical-align: top; + border: 1px solid #000; +} + +.simplelist th, .simplelist td { + border: none; +} + +table table td { + border-bottom:1px dotted #aaa; + background-color:white; + padding:.6em 0em; +} + +table table { + border:1px solid white; +} + +td.remarkval { + color:#444; +} + +td.fieldval { + font-weight:bold; +} + +.lbname, .lbtype, .lbdescr, .lbdriver, .lbhost { + color:white; + font-weight:bold; + background-color:#999; + width:120px; +} + +td.remarkval { + width:230px; +} + +td.tname { + font-weight:bold; +} + +th.dbfield { + width:120px; +} + +th.dbtype { + width:70px; +} + +th.dbdefault { + width:70px; +} + +th.dbnul { + width:70px; +} + +th.dbkey { + width:70px; +} + +span.book { + margin-top:4em; + display:block; +} + +span.chapter { + display:block; + margin-top:0.5em; +} + +table.simplelist td, .calloutlist table td { + border-style: none; +} + +/*Breadcrumbs*/ +#breadcrumbs ul li.first:before { + content:" "; +} + +#breadcrumbs { + color:#900; + padding:3px; + margin-bottom:25px; +} + +#breadcrumbs ul { + margin-left:0; + padding-left:0; + display:inline; + border:none; +} + +#breadcrumbs ul li { + margin-left:0; + padding-left:2px; + border:none; + list-style:none; + display:inline; +} + +#breadcrumbs ul li:before { + content:"\0020 \0020 \0020 \00BB \0020"; + color:#333; +} + +/*index*/ +.glossary h3, +.index h3 { + font-size: 2em; + color:#aaa; + margin:0em; +} + +.indexdiv { + margin-bottom:1em; +} + +.glossary dt, +.index dt { + color:#444; + padding-top:.5em; +} + +.glossary dl dl dt, +.index dl dl dt { + color:#777; + font-weight:normal; + padding-top:0em; +} + +.index dl dl dt:before { + content:"- "; + color:#ccc; +} + +/*changes*/ +.footnote { + font-size: .7em; + margin:0em; + color:#222; +} + +table .footnote { +} + +sup { + color:#999; + margin:0em; + padding:0em; + line-height: .4em; + font-size: 1em; + padding-left:0em; +} + +.footnote { + position:relative; +} + +.footnote sup { + color:#e3dcc0; + position:absolute; + left: .4em; +} + +.footnote sup a:link, +.footnote sup a:visited { + color:#92917d; + text-decoration:none; +} + +.footnote:hover sup a { + text-decoration:none; +} + +.footnote p,.footnote div.para { + padding-left:2em; +} + +.footnote a:link, +.footnote a:visited { + color:#00537c; +} + +.footnote a:hover { +} + +/**/ +div.chapter { + margin-top:3em; +} + +div.section { + margin-top:1em; +} + +div.note .replaceable, +div.important .replaceable, +div.warning .replaceable, +div.note .keycap, +div.important .keycap, +div.warning .keycap +{ +} + +ul li p:last-child, ul li div.para:last-child { + margin-bottom:0em; + padding-bottom:0em; +} + +/*document navigation*/ +.docnav a, .docnav strong { + border:none; + text-decoration:none; + font-weight:normal; +} + +.docnav { + list-style:none; + margin:0em; + padding:0em; + position:relative; + width:100%; + padding-bottom:2em; + padding-top:1em; + border-top:1px dotted #ccc; +} + +.docnav li { + list-style:none; + margin:0em; + padding:0em; + display:inline; + font-size:.8em; +} + +.docnav li:before { + content:" "; +} + +.docnav li.previous, .docnav li.next { + position:absolute; + top:1em; +} + +.docnav li.up, .docnav li.home { + margin:0em 1.5em; +} + +.docnav li.previous { + left:0px; + text-align:left; +} + +.docnav li.next { + right:0px; + text-align:right; +} + +.docnav li.previous strong, .docnav li.next strong { + height:22px; + display:block; +} + +.docnav { + margin:0 auto; + text-align:center; +} + +.docnav li.next a strong { + background: url(../images/stock-go-forward.png) top right no-repeat; + padding-top:3px; + padding-bottom:4px; + padding-right:28px; + font-size:1.2em; +} + +.docnav li.previous a strong { + background: url(../images/stock-go-back.png) top left no-repeat; + padding-top:3px; + padding-bottom:4px; + padding-left:28px; + padding-right:0.5em; + font-size:1.2em; +} + +.docnav li.home a strong { + background: url(../images/stock-home.png) top left no-repeat; + padding:5px; + padding-left:28px; + font-size:1.2em; +} + +.docnav li.up a strong { + background: url(../images/stock-go-up.png) top left no-repeat; + padding:5px; + padding-left:28px; + font-size:1.2em; +} + +.docnav a:link, .docnav a:visited { + color:#666; +} + +.docnav a:hover, .docnav a:focus, .docnav a:active { + color:black; +} + +.docnav a { + max-width: 10em; + overflow:hidden; +} + +.docnav a:link strong { + text-decoration:none; +} + +.docnav { + margin:0 auto; + text-align:center; +} + +ul.docnav { + margin-bottom: 1em; +} +/* Reports */ +.reports ul { + list-style:none; + margin:0em; + padding:0em; +} + +.reports li{ + margin:0em; + padding:0em; +} + +.reports li.odd { + background-color: #eeeeee; + margin:0em; + padding:0em; +} + +.reports dl { + display:inline; + margin:0em; + padding:0em; + float:right; + margin-right: 17em; + margin-top:-1.3em; +} + +.reports dt { + display:inline; + margin:0em; + padding:0em; +} + +.reports dd { + display:inline; + margin:0em; + padding:0em; + padding-right:.5em; +} + +.reports h2, .reports h3{ + display:inline; + padding-right:.5em; + font-size:10pt; + font-weight:normal; +} + +.reports div.progress { + display:inline; + float:right; + width:16em; + background:#c00 url(../images/shine.png) top left repeat-x; + margin:0em; + margin-top:-1.3em; + padding:0em; + border:none; +} + +/*uniform*/ +body.results, body.reports { + max-width:57em ; + padding:0em; +} + +/*Progress Bar*/ +div.progress { + display:block; + float:left; + width:16em; + background:#c00 url(../images/shine.png) top left repeat-x; + height:1em; +} + +div.progress span { + height:1em; + float:left; +} + +div.progress span.translated { + background:#6c3 url(../images/shine.png) top left repeat-x; +} + +div.progress span.fuzzy { + background:#ff9f00 url(../images/shine.png) top left repeat-x; +} + + +/*Results*/ + +.results ul { + list-style:none; + margin:0em; + padding:0em; +} + +.results li{ + margin:0em; + padding:0em; +} + +.results li.odd { + background-color: #eeeeee; + margin:0em; + padding:0em; +} + +.results dl { + display:inline; + margin:0em; + padding:0em; + float:right; + margin-right: 17em; + margin-top:-1.3em; +} + +.results dt { + display:inline; + margin:0em; + padding:0em; +} + +.results dd { + display:inline; + margin:0em; + padding:0em; + padding-right:.5em; +} + +.results h2, .results h3 { + display:inline; + padding-right:.5em; + font-size:10pt; + font-weight:normal; +} + +.results div.progress { + display:inline; + float:right; + width:16em; + background:#c00 url(../images/shine.png) top left repeat-x; + margin:0em; + margin-top:-1.3em; + padding:0em; + border:none; +} + +/* Dirty EVIL Mozilla hack for round corners */ +pre { + -moz-border-radius:11px; + -webkit-border-radius:11px; + border-radius: 11px; +} + +.example { + -moz-border-radius:0px; + -webkit-border-radius:0px; + border-radius: 0px; +} + +.package, .citetitle { + font-style: italic; +} + +.titlepage .edition { + color: #336699; + background-color: transparent; + margin-top: 1em; + margin-bottom: 1em; + font-size: 1.4em; + font-weight: bold; + text-align: center; +} + +span.remark { + background-color: #ff00ff; +} + +.draft { + background-image: url(../images/watermark-draft.png); + background-repeat: repeat-y; + background-position: center; +} + +.foreignphrase { + font-style: inherit; +} + +dt { + clear:both; +} + +dt img { + border-style: none; + max-width: 112px; +} + +dt object { + max-width: 112px; +} + +dt .inlinemediaobject, dt object { + display: inline; + float: left; + margin-bottom: 1em; + padding-right: 1em; + width: 112px; +} + +dl:after { + display: block; + clear: both; + content: ""; +} + +.toc dd { + padding-bottom: 0em; + margin-bottom: 1em; + padding-left: 1.3em; + margin-left: 0em; +} + +div.toc > dl > dt { + padding-bottom: 0em; + margin-bottom: 0em; + margin-top: 1em; +} + + +.strikethrough { + text-decoration: line-through; +} + +.underline { + text-decoration: underline; +} + +.calloutlist img, .callout { + padding: 0em; + margin: 0em; + width: 12pt; + display: inline; + vertical-align: middle; +} + +.stepalternatives { + list-style-image: none; + list-style-type: none; +} + + diff --git a/SystemTap_Beginners_Guide/Common_Content/css/default.css b/SystemTap_Beginners_Guide/Common_Content/css/default.css new file mode 100644 index 00000000..bf38ebb5 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/css/default.css @@ -0,0 +1,3 @@ +@import url("common.css"); +@import url("overrides.css"); +@import url("lang.css"); diff --git a/SystemTap_Beginners_Guide/Common_Content/css/lang.css b/SystemTap_Beginners_Guide/Common_Content/css/lang.css new file mode 100644 index 00000000..81c31156 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/css/lang.css @@ -0,0 +1,2 @@ +/* place holder */ + diff --git a/SystemTap_Beginners_Guide/Common_Content/css/overrides.css b/SystemTap_Beginners_Guide/Common_Content/css/overrides.css new file mode 100644 index 00000000..895173d5 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/css/overrides.css @@ -0,0 +1,51 @@ +a:link { + color:#0066cc; +} + +a:hover, a:active { + color:#003366; +} + +a:visited { + color:#6699cc; +} + + +h1 { + color:#3c6eb4 +} + +.producttitle { + background: #3c6eb4 url(../images/h1-bg.png) top left repeat; +} + +.section h1.title { + color:#3c6eb4; +} + + +h2,h3,h4,h5,h6 { + color:#3c6eb4; +} + +table { + border:1px solid #3c6eb4; +} + +table th { + background-color:#3c6eb4; +} + + +table tr.even td { + background-color:#f5f5f5; +} + +.revhistory table th { + color:#3c6eb4; +} + +.edition { + color: #3c6eb4; +} + diff --git a/SystemTap_Beginners_Guide/Common_Content/css/print.css b/SystemTap_Beginners_Guide/Common_Content/css/print.css new file mode 100644 index 00000000..773d8ae1 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/css/print.css @@ -0,0 +1,16 @@ +@import url("common.css"); +@import url("overrides.css"); +@import url("lang.css"); + +#tocframe { + display: none; +} + +body.toc_embeded { + margin-left: 30px; +} + +.producttitle { + color: #336699; +} + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/1.png b/SystemTap_Beginners_Guide/Common_Content/images/1.png new file mode 100644 index 0000000000000000000000000000000000000000..1098dab02b1b09044b5b7c0a8ee398946c02cf68 GIT binary patch literal 690 zcmXw#ZAep57{~u^VZ-+~*wjo@D#6%9NE(ExY~-co%WWyj>@NM%2PrH;?L(+kPQxMy z3eqwQwbVJ9=*qXNO}%NT(|wqjrbc~8O-Rd-Y(3rR59b`tInVR^|9NUM(@*+(g?Rz+ zWzsY(ol$?6OiH`vS?wqt(krQqUM7>xFJ~+P9`a0`Uh8(dJAe_O6|e&Rz&oG~7z0`W z3-AVb3p4{=z<~Hm@7+KjFaf*(I>j16B)kN8U|j6&0eZz6qL~5vf2Iw1Exxw{l!|-_ zLN#=yGNO?waVQKqk`ZzKwGfR=DZ`-X!mCunqBW6;Ga3{`nJI=KmkSDopj1+f36*M! z< zVbPk;t+$TzHLp%Zr~^Zuc;_E*S?Yv^-R~yrP+pPHAET@`_+;y(BeUE7E0>dXyltn} z|Cenfzjx#W})ClNtt`w%GREso&>s)Ga+XN5x)WtGV5d zdcArv>#p(EJ@t%`))>9V@2o^}Avb!j!7jP# + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/10.png b/SystemTap_Beginners_Guide/Common_Content/images/10.png new file mode 100644 index 0000000000000000000000000000000000000000..ef058e3b08664b8692b2df6595c696a37aa39713 GIT binary patch literal 982 zcmXw04^Y!(7=9h3YlJmHg4Q)Ur99zkXA4dSJA@&Dv=)xwmn8|f4!bV7u-lR2EW~Jw zKgY!)Lr>ZUWdkR1GJnXJWBY-HV}`PEyIn)4{1a(~GZx!=+g;DS-}~M7eee4`&v);a zB4J)M;~543MCZRID8fDQzeSJ0EKtiS+#){C&KJ|^bm#0FZh#G!MTO$rP$<+3U;+36 z;AengfC+$~0LB1%0CWJO0M`Jz0R{jJ;a9xB1aJl5SAg>X7s55;VTOJHBfu}=-a&w& za1FBc0hs^i)B}*=do2LELR}=m8a!edvY{yQpczy|A>axMji%qS1$&Ve)zQod zMoJ1QnlLtRHZhs#c9g|JEi;{NX0t6^t|coARVXHtN=u`1a`0bcF)?F29vU8xk4LLk zF4syBlbM;51Yyh0wqdTQxIqxV5yTWh+$t%#MG(^%m6i6gGP^|LsH$?vWRAMJ8L4#U z#0h70wY#x#wy9~hwe@yq=N*;G)7j}cd)Cv{+BvOuUael#=@$F@7Y7FJ zljO2q|G;2)Kv63c^#?_HCno;1*;a4fd}z1(oX)>Jp0&BTwS@)$($YU(@A~R$z~>A4 z{lWG1U?30*261YI+)EssX>v`Ga6howyAWAfZz4WJj37)12Vw@Xg!l{L_eVW9ybEXF zmM_>Nj!)>ldbn)=q4-ViPq(F#L%i*k)fu(cRO|dkje1Yk)kv0j@6H_$L*|S}uQ*zo z?(q5)^L$IUL^(aJlyp;V-RdRG!p(FO9Q8Y_O(hX3iPU=Zz=6_5Hpf4;7h+v)W{tynF7UgK)Zl@WwXijIj%9B6% zN+eNnl-g4qB2FIr&7;KaFE>vJk~CY3i??c$a&O2;TEdx&3A%TU?Ko7(&lL*#vfums EU&ybzF#rGn literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/10.svg b/SystemTap_Beginners_Guide/Common_Content/images/10.svg new file mode 100644 index 00000000..84ee18fb --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/10.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/11.png b/SystemTap_Beginners_Guide/Common_Content/images/11.png new file mode 100644 index 0000000000000000000000000000000000000000..fa20ec4b4a74c2a979fe12c8c4f1f308ea6662f1 GIT binary patch literal 806 zcmV+>1KIqEP)M0ox-lt<8eGW;$)p&y z@&B-;E1ADT1f{Ho0hJaaGa(Y?Mh2O3qu`h{xF{pAe5b`U&-dfLH*cI5e&N9I&YS!F z-tT?)-g87%xk@CilpVO<$jhHZ27$Cf66pLF0A-*okO#7NRkx##DN&Z-gUE!y9MBVS z+>*kJd#Z1m60j+9`x?vxk0KI#Q8Mol7o0yaf%D}1E+nR`(Y81gQMZyQ=Luh6bQ%+YRDzb6-54!jqcP6JLAvEN#vYO2$K&TyTj$cIm}sA7mRT;m16k#nEOXZ^slYCa<|6E?cAMQ zE^v(V>UOqa3s@H!ROm6;*V^05z{(1J%ge6WC~%{{pMlj?`j(bl&qJbTy?USlj+0QT zC!7(jU0t+|jrqtGXzlK%EtT^9C+v6=NCVq02P{Yi+4gg9kNr%BZ`rJCAPYDxmDtZ@ zsN{0KTu3Bq@7V$rI)iLG-QDHO%nV-_7JRcjEf%Y}#YLk-0a3d{E|$RgFbG~-HRN}l z8^$lds>g01u>x{Y#{>5gl%pIdUO`cFo+!sIpaF8T01NVUzFgxHIKzoLW93Z_WaDxm zf(!P3wm-ths@pk{5+PO3k7AL}v$FvFIy`g{f8W`;$Q>Mn?Sj&{qhxbkMp=;w>Rd)K zU^4BvjC}RLTai4MFTv`e@I*D~d|;{vrWGm?@AyWdV!^bR&sdVZ5*d-0OEQJgDMLwS zY)qz9Hxx!=a-tGM9w?wDA^}4Rg(k=g2^b0@hlq{I;w2lC=gl@IUMz_WT9B52)=VLv kfb6rlTeJU(EANi~0(dU$Nb$TqWdHyG07*qoM6N<$f(egflmGw# literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/11.svg b/SystemTap_Beginners_Guide/Common_Content/images/11.svg new file mode 100644 index 00000000..47f0c808 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/11.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/12.png b/SystemTap_Beginners_Guide/Common_Content/images/12.png new file mode 100644 index 0000000000000000000000000000000000000000..84c132a76c709f32cc3a24caee27b834d3858765 GIT binary patch literal 953 zcmXw$3rtg27{|X+3)doU2qpz8uR%uBK_)C?F5@8sS3p>)Ra<9tY-5h5TPQ`7t%(?pu@na_&7j=X~e?|DSxN zyzGyC7=a7`@JZ*U@^KFR?;~jVPra@j!igqJNf!_VF}v^y1@M}hcUX|-a=F?8i~u(P zZUg85?gO*}+yiIwU0`$4}+W;^X`l1Nd;1bJF4NXx8!=PgqL7*2(^>}#T#a=qS*Vp%suP-X} z`TL_j#^@&q-HsiYZ2(7TCy^Xte850tWNl9pp zZ^YQcOy+Pz1ZE!P@k}u>rbCBJT<(1~`(b?iZ#g;R0)bg5H0S183JWbV*;GNnG)Ybu z7tfI7EJ;2l$vL@vjwI)CC=^dfl2RxZE?<6HQL$KFzNk_yRaP!lRV}Gh)~YINO^vmo z!KzX%*VZnpRL@#lpKG;iLqmU$j@l+B?30rlv$LD?^P3dqu-P1T`}WqB)8TM#Z@ZjM zY|{_nN58=)a*FubM<6657D-OdK`tNzhyj^Grjg$f8}jOvcd#xNn|(1o^`L+m(EjV0 z)BIef7Zt>!=H+YUw&F+Z(rcm0=BCKyZr1y8W4BnM=NqmEiJP=bjnrzrCCy&9Cr-u* z3gXD({6@Iq)fUCLK$#cAD&v3M95p#pwqM+CSN!~P&~NOR@*T^M%p3bFJE-=bJQ$hl zw-=JB`bPTlS5N+F@@KHuH6i-$hw&RLf%>t|gN?ite#!AI$6D~zi|ohYOWNwlH%xyK z17VWyK1`BIyQCf`zZZIHSXni$a}0_2gsb{g)~E2`-76op8KU>mYQKH2sKD!wUJ+g6 zSzSc5X)jti)cKx!#z2L+bv*25v-;U_SeX!W6EuY_U9YztsE^Z|pK{I!4`?KpaQy*` zywH^RVm$0izs#OYxn8;LQ#5xjtX|lkHA6clx%Nocy>mTcFGmu~WF7G=>5ECrQL-cM z*pe#PZx0Oe5?2qK|MXO6`RC?~ + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/13.png b/SystemTap_Beginners_Guide/Common_Content/images/13.png new file mode 100644 index 0000000000000000000000000000000000000000..f41ec8fa1162a9ae293a0097e33f56996ea3e4af GIT binary patch literal 1015 zcmXw14^Y!(7=E|K9891i!&!$oNTM_CAkJ;+o!i>LCH?p}haHIoffvz#8rV!2%N(OT zOjGQBa9vSYfSM#*V`F1(%Eq4=;2k39rdC)m7+~cFTW{-n?)~2HzVCa#=Xt(+zxr$< zBQoN#2mpwb>=fnVyy4%$pkWrZYA)kMdrv5lG8l{-?kpDoWh^^WDh>vNod7m~GXPxx zMu0(pc7Q7YZ2;#1E&7=n8d_1Z!}KWypr2$b)835rw*$%>D@QB@*=SAc%paq`}P0A%S3sAcoV^hYJgxT&`0nyebxtl$Vc|mX7V) zcdepgysYecZS90gbwj0^tg4#CTwgz_(M-wZQwqhDN_7+C*fEz{?ZzO<+a!61B=0sh z-o@P3_6te=N|L{kp!BKw}X*_tTxY%;gNFHXo*N?rC*uPizZt?ENqd#vl^@zG7 z)RpepcZPPT{blNF7v92;n%th1N(`dB^ z+G5)I1D@9XpA;IXO-sAAMX%6y86OExjVoDKaGc;Q$kRCQuYUW}Z;13d!-=0whr-W0 zg^Al#kiX}oL&Dh1mYwFimlh~DlafFF>`VKTGLU<>n6C_PIy2h%aC62Wts;-h>sh6H z#>#q8xO1zL+M^k_|3qP#w|w+a{AOjHY})}&VM{@farH=Zba=};>(gdg`Y6+{tdh4h z{IK{$UrKWmWjxdQGN0!9uHm_i7+q~zYv~92BYR7qZ&18m@{%-ckDU0z$INXvKb1H0 z)$$}SM|2@BL9|tQ+?uqqLAG%5*~INReC}KO&n3rHC-;7MOVeIsh^)zXzrd}oUX>vZ fQz*EMQ#-sA@{~6EPtR+Iu(co&6QZ-iqPl+oCc40i literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/13.svg b/SystemTap_Beginners_Guide/Common_Content/images/13.svg new file mode 100644 index 00000000..040dd6c9 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/13.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/14.png b/SystemTap_Beginners_Guide/Common_Content/images/14.png new file mode 100644 index 0000000000000000000000000000000000000000..c491206269ec207e3908c7d6c2b31fd8a0979780 GIT binary patch literal 933 zcmXw0YfO`86g~}MR2sH*LWV95i6p#=SYav|P=Tf}nkbgqq5T6=LBQ0h!As1yj?%bT zhSxB{4@4J5E{+xjuTY?Tr7Z|!Sg9+Mk`E9P(o)D4#8RQ2HQAH*dfs!M=XrA~#97~k z1aAxmfDlopP=fpB|0X*CS7H4xX50cw1tKY%&3-d^fB|6DiuXy=eLkNSzy#0)&<@ZA zFa+>BfCZot-~oUUU;v;2;1NK#{}tm;0Q3NZ0QUh}{W<-9hBg2LzzcuvQ-Dr?4zlS0 z`u^v92GHS;w*a6k)I}1^!7HXA8;T+inn6VrLLMx678;6GNZ83@p|qaOMl;>(*7X4N z5Q3rxLV9t;$I}2bA!yqe5MbnRjA3C$LQuVr&o^;6rjQU5AtoLVrOjNfnGpP`g%I@L zA0FP1hoq!|=;#4L@E0!#8A(ZbSx{gtDzfG0+X@P7B_*~~r~aZSJ4KBtm18Q^8;Tmo zp;kL6%28G}K~aoG!&FvIR#m;NuAaGdYo@7buBFA*)itlzyJ>pSVtMCqEKf|lpPG6< zJL_>eS6nWy+wEOgSY2LT^LW<0-n9=OurKFUHUD7OV$Mji4njmkJR&tU8&QtvLC^?0 zVhrI#{EJvw;e6c{kKHX33DczE8??Ped6N9_Af}ctJpDk(N)t!6%Rkw~-I^VvRmck| zZuR`VJ;`Ifqs!xea(_}cp3nXAWp>*;%G}UkPF~HiPH%J+e|0uH;V6@HNp&O9KAq6f zH-AROKf84O*SfziPsb#huZ&LRS!WuR{N3lC=jQ23bT((ralvOL8TV<=2`2aZ4quSH zC3s7eY#V)P6P%B64WESCuw#+4J2;)6zaFH2j%BwF4((TDawqhwoN;Mrp*v|YtazJ3 zbGSaL*{~#;8!BR^xBMoPbLCa(qCj0}<$~&D`?d0#^gSZQoz2Y#6TP0X%s)P4@IF@W zOxu35MtUU9w?3A-5V=pWGrHOEe4O{lHFGgdu9S%ahmS? + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/15.png b/SystemTap_Beginners_Guide/Common_Content/images/15.png new file mode 100644 index 0000000000000000000000000000000000000000..7656c941fd759cea1c16232498a1afc92e386a58 GIT binary patch literal 996 zcmXw1e^AnA7=OIbFT(U(QBmGzzvi~AT}ZjzWjk$nifdvh&1C}JZQsdRmeW7>L(8^Z zgZyJ=)I4`;l+i4zX=Y-gs1Sxt6MqmG%Ni3VPMOAFin3?i?Q_rjzW2WG^L##^_nudl znUNYnTTcUk2yPmOkL!m226Y9_oQ5;^aamEkmzzzcQpcb1CICY8nftO+0)fB{06oA@ z0Ji}&01pAK0~i3V0{jfn3-ACy3D5%28N9{wR)7wGet>HLw}Lr+L55}kEr2mtdl%qd zFbCOg0_gtdYy)Tyo~r=R73v}h=HM37kPStV2hE^j3qhb3QejnFXlNUiinZ;lRv|MQ z(1eDfrA~tA3hHXtuGL0IYd3A`X0v;Ou6o&Q)YTD$E<9Yfd$&F^QlFTp-?ImG@qq>g z18w&)nSDt~4_GX;ZA?fQ;Bp6eyn#c9286=F0|y3ka)xqqhe*;S5STr{NuR^9 zFf+60cKhe%{2tGe&$qm^6j)xy4#pgx`w{yaSHjQ8f|!_iL{idz#3@7QN`sy zXmRXc(kcQDkGlS{pTe8%c2^U#ro&F9S}0@KEVYMYc(c)IuQ=9PQ@5Rx^Kw&s*N(pmqpRl@Pl|5^hFpdp zmiX(M!s;1BY*}ZXe~~VB$iCkdRp3o85}RDM?_yaKtF5v-Uo^ZE<@r49>f7%omdz7P z5A~>SN+5YfdTlD@d|B9}Kv9>|n0t`8|73 + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/16.png b/SystemTap_Beginners_Guide/Common_Content/images/16.png new file mode 100644 index 0000000000000000000000000000000000000000..1f2535a7e25b2d1be027e11bda0ea943330c0ecd GIT binary patch literal 1030 zcmXw%4^WeJ7{?zS&V_6Q(y{5z<)0$NA^xc=ql?@Yjv@cOu#1108Xb{Wp3FLFB=*v# zz}0~}xQW6b5)gqw9J0v<4iLD-u}L^tFDSCZh+{0+CTu;e>vQk>{Okn|K2nTR=!fI$A$9MVPOi5Ml(;vlK|_;gxC~;$Kz=NxCc-V z&<3Ce7zStn=m+>2;5I-nz#u>!fC@n4eT(}Y0NnsX05<`ey*&e7g;szbfcxIFzXIIx z_MqA=fWH4VI{~`9`;7pY3Vl%od+-t4Pz_B{2g9JFib_?{XlU0#rJ~?}XHgd2)hw2p z!@)=zDpkW~-}PGeP^nrvUCUx=_wLmJ=z@bWf3J^EFNcEx`T_&{f`ab(`Ju0V_ijCp zho9Nc=VSN*CUY=07LyN!gbay9hKvkDR@QH^v7^V1jUGQfCK4HwlTA4}<7duHoIgJy zk(deM(Z!38uu7$qV(}zFOkTNSA&5WllF3MdAd8B~k`hubpCX8<;^L{YvMITIS|*#8 z%O97PKE|q0Jdw+v)YZ*YSI;Vy)|wh?ZS7or{WFznvA=(DV8AvqVlxhZkNlwy6RqA^SIqO-1jq2 zjN<6S&L+hr1BbI8iHb@@3Xr>q4*4CKK%OB>h|9HUn|eR~B9%h^dnrs-llF8*QWkR~ zxs^>?z9G}I9~9_%Bkb1&Sr0pm#&WLgOIb~A`MjdWone~IkF;%$R4;WEF_J$%l`G)! z1i7bnu!LN7Kw?Eq%kZV~>Y$2HY5UWd%UiG||uYHTRK`DCS zcILO9OOo(6U-YAesv7zXPYbf&z0+>X+N{pMQKQubGqQOr^H4n*@U3U;N9>xxk19-x=NHL!wc{^@hAZJ5~(zrdA@T2Qi=9dptX*KEXZQ>uL zFP*!P^Ji=IYa!oX>lU9~QtG7HAJ`T>M_x^H@8daD{VAr;uHWYeldzM0pf2M;7RDyw$}2!x;P3gFq|$31#$dahcmzX E2W3FnlK=n! literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/16.svg b/SystemTap_Beginners_Guide/Common_Content/images/16.svg new file mode 100644 index 00000000..1adc2170 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/16.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/17.png b/SystemTap_Beginners_Guide/Common_Content/images/17.png new file mode 100644 index 0000000000000000000000000000000000000000..67fe7ce52b196e57b963d49d0c4518e3c939b874 GIT binary patch literal 870 zcmXw$3rJI86vt0aZ9b;?s7z}LhAky%nj}%+W44E>r8A-|LYo#AJ#9`?r>IS_?#&gY zMM7EXoa>?a$V!`=ni?(*=1T3lK!aKj%|@oP)1V*s-jDlz=luWwdr#@^I4;A{+Yta5 zd>$tOSHFKZorX_NO<4~vw6l?XA)QWtKN(K}EEDhEC5&ELT51H)0@MLC0Xzp71ZV*0 z1*iph2+$4i3gA9KGr$Y$DekubJOda2Pyjrz*7R8w9s_g%^jmvd0XnQTsHOtY{MT#) zcxv5O0$?iiMG>sQS1dy{G({Z@gN|r~I@r?Y;elN!*x~Gq)|ljlvva4_P7R=TaZ&sG ztJ!Q!+fAdPm&UyZn7f%qx1WA4%hz}%56&6x58AT8jNlwaSlLRqIl173s z%HDU5h}>z1T6lH#}S5y?5AKz`FS;ZDZ7> zE5ZBrPc=2~`?NYn|Hb# zPg*fuM%Q;G75PZC)5)AuZhGb_RYAjMvD4b3l_t%T;vy$%yQVz%V`^BOSmKv6~&=hBk{R?WhQ=ihAQoBw?d6+yt%*G{mFl6)B#7bV>?3sc3 zw|A}^`1eYlm2FG#WLWOXgqN2cbQ$)l`jffEhxK~QVCL3V=CQZVr5y`Sw2w-PFA1cH sf|RDXhE3~tNba3a&uADqRK;!oN&B|4S|DBbrW(ft{OCB2D)MmQUom5ErT_o{ literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/17.svg b/SystemTap_Beginners_Guide/Common_Content/images/17.svg new file mode 100644 index 00000000..b0077992 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/17.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/18.png b/SystemTap_Beginners_Guide/Common_Content/images/18.png new file mode 100644 index 0000000000000000000000000000000000000000..76aa05be229a9a6a7ecc5ae9a8c41db6e0b1f8eb GIT binary patch literal 1001 zcmXw%3rt&87{|W~ebBwM_oO8eL|Nq~d z(^4cXh+!r$0U$_o@Jf z!ZoON0pRNYnrZ+|c>g>Arb1s7!5Um*8LFWv>R=djL?hI}7B!u&W-!!oaoCHpLmUnU zz&tt{O&1k49QGZJj2r_PV=^(bo=VlzX!_`A^fj>uYZ{~8%yLOp#b1ej6AxVo+Xc3951TjevQ+)muL0m5_wMnHn z%FAyaJ$egAP0eo-$?p{vcDdXklg-NIw;LOs?d@~T&2w#Scbb~+wzn^IbS!jsF7)&) zc6HtB?OjqTT>}Gdwc0&6=+kU497+hTq`u(9mAoS=_Xl-ph6xvu{#}hoh-0>xzZ>p?Bcn}g3(~+E(_-wwUa zJj;sO{`WQy#pSM#nYqh5rO3$`RR~upN5p4&S&^I6tnLw|TupH>jdt$`JCyGI#_toU zyc7lXTFR|?meYHz;S7tK_fb~mXYc&fs(rOG)1Ue7Yl6>D*NvvG?6{KF5PQn?b&-q5 zH{9nZ{V}nf;i`5J^SRg2-=q7E8 ZqE9Fvs#HVq6}$1K0|@ek + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/19.png b/SystemTap_Beginners_Guide/Common_Content/images/19.png new file mode 100644 index 0000000000000000000000000000000000000000..5f5ada0f3b60d889f3956f18db69a7785e7e690b GIT binary patch literal 1013 zcmXw%drVVj7{*^H9ngXy;-%F|M<>jPa~)o2HZwp<=E+LA4yGjvN?5isgxLKtY)4se zr^2R$Kcr1ykSMUo#SIt~gi#8Wwlphp3kdWA#F% zggzz{`50p$JRE}!dac#IzG@ar1EBHo(fIpg_+biV*w1g6P9J8mFoQNINPG4y`aVlY zz;7Jo@i4iL!O$_8y4YAfpO4`UY_{RT1p|*a#^V{eT+{jU<9z-^QqsiLs}s4olOoYn zdiqpW*3`|L(<0GqQPHeeJXcsaCzH)fB=aP>P*So$l8Yp1zJ1#)lbK1QQ6RhG`oOP5qO^^;ORx~Ou zE)`XV8boPOv#2@LDrytucGJTKqVb+pjoqUw*K$_C^r5euw*-#rT>N zI1&+MeCm>_A9{Sd4<@?kl5|Dhl4DKthV|EEA98JbyHwp#r+=s27}-h*o98HQaIO{b znZ=EnLv&B~mBD(7ic2+rrc7IM44#~mU0+A@-wO`En?qAtNzm@<1 literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/19.svg b/SystemTap_Beginners_Guide/Common_Content/images/19.svg new file mode 100644 index 00000000..ae864c48 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/19.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/2.png b/SystemTap_Beginners_Guide/Common_Content/images/2.png new file mode 100644 index 0000000000000000000000000000000000000000..8fe37095e17dd5f99d0bce329b8d2a16c1a55a91 GIT binary patch literal 808 zcmXw$eJtBS7{{MR%}=p3?1h;V{v!{LCh`2eF7j|jz7zbGMmlK0B-?a0Z0I(03!g607C#` zfHnXHfEqvq&;ihA*~RrY0KEVjfChk8OO48+&<-F27`B}41n9BUpjr!n^1o&mK(}SR z2>?@}FN$CdPO%Kt&=hqr3_79_>ij!`YG~R^rAqDXrOwV6rq9i-AE4jU6HR3#l8hi^ z?(T9+9tD|c$jL~%WK%jXPC{_goJ3AOiftW2!k<_lr$C`JeHn59vL~2 znK_w~GR@=7@cFX>!CX$xd_~2_!or2(;-$*UrRwU>RaL9CwX0(BSBYdpF4rp*dX;KZ zt^T3W{M2ff_wOo@>aMh!Q5e$?Sb{p)MzC*KpvyK@BGa^4pBO_2U$ud?DC9dvh~943?)%s%c7;}O-t(s zHyc<-WnK9bJBP*$+LBdfF3BlCbCv16l=YY`;5_tIoGjVC6Yp3rSo1F{cBgLMZ17(L z8q>d + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/20.png b/SystemTap_Beginners_Guide/Common_Content/images/20.png new file mode 100644 index 0000000000000000000000000000000000000000..5e2ad337790ee7631b0c063aa099b626029aa209 GIT binary patch literal 1121 zcmXw&drVVT9LIkxq%B4Ck99~bPm7>|B7(A+MaD`Q6lbk~EMzl)$Oa+_3G0|Rvw|!W z=oaIE1qXKGC{>;t<*`zrrM06xid`vG%G&~=KsVk{3*8yXKDqatd(Zv-zQ6D9IVtaNizhJ>I^Kz;QF1gPBIRiUA%uRc%DK7apy zU*G=d=>FK)!N9;lI(;xQaxfu59TA~UNEiwU8M=6JC?@75oBc8+MZ;ujS*+o#EM0Q4 z?#2yWdivj7q1qD<2`7?!uv&F@;e7^DV zW1~PY_w?x;8im3|q0m%YYZ8f;8XK3Jo0nT!mfPD`#Nri+#H>*Kqf)K*_O5C)>%+qv zBO@Dn{iaU0X)tU~PHv5jZBI>Y8;v{j^E(R*yXab6w3tkm;rjyC| zAkKwcFH60nWxL>}+bTubIXSW)A7l|`Zei$}S+m)Em?HL~m{WF=?uB+gsPI{8`Etf! z{yFV<^}O>)YwL*fyx`$a1AQ0Hl$MwDCW@)7XZ%@vN}F%mp}$;YTZ6Af_*2TMCUy8d z{)eS?8*%goUQ?!S|E-Sr0=K0jD^8ANqmV%BSX({Km1TPw%4)vhCQcO7pAd_pf2+Hb zb?EQry87_@xwjJHi4Nxlf8?HAn>APRr8Mo=*k5eH+-5;}I32TK)w9&^C1O9`JqAa2 zB=1Or)s9iZGgYiE{Ba6T4rLT&W|B1UW>lIcvzTwUlgk)Ajh*6Ld*6vSp!p;!?K2*2 z7Z|ww0wQxrbXOpSiiAP)TRdu?~+gNMznKq1l+j^L@b#!_n zFQYq;^8C?ddTZ5q!P1i|*Y93y{UcO9UI}F$G99&lZ7x|q8Bm&fzPzfhI(YON{)8ca zeY@iab&2=03fINpeQM>WFSHll)}BnV>(Lhhi{}<7F2pa$Z literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/20.svg b/SystemTap_Beginners_Guide/Common_Content/images/20.svg new file mode 100644 index 00000000..1678a9f0 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/20.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/21.png b/SystemTap_Beginners_Guide/Common_Content/images/21.png new file mode 100644 index 0000000000000000000000000000000000000000..cfafd1ff44753e9aac39bacf9c0fe462cf172f4f GIT binary patch literal 981 zcmXw%e@qi+7{{N|K??=%vRTU5gfapOG!BUqLSRBU)S5|4VRJ72=(_pGB4);o(n+>3 z)TD?3hqK@?5CRP5hJt0(($e46Vr!gBVIVY~MNBhv%Otv53f*IqeUf|LyZ4^^KHuk_ zw@Fg5Ga)WH4geBFyC^BH{FfJ-iIM6%a|0LV7eY}ro6VkkAf^ErR>^zS<>7F62*3d_ z2%rI&0B{5R3~&=*0ALuv1~3WmBfuztG4dAo#{difE`ZAbS0g#jh{81hGr+CLw^{&w zBnQ>50NDT6ybdrP+5ZIqU141m!5nV2?7Bqx~6iRfrFZzKpKNtysm@$n{t zFyTF)Z_3F*&t@jm%wm~I(vp;91+X$0RyNy8lGwhDB+r-R zt*yScwuN)&7S!s8ot=wn^`nlCN0%=7dwc&J9DJhFJ+WAx&&@sedjF;Az~bTyzd!i+ z@ygSuq2=Y!vuCS;z}m{nS}26$tIRkU!r|t8DXpl2)YLqrq@)u07BL}KWCocosj?BDWWM=(U)x)b4QIG@FKJ&rq{u&-)>CBpdUn!X zJlVt#ZQN{R+_O_h8?H7V|F|e!T|+6e_m*<=-cF}7?oa)riStceEB-3Tn!F$X{(Q#< zpV9bgk-S~D^w$>t$gr_6tN)_IQCgIem}YompY8;sLA#vht`ft7($??QaWB@hnl#g0 zuAPQnPoakXB(vqgnmn9LTjpK9+zamt0-dU{+nMJ-W75+eW;j*v}K!Qmn<#2`@Nj zHzjV};fs+CoZpn2oFf_Rk=h#Twn^RL9iH99Vb2K-{b@;Njj-P$Q4O5>Xk+53+{*QO z#n8hh`MR$C0$bmKV|Rklb + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/22.png b/SystemTap_Beginners_Guide/Common_Content/images/22.png new file mode 100644 index 0000000000000000000000000000000000000000..5415d358d7909460d1f5b38caed21a8e3eec0834 GIT binary patch literal 1057 zcmXw%3rv$&6vt2bgf(>3xD{5MQp!V02q26^Oe7R7gLc5mV=SUf$byK;mJx`X-~e%P zlQ;pHY=OzvPJ!_#I0}?Up-@U`i=ZHpmMRaK$YerkLHJ;>vnKoH-tXq#@0|bnpWJ&* z7!%=Ozuz7J9QcvEI9y%-n^Xe7ygNmMxDZ*#`3Y1ib!zs*834+XFe)K@cXziDKm||> z&;lR_7zU^ZPy^HeGy^CBGyv5AQh*-oUp#LE=myXM)B!YEV}`5>e*h=|wAS2qfG%qc zs!0F_{@0WNbXw0F0MHfIMG=g_Ery{Q7DXL2gB7JzD%L_N%<3SB4jK(}QMQXtM+4ms z4&6>payvV@y}jJo8SV8jnY{qL6iTnHZLg~Hv&d*q1r*fFh8I2;i%ED+p3 zeE2?>I}#8u5)mgHo2xG< zFl1*Nu3UMVm-jS3f4aDM_UhHSl9Fd7CG+Lw^A#2IRaJjhR6G}n7Hez&YHeNW=y=uH z`KqsPd0=2!qgm1EOlq}hXvi`?Zkd=^o19$J>({2H)^Qk(n+pq@FJ6$#%Ud{1rmfZ0 zZL@jXV%c6_-yzA}ogKXBq7z~ldEg3c4%1eytuy3 zz&rh$n3Ed{Up=n*V&Q~>{3p5SZmCRgviujDX}_Vi5Fdq+txx2imU#S4V+R@1j&k^W z3)+*7pYyeze({W^{(G)Ptl6KOR8ezp+0O1eKr39K-N*=w^f;A~a(*x~q&e%5*h?r# z{r&cCso+NcL5aP0e|*=I@WyY&mwXRaN;l3CXQFd|-p^94Fr+HZim>~Ko1evcde0wX jyVr+ylmiy$M7V_QwskD)h6D- literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/22.svg b/SystemTap_Beginners_Guide/Common_Content/images/22.svg new file mode 100644 index 00000000..c1f44794 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/22.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/23.png b/SystemTap_Beginners_Guide/Common_Content/images/23.png new file mode 100644 index 0000000000000000000000000000000000000000..658e22bc93fb14706e98f5c69ef04470af43a83f GIT binary patch literal 1120 zcmXw13rrJ682)Jot2AZ6Fao0mGn)-23=|8BI3RUUjTw3!+A%(doa2!=j#gmm^05HY0$>z~OKcli?Zwj9o+s2j~ZA0BGLM>D^{%1&{(Lw$BOy#M?QDtqGv} ze@+p=qwRGr0CI(N5edpcQbD={^d?Ae2Sb`Xi30G*DGolZ{3QWpvgrpwkAl_Mh%WY*TQy?bSD zZpc+P4%ba2_MmWgM}Fj%mU1gAIhibXc9#44$^!z>RXiaQQGvZaK7AxopSL$EP(i2n zlgR_Ft^<*g0}RGsZ0s`%<(aqlkiY*>Ow2HiHXI&4eD>^LnVEklCXU9(kEW-OvRFzs zdn`G5EH7_7E9;-);umbTDkn$9VyTLXR9CO6^Yhh3MVgWlO=+p7vU0MpaI&I8TUj}E z^X7C}+4Q}8vsG2|_4V^y?n@r;HJ|@REM5=@7KFkDsdP~yS(HkbB$DOc-j%_@mEqyl zk&)Gji8ZBiZG8O0Z8=H_(s^XoG+`lY1}6wAw-YikCb&al32+}JQ03|lCS zM)WJHXMLv7pZO{?GVC}wI_^X8^P?kNLg+;3LQo=%A-qOdLD1{*B*{JilXe=_pJ8jq zdz_Rr5@Bnm5mvWlWM@DA{EE}=DTw}Fk(QmE{TU_BE45{JKA~=PyYDGcvph??@HMELW6SyPj3*%X)M6{woD=LZa6IiK zWuPvt-79o|fyhDTt~x#c_PW33))}sT^X>cfK%m%uYr!6SmzQr+ zMO6LUk({vv)9IWPSp71=BZEkcs4moZ?JFI@-0WX4X-ZGf$BVi z=yfWWol+6rgd1l&yobr3T7=M^imZE)^bWw%t`bC^t-P*37;2p@QkN~MS z{RngH*EV7k{RiX6V5KYxili|6YJM_nqSFr_!nmkaO;5ms*bwy&dTl+vd~csw4ifdGZ~9h8~O9b;rA-=020dD*KX` r8XOXBf03q8G^V69DEfnI`c^-Qni?q$CgZQ6=Lg!+Fltl4>C68DDVPE# literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/23.svg b/SystemTap_Beginners_Guide/Common_Content/images/23.svg new file mode 100644 index 00000000..ea3c85ae --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/23.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/24.png b/SystemTap_Beginners_Guide/Common_Content/images/24.png new file mode 100644 index 0000000000000000000000000000000000000000..863ce3b66329e3ed335ccd67bfba8507546d4079 GIT binary patch literal 1083 zcmV-B1jPG^P)~(L^_n}MuTKq zoHL>fjL~6?+W>ELOEhsx)H}E_G4W!fgG43a!s&F5i-k-wJB&_Pb@4CDWX{CSnF=b) zD)#hzUbHLcA6Yjb^|@-!_nh~6`hMqqzxNYTN^%J$r|N)uE##W^kRKr%(Ul-VmI9^e zr6^KFQS>lU93Jawi)0&9WU~e9+73J_gzN$;vy3|~rPzBawClrp8SwAyD^pahA1Ugx z6t+e`p=)Yuq<6>pYc_EAv-|6%t{eoGU6=SQVnWedM)!3b&)Ps*dNW%0f@^u{i46d}-1`Ybqd!>;$}S*dAhQKE?IAywI)7z*kjC|EaH|TJXA;aL zG!!9tWWySs*-~v2FDWkIxu#l&yqHj#)-oGF$VMyk&G*0Hmy3VV**DDnyWe5c3;jf6 z(*V>}mDwV9wg$=fWYJs=TC)apC1~YcoVrBwYwvON%d;ePoy-3uI2)Y=z?0`PaUWh^ zNnq^?!l&o#IkPZm88cAo$TfVVUXPo*R+Rwo?Zoey=QsJh>}kH2_>9KDv2U(!z@TL; zLq`Kf>~0QFwA6!^)OmO4bmsZqC+jHm=JD2{ll<}b+!f-amGyDFeNz=p!8-ux9vI>0 z-~I&PfqN}`59K0_%iG9 ze>Fmbr%bVZ1^GNyec z2^}#TSXtuB7&sQ0uysO%R?5qjAL%h_+{kmg%(cEi7&ne=Ssg|T3F~2Gn+Iw-dcxN| zf?W+lo*3KTZtA$UKA>xAD-c@*`B*x(2{r?f-W}(KqPGBv1r$#RMQ?E$P8~bp=)R8Q zLeV#~Fqw$WH4no7c`P>~XBQJIa&|RaOyvA_{2yqEg3_gr=OF+9002ovPDHLkV1o1N B`fUIJ literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/24.svg b/SystemTap_Beginners_Guide/Common_Content/images/24.svg new file mode 100644 index 00000000..27e1d39c --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/24.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/25.png b/SystemTap_Beginners_Guide/Common_Content/images/25.png new file mode 100644 index 0000000000000000000000000000000000000000..cc23b9b2b040d8750d2dacf8b564c07eea28f77c GIT binary patch literal 1182 zcmV;P1Y!G$P)@6MiHR+=O&XifYpShlVroPL3XSEW1{1-C7OWe<pxRlhn6`#^Z98HC?0&f$fPX~bAV$x@}{ z{KXC`sv8JSsQ`Sj=S3cM-Wz4W)6~h{qqW9A4ryoxv?0hYt#T2u&Og}hrtq1y#8?&l zlL00JK@=f)dDB|n+?=KH65{Mp;tElp{gbX-h0oZr4k#8?`YTpNfs<{Or3xQUnfzbA9;PnlSQS`|v)bKp< zPpDk+4&qE&j@=d-b4RQVt0k03@4zUd{+n~>Kvmpk8E~3%b(3_NJ%%S&Cj-#l)ejic zzb!9=ZFw2|Gwi4Sw{B|Mu9_RrY3V1SsR2Fq6y*@_uoIk8`SQZA03^o6YW+D+JfyX^ zJe|hzAKKY}s?jWzsexN!`}3J>bw3V3MRfz$dWQkH^7kP7PBvmu6h{7?VEyW3o^_=X z@38Y){yI+o^gBI$BeTZU8}I^YW~9v<*YM7(IRI3C)6CZme`tL-15=!+Y1f`TO`UXJ z_wnBAn-BsrQtmf1;GJ&F?1WNyBUu2snUApdjXZ>aqu>3)Aw4@icXklANgZ_YRKXN?VDPlGe^%CIdlIk`vikuwLVI z^bABBP}I6;15%s=KGyR--08+16Qbm2rIMeOYKT+1-^04p2Pk=I1FDpaPX=(r+O+=j z7dz;eABV0yx=y@@g=>0tse_kJ;Z)glf2u<8K;^*_TKT~nM!R(U`eaU86 z1yYJ~{b97_{pvXl0Q}f?jRZ$5E8=4r7#Zh=e{xo?l%ib!990iwmsQr?aS1jTgsg8q zSnAflimC_Hpmhh}TLgJuIJN;%23imA>K2Mx3u~~6ydNH|tpsZFXY5{jA w6TaE%LHIwH<$5gH#Uv6-b~Rf}EcxyDKaRn+G6baot^fc407*qoM6N<$g2d@6EdT%j literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/25.svg b/SystemTap_Beginners_Guide/Common_Content/images/25.svg new file mode 100644 index 00000000..114e1a26 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/25.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/26.png b/SystemTap_Beginners_Guide/Common_Content/images/26.png new file mode 100644 index 0000000000000000000000000000000000000000..583fe34867df5838c9498974c194be83376683c7 GIT binary patch literal 1215 zcmV;w1VHiM z#0YA0>RKXTYpXug)<1RYgM6s1HkX31T5is=REn(Gatvvu9!MP@gb<@40-b;YPQW?5 zPan?l@SbyC>bl&%!Abwfxed>gKQw_{7fwrUi=MhFd6V zv7U(#1GyCqsfuC7!NT7>7*2J@U=RKrA#JD_Jx3Qo9Kh;}9e{ug_^SP6Fey61OvcK1 zj0T0C{t<@9{+?6CY%;JaF_whb2%LYqxN&PVU|mX4s_l+|eZbdh0m848=kr9~gP4ro zWT{f}8 zKCPe(2w8#@0nGP5|B1}|5~yox<2y$W7PEolZ83<0nv{azFy=;$3HDm!8fCp!O>Vr(3W2*T!5^07&UI)^lrw`mfs=b4>$~mK>)S(yujZ zKnh(0h1n_We{MZOz{lTS=15cEQGe4p27nM?GI|SBRV5RXUIW^_LQiYffTFep^Ku_Z zrl#^S42r_JpKs9gV;A=)#rdCQW+PX+2buQF08sH{E<%7k(?(K!GyuQ!4Tl=gXw4R( z6pg@ME$^+JMOaK;%7&aYHsquQ#Ho6(iMFnOj-TsbXYm@gZG4E5f=nVUW&j3;$NA<$ zw_XMsLo(nSqdK)blfe-BXB`|od69#sE;8ntCTf`(A>iuuL0EZ1VmE+)ZPva8u* dV##mE{{S(Z!)iax6$t + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/27.png b/SystemTap_Beginners_Guide/Common_Content/images/27.png new file mode 100644 index 0000000000000000000000000000000000000000..d1c3dfa457a01bc429499b3f136cd1a779f5399b GIT binary patch literal 1086 zcmV-E1i|}>P)A)_uuFLf1md}&v}keN>NH^B~=F;cS3IL40sT#6{-0U$_=

T6Reg<&PQ+x_Zp~=m5 zCM*U#yN^_9db*$a?>rxInbsTgkHb=inj>}W9*6@}W@6_cCj*(M{mXpPgZGzF{m3F5 zx<)j1gT%kLvTKVMl;d*h1y#okET)AMYcTmh9iN0Z+}cf(C*YhuC*Cl&_IBkUfIN&VYx!I)As_N9%KIa5^-`CzDJj zQ)oi)^7CtWeM@~oQ8R8%+|IvMo6!Qy84#)!C32V_fBqx2k1Zw;4D)S&6jzzfXYaS+ zuB^aYS4AKgX74Ab(e>Q_ZE9G>JMG?V1}qS&6^P^-FxqPl@9!I9w0+o%%seOK6O!L! z3EY(xxXO%kAD>KG;%|M{NaQck5eA0iRs&M=O5Z?sD?fs-*y2iH_LO zS-X4*>sBrSpf_~ImSfg3m!YizGxoMMvETt0skG$NGe6sMc5HYOfW$wy_%0kR6w21X zjA-9f$9CTn0CXSk>Yh1H|SRvAu_0_!jN)rG*-}LiU z-*2`&{|jqz=o)D$`QnFxnRK&S(*~5VHQ=p#oPDn~BLo~h{S$|R_OJRfr_MI7k)gAf zuQ4)uv#`8LYq|=IVWQd0^Q>M*cgIF_P2>B^e-OMl#PX#Jv+LIrV@%vm0r288)jU*j z9{{~)e=RINrDZXo#3|qdGw;1ueYl(krKNraE%hsM;&gr#Bs^qnW=G390IvR-AaeDu znGG0PhL@>}%osIj<~jAkJ>HCl8aJyST?D|1&@8)$LG#E~)XV5@BL8J%nFkuXdd|&x z1e*;)o$o)`=`-K5^Z}W2>;!E3=e!Zm#Lj`mK;-bQVWCMsU~TeqM^b3gZ#SIUcEU>s zxg%;r~3An^Ce4lYEry)9hZN + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/28.png b/SystemTap_Beginners_Guide/Common_Content/images/28.png new file mode 100644 index 0000000000000000000000000000000000000000..f5db74735d79b94cc28e231c524b218db3975ef3 GIT binary patch literal 1251 zcmV<91RVQ`P)f;5y}BL!d)(u za3QrOl&EiBzu-usoFb7axPQUMCxuX}fw2klwkRc*9p3Q5r~NYEoWD6+nuB#HF)2ae zSoXbI&^+hJrg^7t*uaEE>&lcScL4UA67PdsNUieF+J%h?8wiW<1}yy)zlwm6+O&8k z3^H{jGUQ)n;bY3>F3juczO~amM!`<%V%!NyFT_`1H>UT%fIS}4zQNl|rOPF3f28%hAEKMms z|FMNN+xHRd)d0vJX=hbc8Mz}eB4dAdd8pai$cZ!V7^7-65HS#$f}-jTPGa`?^4XkBj5V?0B6o$V#VeL9$xY;Q(vybt6QWttA+8ShXe3S+XVnT9hdpA;a8q{RfxI@A>jVrZ{r|ID4@RfJHMV zFugeMy1aS=u4@IA7w7WQQzZbb|Du`C_MM3IO~`k!sGyP!88SE-0G~f#G$6GmqX8xAftC8W70;DowS+>Z6y`9cFei$q`t@Bj9y`U{ z@EbO7T12sd2d(jkQRN(me6ICC~Q^>_H-K;yxsV(1mniUUPgv` zplIRxrkgIot_Pv^Hm|EL)i)W=0WD~r1Gr<`Zvot4?kE@x9N9GQw2)dQ5NG+`Gy+0u zmGO$xxF_MEwF?`C)TVK3GU2{fJqZ8jvRsb=dzi#xz@BEe69fJ_{ufDM%Gt=%%5wk! N002ovPDHLkV1l0HL{9(! literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/28.svg b/SystemTap_Beginners_Guide/Common_Content/images/28.svg new file mode 100644 index 00000000..d453f299 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/28.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/29.png b/SystemTap_Beginners_Guide/Common_Content/images/29.png new file mode 100644 index 0000000000000000000000000000000000000000..9a3141ec42e38c7d47f810c4962ea5ccbb5890b3 GIT binary patch literal 1212 zcmV;t1Vj6YP)_xrv-KVPA$Dsu^CPTc|Xose^@>ar1P2~sIQs1Cpp zXmX+oCyMMq6-T>kD|;i=6p;);PGx4M0&CLIKI9$?a$_*b5-7-|n-h;DX4v-ko4)xPMA27v?OfSX;!x?@^dQdOSP{;n1Q7hV*FZp9#5}YipA{DDpi%1 z@B64}?8NJn04z^QT`KU{g58; z3JrizOTw9Zn@;oR(BJHCXyeHppR#V(L7c9e0OV(;0I*?oItej0q*U2jbA-}2zo4$Q z2Y|9Q86+n}>mz8qrUFQ%Ae=XJV~n!54|A-mAD@(ryFK(fhXJrgnE+VihzH<`Yn1-0 z{urIv_0U^GyP*e3A@$8%05b_OV+N|EjAE;GB+BylQc9 zM%RAb&5_REgKh2!FI(Pg=JOLj)Aid`zUv*JdQU489v=V~2X7cj2EC?+Kow4ex-^`b zpZN&yY%N3x_~h76)VJ!7`jIg=dz(%NpVJ)iEP3cYd{T1u!jRrx6$SzP#YCZ&m%Zcx zYAV-aQWV;Lyh!V*^TEvqU~qU0_k=e@J0s=(VBl}ME-*ZLOCLay9Y#HH6nIO^+r6a# ztHn<#%34TK*1`~-sy(groOe>Ua{~#nHj?7!W4HPb&`X0Oe0cbj-h9f-pJnn#pp5F% z@+>Bku|OE2?NOvA$6>cx7Cr-nP>nSIsmLXqpaH$CB+t{#N{b6Kv%oLx-9F=tn^*~FaR aj{gBPYq;9AduP=E0000 + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/3.png b/SystemTap_Beginners_Guide/Common_Content/images/3.png new file mode 100644 index 0000000000000000000000000000000000000000..449ef5aa0579d8c65576b979909ef00d1f9a7585 GIT binary patch literal 868 zcmXw%3rtc`7{@`rvP%tF0MZVXa&##)B-$m)O0u$8UYjlTE|%_K#QXW)fxcQ|23Zj zG&|Po05BE$q6pUD6w6QzO;HEKG?B?@ie4xsC6T0Lvee1x-|=Qw*Je7sdC3yAXrWSD z7!1sV@#HQp@_>MLM+_x^l0?G%Dk@dw>8T10#SCgcKXqgz`r-vKb0?dPX|=w-+QdXH zm#bs5yI8F5h=`uZ$lmbq*F0Wda&q6{!~Hoq0~s0mLx&8F#N; z*W~3M;isqb8#XNK7rPzsxDd$Ed`=GPFfA{T=dp+fK4;&!1nqG8SvB0YpVi9l@Q$nX zjt-Mt9J%{e_Tqjh#h*&an*By`XG)zpB=y1Honc8)X*S_v@mC-Hq+!O=!x)WO*y$X& z`RdOSf#hW2^EH>f_Zn~UFAZ9mzt|rLqrxe}H1Pe^zO)cmFqNviGvCYoZYKzsV!xPy z0e_k@cyvpJ?@F@9E3o@|#Ps{|3c + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/30.png b/SystemTap_Beginners_Guide/Common_Content/images/30.png new file mode 100644 index 0000000000000000000000000000000000000000..9d3db242d900d714d68c259ffb01abdf51a22a4d GIT binary patch literal 1267 zcmV@Hp0*3y(s1f=$X#zG%7NNgn` z)Pg2hOk-4<7z=GRBqoOV=m!#`#zZjjgAv+-Mldm;(X<8rqP4rJu6Ln6#X?e0T-Q=1g!~A|TcF>5DaE@z&HH{>lz^hW$JZ#T zb`mMd7DycL{erHkHND4b2ku(Hrq_;cmAdjRka17sQFw%+S6@ET(7s>+5%Qk^%Oc6= z5EP1DkxWE_fTF#}*C;8WZWh1tczE*4gJ+O2%@dIiO~Zo{sFP*UGqMBF)F zo8@Aq%Yk<`!1cjVw2+QfO`&@0qr6hN(Xczz5GI!r21dpK*t&5o@4WnEvN+^LxMBq$ z|KfLn8r#gB5;AxJwbpx=Y zGzV9zEm4ArD=I)&%H!?)L5&|fuMyOA0LHyOZrz>&VDRrr0G`^g*0BG%`wsvv{(2Jt zi>gpousTtIi7UDX!nHjCRyBnTmxHuaJ5QHpv(BBy?a3KVoVx-*#slH~G2;(1IyDQx z@Tk}LKGT(&=+wkz-h@d7?FW-L779{gL-;H6WeF4e~*6`{6N;YI?0T2p>PlC;A3Z?)>5dcX3{jxJh zU;9d5%jF#~|pVa2h`!i+yin$wO|O#xsm zl9o6O%{@dTAjMEJOEdgIjbDBn1fVb{i!`T=TccCPd}i8m09K_tjdvqs(}|8uTu}jv z-eI;$wOiR;w%*7wfIGuUW$7aTOwRZj_xd>B^Cwy;d`fn1&LKrnc;<;507AOXg{w(! zViQ+11yZyE2j_;%EGmtA%4pnEhG$|1DZ@Kngi}jXTMtsg=+rE2m-^XVzMfZi6jHN& z0~R&Bt}|WN8JqGYi$Lq#W6W(>Qs4YLk!t9$S@^Ja8=LaoF&k`PWSlR~_Hm}`T695* z;J^!8cy@Cx4x5E(Ux2e+H)6`Q3H{wob@@pJL|U)!W1=Ml=_~9kw^JXvD@6LCG-O&4NV>Q+=AT+LSE=TS|3w!6Y7AjsWpJ-KG1t2zGILe zp!ZnqfKc>mAQ(Tl2n2 + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/31.png b/SystemTap_Beginners_Guide/Common_Content/images/31.png new file mode 100644 index 0000000000000000000000000000000000000000..9e2675da589027fb61fbb254f08b8626ff3d2cd3 GIT binary patch literal 1083 zcmV-B1jPG^P)* zq{;0)J~V&sO;VGk9rgQk&$&O&=XZa9tKVMIimRUosg8*uArs zhicp`$5;6?w7~L8azjeB+kx9*C6-9B7)unqmr@)w?haEONN=^QdOKS=w7-=)k1IQu z)YcgNahmro{)DcZ)7Ry1;;olEuv=9w1*SOl#dv`OX-3w8Yzo>2hJEDi^GE7E)OlP) z<4OLQji9aR*i;KW`<~#HuBWngiXwRJrDr+W_Z)U>$=cSEX5~dd$Zn)CS-$(_HEzy? z`0ke(QkssZ%E6UWhj7|ee9b%gj9;mCJ2>6HAOB;!h{luHR0}q%<-c7JvKyE*MF3st z$hTWfXEU?G~|ue-|t%>KOufYYwhw5yg-B+9@C-=OJwsR)=@#t1YNv$d%f zydD=dRZgDw?_qaC4R@DT`26ZE078){$3Oa(`ACe&avZ0vjM8CX85362ftH6KSRzSBYa<^X>*C2h^<|Mt z$ryn-;L&`8JM)XY{>fDU>{gYJkH5g)=6a4D@N@M2%awBHG7q^3NHJH`)S%Ur#?Mo; z0PJn9r)GzvGQ5G6b3oApMw=?9jf3rvn;;F|9d!Ad09aaCWg%Kv>B^FUl}mvXqrlsl zq1~!-;&3}B4!09tTtQ0kR=cu4+0f-1RNPLkv(|mdJfz#G>C8BuOfi1@4vD0Ox7tOW zXB{4#U*Me!V_f{9jdQY+Dv}h%~er9k? zD0(Mb6N&If{UH3G+j66}?P8LzZM&M?Pi_0{_+LwSm){_JL(~8O002ovPDHLkV1jGC B22TJ0 literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/31.svg b/SystemTap_Beginners_Guide/Common_Content/images/31.svg new file mode 100644 index 00000000..f0fdb294 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/31.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/32.png b/SystemTap_Beginners_Guide/Common_Content/images/32.png new file mode 100644 index 0000000000000000000000000000000000000000..20f1bb23c4be0b998342d05b6d54726e4693c638 GIT binary patch literal 1244 zcmV<21S9*2P)+D5`#hiL`8*#XrDQpwEUP-8yAyJHQAHX;=AkNC2x$Xs zo=-hU(SxGaB1LsWd12#1ZHk4Y;Nim0whJNO15y@fw^d5<`n8IE-z>_3w7r!Hiq2Jq z6qySY_P1WAx^xAN$M+6nFUyvy@+DxoEAd(M3q{SZKUQ3`UdR!6IM_WI~uO1dG{7RD^-2GS-k} zi(+78f-f#K&)W0bY>#fZAAkwFlYe?{2O9O!^4)|%9Y~3f;pA)2dDpcqoxD?3%izdl zFgoceHlBIRy_G({(2U*T3P$s4&3haVk55tC+(}b=FXMIxS*Zz>mgMlz8fySIKF-9E zqOB;3;ObvDICZ{hKJ%Ig^Z@Jp30-}|yz=P<09J(RIC>zL&B<0uwr8;KqqAP#edchE z9>~QMuIG==TO2I=o@rH`OSfm{VKxF%^aQ2)V9M#@*FU=f*qm%7DpC)CIYQ4TFF%bf zCX%*)2Pi51jhkW>X+VHE?)lxgu1@q1~Ar+MP-N@B~tV#bjir zuauv?hLrAZxjw;tbVNrQs66W>xI2u0n-y@^EsT=O9OpT}}vEZfDzAIo+%TS_eZ?f5^Z(A$7b&XHpP0000 + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/33.png b/SystemTap_Beginners_Guide/Common_Content/images/33.png new file mode 100644 index 0000000000000000000000000000000000000000..01407e6bcce33a033d5a1f2687655235cb70a94b GIT binary patch literal 1279 zcmVp%Cg?gVCHy z^nzleEr+eCh^|(x7yYrV+G@6CYrb$pNVDY&=iF@Q+N|}5uxtY2pLB?_3>5^q$iK_w za__@)dcoy#pZnYbMMmFu=Xt*SeZS{-&iS3+5mHL#6Uw}*1M0ny^Q&s}5V90qDMUyo z;0*lgLW(XFy#XoenrpVT%rvH$$r3!d?aLR0ke>qCGmP6NrFidbZRNMKGLX0RK)Rx8 zhmfLRhQi^|PwASvsb&9`j(aw+YRA4JsVheT$9;)U!6g*Eys3J7{frF+#D4&yW+^@i zzfkn`kxZBj9hw7i07oFU0fr0&cKa~{K|sdh zWKxsj7#z1>lK{MeN?O zE>aS*16pAj5V90049w3CpXPjfHzyn0@oPHv_!v&?+DL4)O5W1Ne8o8$TRVBT_D3#X z@1>{TjUogeZ+V6dtFp*goJ7h38+}6_qXi*Lffhps(3Qe)t7CqR6Q{4@*K_~|++J?? z4FhnicPPmFx#c=N{S#}hOG(>}J^(ykKmG1ea}GkZLNnkrGr_7_aM*1m#mBN?btW0k zB>ILteDnPU18_<{K_|Egeal^$9 zJ~`CD-67-5s^5B!^i(?lu0ap4?)i?!E1i)-8nmXpjt57^Xt>b9`Sxx`ygmwZ(%JJ` zF)K3D47@X~oiw&~($zPNBhkjL%C&4R$(=6zR2|5#s%-<7{TDepN@edGCFCwm$({ZY;$o~gQxdSM7Cc@*hkv@nn|n{9jqBm^ZJ{mOw3m@01j!3x ziHot))9=RX)66ph5^PqI6Ko85yz~!yBXYoe8JYTl{OvUj_uYa`2O&>2@2fIYTvHv; zHFXo{%gYbWD p%R@1550h}r+tX|=G4HSAe*lzj`5~v=R&xLV002ovPDHLkV1j-uRZjo_ literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/33.svg b/SystemTap_Beginners_Guide/Common_Content/images/33.svg new file mode 100644 index 00000000..f46815f7 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/33.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/34.png b/SystemTap_Beginners_Guide/Common_Content/images/34.png new file mode 100644 index 0000000000000000000000000000000000000000..ba443525397de60d9680ddd8829d281b62a0394b GIT binary patch literal 1178 zcmV;L1ZDe)P)((}@zzX%!P|-?7F3KIs zvb%>fKCo=h*|U_Tl;HpA%$#q&|9`%j`Q{rTrDQdstSUQTS&DICb%PTjx1cE{2$=z7 z1b+1)MIVahLW<_L`rYnGeTqnyVAJl8w+bQafZPcEc1bDrwKwega#;eLI}c|n7PSc} ziX$Wr^?puMEmiKu9X(4HaQ`cZN~NY82kf^*egi{7(JERG)|`!4K!E%d5WP(DdH98* zm4y>w65!ldehKw!6jVK5Moou0~F zDG5w^y!<&Z#^khbK^7q(Jv9k{(J2oeuWI-&rP!uF9TwwYS*LGTmE}|USUzbsYp~C! z&eHsS7atrukEWUT&vPYtyjA%K0JV+ZaH{q95P`A|2nq-;L1A@+laOa0eLC5npDJYFu}Xd-u{Ci3dG2Tc7T$PI7-`UnWQ1t|=c`;T6rqkDi8KXl_) zHEfA-w7g$Qe5?g$PCB3Pqrv{|suJR2BS@}7ZUNk&--Mb{5^Cr5tF&CWf?w4D7@L}* ze|Qpr-hU?yw$D7A%jUebxH=ciIX9r=(nla8oNbIH3cJlpN@6@u6s;#aBZc9KX+AyK z8MH~WS$X~W2l04SK0Eyrr5m$uE4Cz)!9Qw_W;*te3ay8^5LFx?pyBwpuA`UCHa}Suk>^L zyI&Au5r-krN1zY5C)D8D;5d5^oCF{?+QLV#JxM{1gFRb|*n8jvZ@l;r0R1DA?0R|= zw#2yL*vFmOB*n+_x$DRiX#JJ*;6ND)TBTrp8P-%N~;p{#H{XF9GjIynPChCPY$q748{Ondq3pK%(#Za4V0 zCC2eW>Ae7a>%Pjx%YU0^qG+yg5oiY9nQz8MTd3V$Ozrk!hQ_Cn670#=;2PI|)z0YT z3=J(t0a*@PP{3*TAEr#Gck+U2- z^RwA;Wa!eDY>Qq-iV&o(i6<7@T#r?In1o{0o@OhFRev4-2i3m0YR^a=uK)l507*qoM6N<$f~sL5@c;k- literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/34.svg b/SystemTap_Beginners_Guide/Common_Content/images/34.svg new file mode 100644 index 00000000..7bbdf5b9 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/34.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/35.png b/SystemTap_Beginners_Guide/Common_Content/images/35.png new file mode 100644 index 0000000000000000000000000000000000000000..21d4575cf27c655eade4585b8378e99287781f34 GIT binary patch literal 1235 zcmV;^1T6cBP)eJtsq1mY9)bCFcA~6X`vvOatVpHG||?&wy-VT z?RMMUozC%Lx6_@Sfffp>-_x8k|M`F4eCPH*LQ2VWLYY=}z;-Xe#an8N5V8tQDMLs% z;EuiWAcY4-YeI@+7i%`RPBy2Q%n&T!{LLyMnQoMJmcGJ-*2`JjQKUcA- zhmfLllEjJGn>E$8zIES*&U+T{^jmw&rKTJPvhIs~9A2Sl)fe_`ZJe}#82QgY@)XI( z5D|)2VI{&OplIX%TqSArB2)kKM0mB)q~gTkFfBvHrXG3-L|xfxA9s188j^_e)l^sk>_@q1e`eA&d!64#y^g7=mPX1DBeRb5nT)X~#MAfV%2w4TR8U;kRS3_JVqH?@t zJmElKgn#=6$#c8tzU2oX-C@U;6gAS*H)xt4me74F>pI{xWrSA7d#96ra+gN+<*{saF|2!Pj~FJRv6%)91~cfbQIN(|`g_3`fRlK`Y7 z+xYtJl`LDB!?sl=Y}(a8I5Nujr>^VqC(gFh-tA@k>(3zsEhtJjy9)?;=+3QuBG zB0>?B-+u1~VA;YPTr(V&aev?R>(A<_#Y%|d8W*5wP4O`qsdiSEK4~CvXU(9p3SZ`!*0%mU)L#)m+PW5D}k&6H#tJJyx5V_hj; zUl1vyTds(06*Uc)kP-?Wf0WHHFGrJ-;ZTHhhh0zEaHfr}ny2DQI?EoWT)ha2O=?-SibkOG;#vcq>#(?=SGSvgcTWgx`y9ApELN;IA zyQM6?%d`(@s%<^seF*g4SZ)JM0$TTN=oE@p4MZLwc|<5$wN-Iyxf5R4v$atuS_Kcr x3GbciLHIwH + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/36.png b/SystemTap_Beginners_Guide/Common_Content/images/36.png new file mode 100644 index 0000000000000000000000000000000000000000..b5402b577882bcba5d287760b826a2dd1b1e4f32 GIT binary patch literal 1286 zcmV+h1^N1kP)4?A}sehLF{0N+m+N z09WkSEu^@GqO~AJQ|rOaZBz9rrg8*NZT@7f5OOzAGDW{#Qi``O)o(ifKmy9@8jBQ@ zdKf7xrbwLZ{fwrXHncTt?743NOSc_ZE;Z#S;FuQq1iV7gYA){I+B{_eG4daQ^ams# zM?@%Em63=P0cCZKMM~OOD-XW&WO%i)GWS(s!FL{ zQHs-U)xU++F`CYHvFFIIXxfDMM;zI_vc}DG?qU=n0Jz$Fm)du}PTX;nLl>YQfqP4R z8A)~iXuch%-HLxS%(dQr)G-aSDUF)ti+Op~6S`eNo{h#gR}dFDa`Ggu_z1X+Y|W-L9Cj-?HVZ4ui<$4r;qFj?&rWv$u%vh{iV$4sxx=DDC%ZST zz-BS?`wcJqzG=lX;5UkZ&J~}8h5||o^EmY88hzc;*~7bsTj(De1)y+_9RR02lMlC5 z5z9Y{UAa8HXddf!9w88nB)iqQCcTaaM?$o8^w8ej$4D?tWoZ!~ZC}Nb;(P!yEzxFK zkZ0r6`K!F}_EGA;y##<`ww2Y-{QLbCFW{Du!41zKukJfd-JTOvz4kemul2FG$jSD# zClfX_Ap(RDe3Br8C9E%7!siV5`Qbx~o zJjo88xP+A88SwMf&sTV%C<09>5r~aZUE}M~aD+3R zHwcDR9J8%B?NRa`kB?o4nmO{z72V(7V;9(a`~t&)Fqs)XlvNmBNVL$FplB$5D|)2V>Fx^cEXGMw>Aq!tKz?j wg!f+aApD=l@_5YH!z39q_B4B#nDN)~KeEX9@Z-)i6951J07*qoM6N<$f@2|I>Hq)$ literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/36.svg b/SystemTap_Beginners_Guide/Common_Content/images/36.svg new file mode 100644 index 00000000..d364dbf5 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/36.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/37.png b/SystemTap_Beginners_Guide/Common_Content/images/37.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd99d22058220465d140e8dfe96e07e6ece25e7 GIT binary patch literal 1155 zcmV-}1bq96P)W$@?|kn&-j`CD)dBOPkjtCf9SB*Arc@%N z9k7QVjUdGcisnX&&YreIeJhPARx$-;hrX&4LLLE1Rv33cO7VVgd(*i!8E_mtnXj1D z4y16dP&hVvx2BpK`%WD2JhFl3-#WfWYRXx_wkq)`yh73HuODl1t=K?V{3jq~jpB<4 z3Pr0fJ#_Ce`SCx`u zwM6a()CD>(5AfOPU(qzlk)|pf#d%8_`0?sreDsYgRwH5{G6m($?G9qr`LiG^5PPd6tOe*ZAY?647?_`acZHinqg?!Lh@h%r z%}nRQC;Q1rGvg@A<7;m4&e4mQOvd+KDJ!J4!5PUw9E7X|`iurb<<-FR2URXyi3XUM z@p1p*GzIo7hX0-dLUSC8*Ix)F^7lIr==XTz4QNVbq72yMnUHEWVY6Du%FN)^ib4wP zSv;JYDg&7o0deE}*<^ZDX%4bK+l#&L737G5qZ0N~u^ zeuAo&EW9BDBS3L1;ojIJ?|yj+fV31dN8f&p-9@<^uB)Kw^YaF7{fj#>n-mr_jqiWy zUru*q@gkZ5DMk`fb?^sOuJsQCu)8Ritc~fBXQ?SB>YO_O=(=&22NSbP2hwRp4Jevh z&&kY4Wv_FGLBwv`NKM6d0H)^rh6-0xu|2{))Ai@_U!v2BPJtAizz2)Nv=lR~4Nh7c zoOmbakP>X0Er{@vZ#&j%nP+T5#d!IDA9?w;e#mHJz8bwE?ijX;9>xn_97u?>hb(0Ag1M<`l7 z5MSh1kDySr`b5oX!b*7kSc^+2S~dSoCcI1agYbWD%k@~dgGnsb?P&HmvF@kie*t{} Vvj + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/38.png b/SystemTap_Beginners_Guide/Common_Content/images/38.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce6027f00f136dd45e39e075d12b8a47a45255b GIT binary patch literal 1325 zcmV+|1=9M7P)iV)HY zSOcHhkfIGmtwoCJ`iiv;qvaH%nS!}%zgsGV+yZ2elJ~llV&lcicYb^<1NJq0ZHmrU zg%pLO6pmy+qxy6!8}_Vjd1wRq>vu1Zs&WLdJd*eb970jcF6>%YGin0?@l!zTV~P*M zD-^XjnhA{o`2qC zDQtUh5khE^kR8y9$bgWg$nfZI4xOd3xt(9mH{hbzGe)a}lp9(;C zpPSnqezMkkPXAcH8#PczmSn$?baMg#UY|-&pGT8|P_57mShbO$*TrBl88Iisv8W)E zX;w2GP8SDGUIw7kIl$r5fAPk`=h*n>i`bvdU~xef06VMC)9=<6Y^YXf5k@tTJtdX> zAHN!Wuf5X3msPcNItPMd-yZpsG?S5+=T2kE3;r_NakP%AQ&*xCyR!-qRh zvS#Zsia$EYrKWarZE0*+S^z+Pj+OPLc_>2g>AusHesYL|zg|Hf8^h*R^U1WPM57IA zjTn$3s)0~=ygtrdZ3SRXRyyWH1JCD90^r})&*x2~f0k&j>xf{>tZosCS_VWZ-$#a5C~8@>!)eq`cwyJN8lkAgJef>5?sp!9|MRgt6k~QV jiNu&)&7LO4{C4~wta$R#pZwFQ00000NkvXXu0mjfGeBx4 literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/38.svg b/SystemTap_Beginners_Guide/Common_Content/images/38.svg new file mode 100644 index 00000000..487e0ef3 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/38.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/39.png b/SystemTap_Beginners_Guide/Common_Content/images/39.png new file mode 100644 index 0000000000000000000000000000000000000000..d6894500c24cb449328311cd613cee515d4cf369 GIT binary patch literal 1300 zcmV+v1?&2WP)HeKP<3+dIvwPN1{!-t&Ip@pwzVpsEGv5d)CF2QYT-gEBjRaS%Ypg`bC1}cAgmeS$ z_^&>s=tI$3km5*tLw(0sbBeJn!L0iCmI@)a0%c>&+a;xV zis~^Er)EE)sisvOd+K^_Sit?y?Vc|+L5AuGw3pWW?IJ^_i!_tHm;^QkTQ94Hc8R{|=A?IODmKkmNwT+CNJQ5KuBH zpSv6r7z~EF;PEp!6ftBM0^9|;W{aCu;e500GyAQrC!XPymHhJqT?KxgFL6Z4EobzJ%)Oe>)5o&xs0^mt<2a<+#z z_P5|02m)}f_c8!Bb0#l7Ifvuzzw=DZ^hA8NB`aOp1lM)1cWv@;mTkLe;~w;Lq8 + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/4.png b/SystemTap_Beginners_Guide/Common_Content/images/4.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2634a5a8fd32537739b4f7ccf89c68658c1e7c GIT binary patch literal 794 zcmXw$dq`7Z7{=e4wP7wbow=O4Brjm*)ab^DsWUwuvo)UJ1|&AP1-cPy=)Wyas3o zCE?C1 zpL+e`#Kh{t!k?w3wbfOes^`+B6r8zdsxUkPoSl6U9`87kfixi+#DEMSGspt6yu8Ip z?Ti0rAHnyJv}abnKM|-A*urRywL=NpqojDR_^8}tb7oG)Q0`FL+IrS-%ABF?=J*N> zcFxXjl?h7{%bC9nlpBh4$J*;7b-53y44=AJ);9kBVM(VSdblIpLi_rz183d>z(!oGP+m!c>3Hdgo32G+K(9h6>V@l<);UGBGli#yB}``xr`Z3l-T4B~jr_ zI~Ai4E0o;Hjir9>(#D4k?88Nq@^E&3l+2-JX!m(DBI!t6dCYU2K&_8`ws?o((WBa9 z$vJZ&EI6AY2yqp>4$!}vkozeNxl2>uNzL$~To)zu5IllaCGw*5I SRi8LI4jzc0aDG)lZ0290OhoAb literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/4.svg b/SystemTap_Beginners_Guide/Common_Content/images/4.svg new file mode 100644 index 00000000..e6bbe8e9 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/4.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/40.png b/SystemTap_Beginners_Guide/Common_Content/images/40.png new file mode 100644 index 0000000000000000000000000000000000000000..0d3532e0f3fb9358843b01924fd57109236cc953 GIT binary patch literal 1145 zcmV-<1cv*GP)*C<_H05W$(z6r08defEjt%KVZ5Fx(^ICe?Cfq;;Dt(^#q zfYLKPM`T=Rl-)mhEWCOst}OOAEM+LQVDBD~17t>GNAsB%ZckUkRu?Wg(Sa)?g`5nh ztv&rf5@m%h(o>S`11M4H_H;Fvx1#z$q||I7h2Z1Y>nP4Wh(8$O_^UmJ&6yO>hi7YX z7r2bQ!Jn@2cGtJ~gQ2K65e}m~jSQ5vbe6J3oj?ENLloy8w6(q88YWi?rstOcs5y3& zH(z+d&b=_g6)gav>TgAU_?`ottuIHnshIn6QYn8R{Nx{e_8rf(_0c{s3c!g+^GS6k zS_7K6HU;Ri%8pzJXnV1m#CVNM6MtCj)g?!b-`|Y>2EfR~bpRZiq_X&4YfuxHIRh@M zCp=sIAf*L43|*aO^7;*nJ@f8l09J1XSXf>IU~a)@*t1e?F06^mTm=>ZIT=n~YplSx z=I7ieBgAWQmRM;i;S{f|1&qBV-#Y95V3fcZ*b1=Vo#rZ%6C8Zh_dS0ttssQeClm_b zi^TZNf)WCx3_B~fe%YA?%$f~#75P*Y9mcojCp*K5=aidc_h$p3Nr~r_n}>6=@cy$3 zKuU5v$qC`kotBbhWNR^UEHN;+Hf1X@i%K@CdV_=M@AI}FMr0Wb{wRsaueaJ2Y{XpBs^77;imnUbU{+Hm0qa-hz zpsv&T<(RQQaA}Ihsv=%G@d(XNmEh3AC;Qb8zp}WzZkK_6L(9gG$QU(c^}apMeL6zl z;LohC2XJVTm32QC27lq*-XS~pDf7q{^*WA>UZ3wo1cdKKcDj?fzkRk{6F@1^Xdcxp z^FUc^$Iy;Pu-ieX;nDV%sE%vt1A0(v2E2Pf?~TNcfMg2ymG#EP)NO&|0WaOTg`*;e;&)t*tZXpSnS)U*900000 LNkvXXu0mjfG;kDd literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/40.svg b/SystemTap_Beginners_Guide/Common_Content/images/40.svg new file mode 100644 index 00000000..bb4e1d7b --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/40.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/5.png b/SystemTap_Beginners_Guide/Common_Content/images/5.png new file mode 100644 index 0000000000000000000000000000000000000000..bc1d337020907aaa019f0c1ff30928a8f3cd726b GIT binary patch literal 853 zcmXw$Yb={#6vxl2YSqz>gp~~ym(6Wc^FhP}t4m!vlx_6|%h*QghQZLB zKCOw5NBA)=cRVz7JSJv5Az>mZX)+^YiqD_P&ermHbA0|>Vc{pCa6u$mEGk--NS4dX zbz<>qUEO+f^M+KqDV6?EskW5LtP!SO+s0XM4loIs`HIMp=(xVOz4!bIXaFA>c zJ2H*o)I7MB8JWU><)b%RJU!xb?Ot|zmIPnFwx#&FbhpoR+hy(Z@710neHaYavoZwE z&I11!TaAxU{-iR8`MM)u?VXQ1J+td%%E&odc*sSjMijSEQL5t=*9cNCI0W|Cyl;(~ zxXN%zmasO-(h8QE;BN-&C9{PYHCD=Jm&3PLi$fBvZ6eZal2zhcbrpwXB2q1t8O9MD z-~M{c&aJe>f_`MrT3}VaX0+td+04nrs-@}z7mtyWEb8pQ1zHZpLQg_C)m6X1) z{WLYpcQGfuI6_zOLYIDDoR=Rkt%;<`JELn$MPbxDp{vZIzGE(_RuG^`*+@Dy@Fhnp bt0}uj+^MRczT|7j#W4UUn#-0)WflJgtu|wI literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/5.svg b/SystemTap_Beginners_Guide/Common_Content/images/5.svg new file mode 100644 index 00000000..d8578f23 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/5.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/6.png b/SystemTap_Beginners_Guide/Common_Content/images/6.png new file mode 100644 index 0000000000000000000000000000000000000000..68cb4b61fe768ef59d3cd7d8904866760c4e6729 GIT binary patch literal 865 zcmXw$dq|T}7{=de&aau^hT6r{fnb_pIim}NPMhU)EvJjXq#_;tVW7_L^+$@z6vdLn zO2aOeT4}b4M(XEo-lpAbYNdJ0X3aIXyiaYtE&6f3b2#U`=XsuwH#dfV(3!T01^~|7 zNKP!S%)cLDk29wtuN@cr^l+|_Ac(=S!=nI{{1~1v!fLhF0JH&A0muMa0D1tP0(1aW z0@MMh0J;Dk1JnbMwp%=J0B8p226zJS+*Z?RQ;-740W`L^jQ~xy8dR$VQ2*C_3Gm8x z{tN(9p)ZPH4Q{av)zB1mFpSL34o%Ukfgn(=kxu{j7G;|l3=Ggrr8awbU@DSIB?*G` z^=-8UkW(m%_3M?kV5-1Cv{n-Ydf`uX?AwP?JN^B;wrs(i8a7+Q=W7Il9zVag(b4bY z<9m~nwIb1gSo~2W`h?@kmCspOLz$Vw+1Vq-#S`V_6BQNT%F1-5rIXdw-zzJ>S5^Ix zO7$|?R9&5sBuz@Csjbc2-EDsT`j=KaGcYheI5E-d_BUA5w{TJzS~$yi(`jm($gI2r{iz2m^3#%q(umB2B<~Z z{%e$OkNW9_gAewnNWKc%9XJPk`plV&W{G6?p#mP&MMnfLXQ|H}&I(o)4(<5RT;I|Z zG~l8WXGr_43R-^Uo9m8y6ep79+pk5@`c@c4%v@nYP29GOoYC6eRHu6-cjBrwTn8WD iQW?|5FZDCeR8B%(QhCL}l$SHu4B$raIkn*@GyeeGhkmL6 literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/6.svg b/SystemTap_Beginners_Guide/Common_Content/images/6.svg new file mode 100644 index 00000000..14d62e02 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/6.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/7.png b/SystemTap_Beginners_Guide/Common_Content/images/7.png new file mode 100644 index 0000000000000000000000000000000000000000..3b6cc7238df8a78f11150b72d7f83e22631624d8 GIT binary patch literal 742 zcmXw$dq|T}7{*_n!@1NHW2|gCjEHHGd1?Q(OPe~CZLSF=s9l_eC`QTxS?ZL)7MY4t z3Z<12L6=ri7BFmw!w=eqfec$1n^PcB<&imbxisSvL2dDtx zCrS{=aAf{{DJ1*~nl#A0DEGo5aZiyH|KAK`K_+h}a;D4YEuHFccBnc#3fNu^eNa&oNs`L?1W zTWRTRNy&U|?LtMxQhmK$r?czz8&gxxxw+rV%PzZp$LZYJ+S=XT#@5-&*4fzDh(ek8 z41|V8AzW?>qDBS~1M&s2AwQ7~#O2x((jSFCfFTm_rvg=F5vV2$#wV&=5kPcW%o@mH`(ynS9R`emA8`bM=6<+9|Oi?0eR zUfUFinY#41w@(y@Di3EcYZ!H#dkOQLFZF;6XO>b(qWLP4bZ*YV`_=q82Fc!YsAap`K$(w1s=EpqVaj)$P5vdKg* QIf?xRkx(qq^3Rw30Ua?Za{vGU literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/7.svg b/SystemTap_Beginners_Guide/Common_Content/images/7.svg new file mode 100644 index 00000000..8d71ee3a --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/7.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/8.png b/SystemTap_Beginners_Guide/Common_Content/images/8.png new file mode 100644 index 0000000000000000000000000000000000000000..b092185a744a2a3f6e256cf59506f87e2fa2bdea GIT binary patch literal 862 zcmXw$3rtc`7{@;{lQgmfE9s$RwmFv(=1QxHfeD6&K&_TdmUBHUmR4>yN7-YUt+r|_ zY&tX_k*1kunh5wnP_G)*)^I5k&1DZC#%`eCPlFpZnbs#zj-y>FxkP z;q$m69R2>jWEcE$i*pP(xSZe1mypTiPu2qi0HkX|fh1~SVW9$`4L}7@1E2xu0w@PC z0z3t%0%!&304N1`1)z2A;`(cVMgRh!4B&;crroJf4bTM8={#Eppmx@vS|xz~zh*r^ zgLC~k0H#7;6u}ytVi~HTDe7PtbVMW6`FEtj#|H(~o}TKpYtg-tO2s@{3PlH?^YYR$ z7--$(=hwVxQ*%H-i!&9P>RBvwF+@fhI2^o`kxDgsdmDG}#=w}92np#54ee$!dswU< z9`9{Lgef-m9f$KiCdMq6_sV2_mo5z|l|y-XpY!vF6^bu~gxhqNGOq!;;)Od@u>#|8}xyC~#yBPDBm zDw>mzwn%AUQZr=Pq->S6V9{|mnY7@E`Iy<9Z@ytsR*t9l`ZIMI%bPBD)|&g}x=*qW z*FC?ziN`sa?fOSsN&<%%cSdrFftA+PFH^(!7m?{&nJ9X_XJ84nAtp;<44o`b@ff0q zs1o94Bs*TY3Bb_Nlu&H$OYmL`%OH#Lbj*_3B^|SrB*SLSoTi=~i|c+xkP0dux2O z?Zhr|UP0&gUz`mqqSe7}#pi0zhMx{Iktr2N=!<_vsZMnW{n_-&;;`7IZn=Wt*vDzq kk!`fYK^jX;N*2lSVMlzqQq+By?TRe{epDQ{a + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/9.png b/SystemTap_Beginners_Guide/Common_Content/images/9.png new file mode 100644 index 0000000000000000000000000000000000000000..7706583360984a378594ca1ed66a1aef233fe6c2 GIT binary patch literal 860 zcmXw$drXpH6vhvr`H5*}y4i(vHVd<6snuXB$;g08fmoX@O}CgUE2Av(wuCIPR$G76 z)@<6vm0DWMGQ&{%M93SKIV93j7t=1@1xYhHvGv>D@7?=;=RD8z?i2~*cX`v7(E-4l z&*O@55B|3Z8h*KDm-V>OPRH^k1VMZnNazQk6bbi8b~>HTDu8Bya)25D4M01a=2 z))5`u!D4kBIADy5GO}3jlajhpQ$HL#X3EGgOQq(tG;?~oSuVHa=UXmZuoM*ZW@rDb zs~b_PN3`0JrlwJ~dbGZNlqAOthVka+3B7)zwRPHLvi0@NjgQYwOw3JA&P`4Iw%O+G z_W7Bad52^E*DvRvKRAV(KV;K5qwq{|{5}W@ibOaZ5u!jE5fU*YACVu(6f!&OwNev_ zv*hu)+a-ZZtKLX=kV1cWxBKk^0YSZ2#`~yL5zG*CACh(c)i(QPX?sQqZM;-+i7wwT zT)m;3Be<2fKP7^;G0U2%5U~7H(${d0COR%wEe{tPl$=q<_5K^QPWHMMy5!rPluX%~ zT%nMD`}>L)XRm!Zar2a9)7Kk^E3Av!bBbHUp`78U?)8HDv+sTeAn!& zxSNp66Ri$D$dB*w8WgcLS5$fYYhEgjk{ze(k#lneLQ3#&S*6pbacf9&b6AY8(INeMpvDG2ht + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/bkgrnd_greydots.png b/SystemTap_Beginners_Guide/Common_Content/images/bkgrnd_greydots.png new file mode 100644 index 0000000000000000000000000000000000000000..2333a6db928dc56f52786759d315f7be908687ca GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeG3?%1&o4*=JF&8^|hH!9j+gTe~DWM4f DOXD}+ literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/bullet_arrowblue.png b/SystemTap_Beginners_Guide/Common_Content/images/bullet_arrowblue.png new file mode 100644 index 0000000000000000000000000000000000000000..c2355345e2e68b8893abb5691945dea82572079c GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y>2qJB?xA}tvik&<|I5;?NKlFb9k_+$&ab-w5 z^Z)<_fg#`8R}Ao(1Rn~g>DZHLiFSuGo*Gp|fI z*SXwbmivS2_OpIw<^_yiK4yKBv!jvKDF-_JA(u}iNjH$=dO)f1U*&8V#-=|qpZMDd z+B#>hYrT*pTY}WOlo~g-Ju4S;@sFOuTqp)ek7nn<004yDT7QH2Pthqb5B**U#NS~0 z{qealDai=dWo%PQasZ>aCBUHPSlz>In#Zm%{1>ibPnh9i+vOVZ$uUg?hZwWb240G_ znFTNDhC@!RR$`(-0_JT5{5d72JOA4TvO~=Mh9T~XwMV$yL%v><2?Pn;Y z@(`1fJ($I%jb#7LMs|VYn|2CJ^!hf=d5lT7f4^UfeX0xvP!=XFPV=vX1a2|VL3`WQ zfSX07V+4L}qOXJ+qGDhSOYYiw9F&f!0aksNaNB!;F)Id22X?3TIAj1Paez*_n0MEB zTI~`5qcJ{wXJpF}W^Kf2P2A7!g%ZzgFx{m+=002ov JPDHLkV1kKNA&~$8 literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/dot.png b/SystemTap_Beginners_Guide/Common_Content/images/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..36a68599510b4b29c9bb5633181a2f1d28e8146c GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1h!2%=~ewuRtNHHaOySp&_Z|^^|AIOvTba4#f vxSkyG@&Bj)qW>iw7>*oxqR^@2sm#D|JWgJGR<7V|pfUzeS3j3^P6 wW>C@7zs+=Hzhr|_^t7*xAL~T|TcUtEDvVV!6ZV!=0W~pry85}Sb4q9e016x(!~g&Q literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/green.png b/SystemTap_Beginners_Guide/Common_Content/images/green.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb3c247deab027489ee3897272943da9807c187 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{M!3HGXPAxeOq*#ibJVQ8upoSx*1IXtr@Q5r1 zs=p4xj7}P}D}aKMC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6e;db&7< zaLi2Bn0@}k{LaS4Mn?0G|K*vPFYm86xc2|QMof-QN$39^DgnH$(VPtPtaZ3I)%i65 PH8Oa*`njxgN@xNAO^`Ia literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/h1-bg.png b/SystemTap_Beginners_Guide/Common_Content/images/h1-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..a2aad24b32996761bcb142b3d366b8ff1abbdff5 GIT binary patch literal 565 zcmV-50?Pe~P)2Q~Kqx`G3^T)W2OX?omx_ABPjS)~KA#-VxS- z0RcI4yJgiv4~YXtJG)r8rPJ>>Ht)Td>4K#{{J@EPAT9a*g%qD|i3c4%*nIi$Vfff| zdY-&)>6yZpPfcv-d|fZOJ;Kkt8vl4Z@rxg7GxhDKkTCs061YGO+8x;}{>v~i@02P#Uz1=Nb|2K4|2yGqbyM}}Zp;%s9Tu-Dqc@*E z4>v!_LBSS%D4M_<|^}`GT?dm+n|W4*WKCYZgb|@tLts6U@Gid$9iV@sE$8 z{N0E4uQiHUxD#z{W$PJtk?+3c=`F541DvLtN&Eb16;(gG_~C`;V72Qx3I6!8-EUS= zfg^Z-60NV;#52>mde^Udbm3}>Km4tBr`6ckFA?}32vOnn?6(vv00000NkvXXu0mjf DjiL)L literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/image_left.png b/SystemTap_Beginners_Guide/Common_Content/images/image_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e8fe7a4da8d032fe38515065e210e960e8b416c3 GIT binary patch literal 1114 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 QgEw`^RZANL(ZVz3zuOP-(EtDd literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/important.png b/SystemTap_Beginners_Guide/Common_Content/images/important.png new file mode 100644 index 0000000000000000000000000000000000000000..f7594a326c87aa0982f3db07af0b8ccf2bd98eb9 GIT binary patch literal 2080 zcmV+*2;cXKP)vO(LSjSG5)lPe z1&Ok#f>c66LKG!IR4G3YDn9}e7A;gxk%K_cg-y_=ix5Hr#3B_6vY~Mjia<*3c!^y* zp7AUm&&+%C<}H^Wc7_?xjOR@}KL6gi_nz;3@1Et}OE~A)Eiq!RJm%;#H?{qbzr0%* zWVZ+y(HA5twI{9gKjYx;pw@pbzZ*DoH;e)Rp~{azRX>0}0AJlToZZ*~Bl==LmAj@v z1ZJiF0&rIcFsSvPTWmJguIvC|+N&S}D^d9XjP3?j(+L>Smp(znmcvzsPG;vujyD^x z=>&)ves+td^y5NyZiJzU(o_OQ?A0d-)AnpL9`2=yFZoZDdjL4Z^?+3ExcsN4xcy;R*I z3b-WH!NlsqJa^r2q_qeB;2wxl0F9C%gu>0g4XX5PKaZ-n2O$(x z?m}r^xlSHNE{Rlf1$r)14+@l09t>y?^$nl@b*a8;AD9_GeOA}AV~rfO1Hm=~Bb`uv zEg)3fD6PJCz)DYo$sGU@;n)U@Tms3&3i3wIvu#2MfB0epGa7z~?*$>xsP%sNfCT_wsjfQOz0t5ouH~ZiB-EUMIubGht?|bHJs?Yzk z#sLWgMnQN1Rz3;B3y@?5ek}m%y*Cy`)3oPnIS+U^3r+p~3xCKP`UBg|p^PCEYJ(Pt zK$KJf1f08gd+rJXnuwO};~-1{xC5)Oj_i6IsbmbcZP#($_qzi}#y+~;oVo=5{in|m zSy3m=yixYjAP6GDkv;HfVF-eZt&MMWWeVB#I6@%>q8LE9^8;H-unW78gPu(wm0W>o znq}+#e)aOfqZfv^b zS~~BAptRM+;&%G8zMe1r!i!&?vx+g{U3G!Ei{*v?)Er-nz5(u~@C%Jm0@d=h$kx}ID6 zygJnY0aDYbW1EOBPkFYKO-{i!6Wc)14zIQv*@5<|+HK>WRNn>wYb%$w$p;$o>Qo~; zP}OKWHUr!Cl9=V3uInNf11dR0cDhrvQ zFFz+#4pfRK0@?Y|05)FJisCKq>t9PV$!oC9D(}3m<*Af($}Ge25vF%)XcmRI0$UU{nA@y1EQqpvf}$WIKI+< z?{nK;v$}_Wx&+`;HzpnyBqeyxvCT&v+bmv`Gs$ZZ)iwxH1YVn&r^8%!{;7X}Zwn1*M8En^g(bA$|SV*oB+TVeO-_AHjBV) zA~xHf%_O+01|}t0{c_LH_s8olY(Q47o*LlX{hn><_lt513$`Ch`??;f`vT@Eg!F7O z#<_c`rM2s9=X=MZJ9oEI_8xj>8o)=EFMnPEtnZk)r3bupv;P56oF0g+^wg~Y0000< KMNUMnLSTaIGuU + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/logo.png b/SystemTap_Beginners_Guide/Common_Content/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..66a3104e9187f4140856bec9393120c95deef9a6 GIT binary patch literal 1114 zcmV-g1f~0lP)J00001b5ch_0Itp) z=>Px#%uq~JMF2&907!xWONIbWiU3iL09l#TsMctY#c-FmaIo5Nu-kT-%YUN2f4Sa(qQ8%>$B)9|k*?LAx7we%&Y!u@ zpUUT-%jc}Z->=2juhZ+g%;mq(-@nu2zufQ0*6PpP=g;Ny*5L2o=dc^KiuEztU<-=K<*yR{`8C(V!LVvJY6LruwsskLxr)B=!t>>_~qeVT?v?V8;=*r=vw}U=6JE zYNSJ)j^1|l-tLAKTVp#tEZr~I1iOmODaJV4Xhc#><#yPE7a0G9XWlzRYuF51*=U4o z1->2j5MvGNL%MCJim(%)4)=}i;ci`0M!tsF(l8n4a{t)p5TeK4gjl8x&h9m`1NIrl zPf`CuDc3hnqAr!(x2?NkpS&c+@1;^dfI3!c{(XLarB44iZ1Nyj)OlyV7s1BP)qJi# zUaey}W3%XlmN{dEjId(HSmlD`0+#XG0C&yt;Qe$8*U$*AAB{ad|8wNrP2iAvsgwx`AXU;;RYivo9YGmdrIjh1I?urgr>*`IgCODF7oJidwyWLE8pUk%ldpT!9 zm3FF#u`}BiOIUBz{f)B`8x<8aHyTwLU#a&@#aNZCs=FI!GZu1VC54k96JOUp0V*d! z7hl2FTvlPtjdK@P5K{HAG8@{yTyKkgsl-{Sy>rgV3Fwr*vcj&c{D@=MiJZo15>*j`sA)vf&}>n~ z1yS_~y&)tn9FaJ4sDv>R5|ub3aiM=ePh1c;;6yg1Kq*8;imF1J2Q+fqkUB5#{x~=< zzw%f+N&S_4@XYMY@3Zs$&Cbq>s?uoPPbNoH^^#?bG4M@qE_Y}DS7&WzIExVnQ3u6A z<#T#Ix?Zid-Kd}eraL?1w&(p|ENf)5%!kkJCzD@?qS1HKGc);$i{`TZh&ZS^z&J35 zAqonc_g3^(;BWzMh(tzXu?MELHC|q4jCpe{pT9;fdzEE5k6|3t0UV&4y|h+jTfz;&d__#`+t4qMpo?IyHXT$A{=Nq0DN(P@5_t#0g$zsHN%LG zZ>i?M&jkbrWt{!33R?hnGRkT$ zPd9MW^O#v&WT>TuxMh)7WqN&`l;;s2>%}Y7wP2)~{j`sss}D*6lrMo7%J1%eWZ8zq z<(J5Rv49P{4E&+W!?iU$AO#Eptw7rwFJjqJ4*-~g1C#(56gOypwq=ogcZ}%Cb_56k z=YWgAC13;y1JTz8h+i2d5^4z^Jb+I{9vD;t16Y>Oo`}$U{cRFM-PnL^`~buV?QfkW z^~q&o@i4~JIRjD&AUgN)cs;Y=`^x;I|5#u3Sh+pJ%B_cZ3(sgd-9h+#AFTtOghDna zQ!zy91b{qg5|Alu7TDzYl_aYa9dKY7Bc!|9$vw`)XfNTBQ(JXnghYFocsztqcklpF zX3a1?{IWGZXEJN(c0mw{2%Q~m^z|g@O2z2xh|=BFPH#F+A|7s3@Ee2qB{nKP+9kM! zN;)$_B-}!*Ekr0}V@%yUl}ag90P0BOBbQVIu(f#rV35bx5}SXD09~1Tz@y`e=ztQI zSI0O1Y@4)>rS!;y=D_!PK% zToD~u1#zJKowx}TxfGxY6S-^#O!EK;qfBL6O96WPI}~4Un?WHu7%AIrWeUKpV+kjS zd~qtbi%piul>nxh0B|bLg?!sZ3RPM^H=0M7L~#)&svqvoWoLo(k%v~PJn%E%BI2Uz zlFt0Svq7z+#R=fbVMkXcAGnL)qT-@5SzHw}yV{{TfQpOgVFSzqE-;BNE)l&+M`rP$ zom2-f>Na>=x2F|?sycwhPZaQgASbb3r literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/note.svg b/SystemTap_Beginners_Guide/Common_Content/images/note.svg new file mode 100644 index 00000000..70e43b66 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/note.svg @@ -0,0 +1,111 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/red.png b/SystemTap_Beginners_Guide/Common_Content/images/red.png new file mode 100644 index 0000000000000000000000000000000000000000..d32d5e2e80a459c02ec55c71091350a134df7f88 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{M!3HGXPAxeOq*#ibJVQ8upoSx*1IXtr@Q5r1 zs=p4xj7}P}D}aKMC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6coc)B=- zaLi1OICS8{{LaS4M#jz`=MNk>@TI(=qn?L{hhf7a>B(=>`<`zgv9Yl+SiW`WKVr^h2Gqyk>FVdQ&MBb@0POuC A*#H0l literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/shine.png b/SystemTap_Beginners_Guide/Common_Content/images/shine.png new file mode 100644 index 0000000000000000000000000000000000000000..a18f7c4612e3315d465a3bef7efea502ce514802 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1il!8I7!~_E)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPm4=aO|paR3B4xo^{r;B3<$MxhN|NsAYQDb9koA1NJ h!}I>Z5or*|oME~shg({x5id|FgQu&X%Q~loCIGzrBEtXx literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/stock-go-back.png b/SystemTap_Beginners_Guide/Common_Content/images/stock-go-back.png new file mode 100644 index 0000000000000000000000000000000000000000..d320f26c65fcb350e5dd31541d098675b55f224d GIT binary patch literal 828 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 TZy$q!LBQbY>gTe~DWM4f70Fv> literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/title_logo.png b/SystemTap_Beginners_Guide/Common_Content/images/title_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d5182b48fa70023608282fca87b58e3176a70b09 GIT binary patch literal 13399 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 Fe*haf(E + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/warning.png b/SystemTap_Beginners_Guide/Common_Content/images/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..ce099518f3dad603c5653d163f484c435cdfd7a3 GIT binary patch literal 1340 zcmV-C1;hG@P)K~z|UwVBIL8&?#@zjMbZHIf}{NZVAA8`=^YUhN_#qEgp@ zvLID=JhnjFO{G>vD%rHqD$8yv1-5}m5mJ;L;SV5DA?gAGC77hCleDxHJAUvec;<9r zd+4S++k$&a~nRFD{yg%!u2asrS5z!Xw7Z8Evi*C})Qv7qtg z{%%06EM!gu3TYaoU`sywDF&p~<3 z><>i+iy?p8&3lePlS>0#DrF|f47safVQd}owRF)RSW2}mK7>avIEJ+a%{r+~m>+j$ zSH&-5>v-i7GOu8>58=@Uc)W@siqbVsg#*WE)8^< zuQ529TxAGwi6>Rb$e9g{Tjxv>H;5G`Z5(scKpg$OvMqm4`fnO=Dqf9hqGtEP+A<)?q2}sJByNZ4yjH zAX8E|Bt=2{_ut`-%a_3#WApwz9*&KJRkK_63S9J|{aOP&)z$&VpkZZXxMdEY`obo4 zU&G=L@{j=V_LVF6@awN|s-^~~0s+*vwIQ*wfkY%Cb^ZRo2iRUs;jNE?5LJdTewvuW zLSJAQAlDIFk%t5T@0mJl?DaE_a=cp0b%ULZsfDX7ucybiUSRu?Ge`i~`}-fM*l~)l zrS(~_P!>=p%f3RTpFfw1xf0ocl4)rvt5h^96_b&jR{~7#EHvpLk-$MBQS`Vx5!pEE zK3$=MZruc6YpJ!5!aZra04`k)s11VD3SU+gbJRux1cT4k&LFRfIck3LTo#s9sXwB& z-zy=HIZ(z}LSkbBPw(8(zq^&)>&XII4(Wff7#@5x;y!^cE2+o0D=Sk(c(bDeAYk+U z1AA*+L)l%S7t3MY(|(X)nDz=ApyX5{yge? zdR*nQo5n4p{=HAnBG}|}oILRUMN6!vvC(m!V2clpz2_`(0nlM#z*DUtJlfzGHgfy6 zCH7=y#!-&i79ZN}_xy*-$mbtCA>d;Gr}JS^C2+PQfcRP(ds_!mH`(9XLh|YF@YdB~ z=jEUH_4;*e&d*Cj7TxO;M}-id5i=Jpf@OA9Jp3_&ZHKFUrz!@?;HV<96+Zz0f!3*6 z1`RXVFr9d+6ARQ7Y7);sCzA_9mtT)$ZPXM;IRB1=RP&+mB+Cb~n ztYFWO#n}^p4L133>Dv+f!QTsi-bdd}I{B1Yy2^K>D**JRv z!4~(<7K3E4^Ri=J#hg|5H9Wrc0?e$>B1A{KgZ$!=^bcgGX3kD1Rwp?s*yFB{tHTy4 zo>fZO@nEdn+3DDYv%h(IP6!N|2Uul9Qjmb;p2^=lJ*NmU2&yD(w)iCj2{`zl3CMQ? y{@GlwveX80`!E9K{%+7y literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/warning.svg b/SystemTap_Beginners_Guide/Common_Content/images/warning.svg new file mode 100644 index 00000000..5f2612c4 --- /dev/null +++ b/SystemTap_Beginners_Guide/Common_Content/images/warning.svg @@ -0,0 +1,89 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/Common_Content/images/watermark-draft.png b/SystemTap_Beginners_Guide/Common_Content/images/watermark-draft.png new file mode 100644 index 0000000000000000000000000000000000000000..0ead5af8bb8848a33500be3d5124c19a424bb7c8 GIT binary patch literal 25365 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 z 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 JQLhG#_&=c>l)wN0 literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/Common_Content/images/yellow.png b/SystemTap_Beginners_Guide/Common_Content/images/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..223865d77fa58ac297d7db7f953197ca1fe96853 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{M!3HGXPAxeOq*#ibJVQ8upoSx*1IXtr@Q5r1 zs=p4xj7}P}D}aKMC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6e;c)B=- zaLi2JaY6mh{LaS4Mn>(A|LvKXFWa+xd~ZLe)tf2yo4wI@`?$y*dl`0bF-lNb@aF|k OAA_f>pUXO@geCwdnKlgo literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/SystemTap_Beginners_Guide-Preface.html b/SystemTap_Beginners_Guide/SystemTap_Beginners_Guide-Preface.html new file mode 100644 index 00000000..9ea6eb46 --- /dev/null +++ b/SystemTap_Beginners_Guide/SystemTap_Beginners_Guide-Preface.html @@ -0,0 +1,90 @@ + + +Preface

Product SiteDocumentation Site

Preface

+ +

1. Document Conventions

+ This manual uses several conventions to highlight certain words and phrases and draw attention to specific pieces of information. +
+ In PDF and paper editions, this manual uses typefaces drawn from the Liberation Fonts set. The Liberation Fonts set is also used in HTML editions if the set is installed on your system. If not, alternative but equivalent typefaces are displayed. Note: Red Hat Enterprise Linux 5 and later includes the Liberation Fonts set by default. +

1.1. Typographic Conventions

+ Four typographic conventions are used to call attention to specific words and phrases. These conventions, and the circumstances they apply to, are as follows. +
+ Mono-spaced Bold +
+ Used to highlight system input, including shell commands, file names and paths. Also used to highlight keycaps and key combinations. For example: +
+ To see the contents of the file my_next_bestselling_novel in your current working directory, enter the cat my_next_bestselling_novel command at the shell prompt and press Enter to execute the command. +
+ The above includes a file name, a shell command and a keycap, all presented in mono-spaced bold and all distinguishable thanks to context. +
+ Key combinations can be distinguished from keycaps by the hyphen connecting each part of a key combination. For example: +
+ Press Enter to execute the command. +
+ Press Ctrl+Alt+F2 to switch to the first virtual terminal. Press Ctrl+Alt+F1 to return to your X-Windows session. +
+ The first paragraph highlights the particular keycap to press. The second highlights two key combinations (each a set of three keycaps with each set pressed simultaneously). +
+ If source code is discussed, class names, methods, functions, variable names and returned values mentioned within a paragraph will be presented as above, in mono-spaced bold. For example: +
+ File-related classes include filesystem for file systems, file for files, and dir for directories. Each class has its own associated set of permissions. +
+ Proportional Bold +
+ This denotes words or phrases encountered on a system, including application names; dialog box text; labeled buttons; check-box and radio button labels; menu titles and sub-menu titles. For example: +
+ Choose System → Preferences → Mouse from the main menu bar to launch Mouse Preferences. In the Buttons tab, click the Left-handed mouse check box and click Close to switch the primary mouse button from the left to the right (making the mouse suitable for use in the left hand). +
+ To insert a special character into a gedit file, choose Applications → Accessories → Character Map from the main menu bar. Next, choose Search → Find… from the Character Map menu bar, type the name of the character in the Search field and click Next. The character you sought will be highlighted in the Character Table. Double-click this highlighted character to place it in the Text to copy field and then click the Copy button. Now switch back to your document and choose Edit → Paste from the gedit menu bar. +
+ The above text includes application names; system-wide menu names and items; application-specific menu names; and buttons and text found within a GUI interface, all presented in proportional bold and all distinguishable by context. +
+ Mono-spaced Bold Italic or Proportional Bold Italic +
+ Whether mono-spaced bold or proportional bold, the addition of italics indicates replaceable or variable text. Italics denotes text you do not input literally or displayed text that changes depending on circumstance. For example: +
+ To connect to a remote machine using ssh, type ssh username@domain.name at a shell prompt. If the remote machine is example.com and your username on that machine is john, type ssh john@example.com. +
+ The mount -o remount file-system command remounts the named file system. For example, to remount the /home file system, the command is mount -o remount /home. +
+ To see the version of a currently installed package, use the rpm -q package command. It will return a result as follows: package-version-release. +
+ Note the words in bold italics above — username, domain.name, file-system, package, version and release. Each word is a placeholder, either for text you enter when issuing a command or for text displayed by the system. +
+ Aside from standard usage for presenting the title of a work, italics denotes the first use of a new and important term. For example: +
+ Publican is a DocBook publishing system. +

1.2. Pull-quote Conventions

+ Terminal output and source code listings are set off visually from the surrounding text. +
+ Output sent to a terminal is set in mono-spaced roman and presented thus: +
books        Desktop   documentation  drafts  mss    photos   stuff  svn
+books_tests  Desktop1  downloads      images  notes  scripts  svgs
+ Source-code listings are also set in mono-spaced roman but add syntax highlighting as follows: +
package org.jboss.book.jca.ex1;
+
+import javax.naming.InitialContext;
+
+public class ExClient
+{
+   public static void main(String args[]) 
+       throws Exception
+   {
+      InitialContext iniCtx = new InitialContext();
+      Object         ref    = iniCtx.lookup("EchoBean");
+      EchoHome       home   = (EchoHome) ref;
+      Echo           echo   = home.create();
+
+      System.out.println("Created Echo");
+
+      System.out.println("Echo.echo('Hello') = " + echo.echo("Hello"));
+   }
+}

1.3. Notes and Warnings

+ Finally, we use three visual styles to draw attention to information that might otherwise be overlooked. +

Note

+ Notes are tips, shortcuts or alternative approaches to the task at hand. Ignoring a note should have no negative consequences, but you might miss out on a trick that makes your life easier. +

Important

+ Important boxes detail things that are easily missed: configuration changes that only apply to the current session, or services that need restarting before an update will apply. Ignoring a box labeled 'Important' will not cause data loss but may cause irritation and frustration. +

Warning

+ Warnings should not be ignored. Ignoring warnings will most likely cause data loss. +
diff --git a/SystemTap_Beginners_Guide/appe-Publican-Revision_History.html b/SystemTap_Beginners_Guide/appe-Publican-Revision_History.html new file mode 100644 index 00000000..d8c27de5 --- /dev/null +++ b/SystemTap_Beginners_Guide/appe-Publican-Revision_History.html @@ -0,0 +1,12 @@ + + +Appendix A. Revision History

Product SiteDocumentation Site

Revision History

+
Revision History
Revision 2.0Mon Jul 20 2009Don Domingo
+
includes 5.4 minor updates and additional script "dropwatch.stp"
+ +
Revision 1.0Wed Jun 17 2009Don Domingo
+
Building+pushing to RHEL
+ +
+ +
diff --git a/SystemTap_Beginners_Guide/arrayoperators.html b/SystemTap_Beginners_Guide/arrayoperators.html new file mode 100644 index 00000000..7a556fe6 --- /dev/null +++ b/SystemTap_Beginners_Guide/arrayoperators.html @@ -0,0 +1,13 @@ + + +3.5. Array Operations in SystemTap

Product SiteDocumentation Site

3.5. Array Operations in SystemTap

+ This section enumerates some of the most commonly used array operations in SystemTap. +

3.5.1. Assigning an Associated Value

+ Use = to set an associated value to indexed unique pairs, as in: +
array_name[index_expression] = value
+ Example 3.13, “Basic Array Statements” shows a very basic example of how to set an explicit associated value to a unique key. You can also use a handler function as both your index_expression and value. For example, you can use arrays to set a timestamp as the associated value to a process name (which you wish to use as your unique key), as in: +
Example 3.14. Associating Timestamps to Process Names
foo[tid()] = gettimeofday_s()

+ Whenever an event invokes the statement in Example 3.14, “Associating Timestamps to Process Names”, SystemTap returns the appropriate tid() value (i.e. the ID of a thread, which is then used as the unique key). At the same time, SystemTap also uses the function gettimeofday_s() to set the corresponding timestamp as the associated value to the unique key defined by the function tid(). This creates an array composed of key pairs containing thread IDs and timestamps. +
+ In this same example, if tid() returns a value that is already defined in the array foo, the operator will discard the original associated value to it, and replace it with the current timestamp from gettimeofday_s(). +
diff --git a/SystemTap_Beginners_Guide/arrayops-aggregates.html b/SystemTap_Beginners_Guide/arrayops-aggregates.html new file mode 100644 index 00000000..5b6c6d71 --- /dev/null +++ b/SystemTap_Beginners_Guide/arrayops-aggregates.html @@ -0,0 +1,42 @@ + + +3.5.7. Computing for Statistical Aggregates

Product SiteDocumentation Site

3.5.7. Computing for Statistical Aggregates

+ Statistical aggregates are used to collect statistics on numerical values where it is important to accumulate new data quickly and in large volume (i.e. storing only aggregated stream statistics). Statistical aggregates can be used in global variables or as elements in an array. +
+ To add value to a statistical aggregate, use the operator <<< value. +
Example 3.21. stat-aggregates.stp
global reads
+probe vfs.read
+{
+  reads[execname()] <<< count
+}

+ In Example 3.21, “stat-aggregates.stp”, the operator <<< count stores the amount returned by count to to the associated value of the corresponding execname() in the reads array. Remember, these values are stored; they are not added to the associated values of each unique key, nor are they used to replace the current associated values. In a manner of speaking, think of it as having each unique key (execname()) having multiple associated values, accumulating with each probe handler run. +

Note

+ In the context of Example 3.21, “stat-aggregates.stp”, count returns the amount of data read by the returned execname() to the virtual file system. +
+ To extract data collected by statistical aggregates, use the syntax format @extractor(variable/array index expression). extractor can be any of the following integer extractors: +
count
+ Returns the number of all values stored into the variable/array index expression. Given the sample probe in Example 3.21, “stat-aggregates.stp”, the expression @count(reads[execname()]) will return how many values are stored in each unique key in array reads. +
sum
+ Returns the sum of all values stored into the variable/array index expression. Again, given sample probe in Example 3.21, “stat-aggregates.stp”, the expression @sum(reads[execname()]) will return the total of all values stored in each unique key in array reads. +
min
+ Returns the smallest among all the values stored in the variable/array index expression. +
max
+ Returns the largest among all the values stored in the variable/array index expression. +
avg
+ Returns the average of all values stored in the variable/array index expression. +
+ When using statistical aggregates, you can also build array constructs that use multiple index expressions (to a maximum of 5). This is helpful in capturing additional contextual information during a probe. For example: +
Example 3.22. Multiple Array Indexes
global reads
+probe vfs.read
+{
+  reads[execname(),pid()] <<< 1
+}
+probe timer.s(3)
+{
+  foreach([var1,var2] in reads)
+    printf("%s (%d) : %d \n", var1, var2, @count(reads[var1,var2]))
+}

+ In Example 3.22, “Multiple Array Indexes”, the first probe tracks how many times each process performs a VFS read. What makes this different from earlier examples is that this array associates a performed read to both a process name and its corresponding process ID. +
+ The second probe in Example 3.22, “Multiple Array Indexes” demonstrates how to process and print the information collected by the array reads. Note how the foreach statement uses the same number of variables (i.e. var1 and var2) contained in the first instance of the array reads from the first probe. +
diff --git a/SystemTap_Beginners_Guide/arrayops-conditionals.html b/SystemTap_Beginners_Guide/arrayops-conditionals.html new file mode 100644 index 00000000..521612ad --- /dev/null +++ b/SystemTap_Beginners_Guide/arrayops-conditionals.html @@ -0,0 +1,43 @@ + + +3.5.6. Using Arrays in Conditional Statements

Product SiteDocumentation Site

3.5.6. Using Arrays in Conditional Statements

+ You can also use associative arrays in if statements. This is useful if you want to execute a subroutine once a value in the array matches a certain condition. Consider the following example: +
Example 3.19. vfsreads-print-if-1kb.stp
global reads
+probe vfs.read
+{
+  reads[execname()] ++
+}
+
+probe timer.s(3)
+{
+  printf("=======\n")
+  foreach (count in reads-)
+    if (reads[count] >= 1024)
+      printf("%s : %dkB \n", count, reads[count]/1024)
+    else
+      printf("%s : %dB \n", count, reads[count])
+}

+ Every three seconds, Example 3.19, “vfsreads-print-if-1kb.stp” prints out a list of all processes, along with how many times each process performed a VFS read. If the associated value of a process name is equal or greater than 1024, the if statement in the script converts and prints it out in kB. +
Testing for Membership
+ You can also test whether a specific unique key is a member of an array. Further, membership in an array can be used in if statements, as in: +
if([index_expression] in array_name) statement
+ To illustrate this, consider the following example: +
Example 3.20. vfsreads-stop-on-stapio2.stp
global reads
+
+probe vfs.read
+{
+  reads[execname()] ++
+}
+
+probe timer.s(3)
+{
+  printf("=======\n")
+  foreach (count in reads+)
+    printf("%s : %d \n", count, reads[count])
+  if(["stapio"] in reads) {
+    printf("stapio read detected, exiting\n")
+    exit()
+  }
+}

+ The if(["stapio"] in reads) statement instructs the script to print stapio read detected, exiting once the unique key stapio is added to the array reads. +
diff --git a/SystemTap_Beginners_Guide/arrayops-deleting.html b/SystemTap_Beginners_Guide/arrayops-deleting.html new file mode 100644 index 00000000..acfbba3e --- /dev/null +++ b/SystemTap_Beginners_Guide/arrayops-deleting.html @@ -0,0 +1,44 @@ + + +3.5.5. Clearing/Deleting Arrays and Array Elements

Product SiteDocumentation Site

3.5.5. Clearing/Deleting Arrays and Array Elements

+ Sometimes, you may need to clear the associated values in array elements, or reset an entire array for re-use in another probe. Example 3.17, “cumulative-vfsreads.stp” in Section 3.5.4, “Processing Multiple Elements in an Array” allows you to track how the number of VFS reads per process grows over time, but it does not show you the number of VFS reads each process makes per 3-second period. +
+ To do that, you will need to clear the values accumulated by the array. You can accomplish this using the delete operator to delete elements in an array, or an entire array. Consider the following example: +
Example 3.18. noncumulative-vfsreads.stp
global reads
+probe vfs.read
+{
+  reads[execname()] ++
+}
+probe timer.s(3)
+{
+  foreach (count in reads)
+    printf("%s : %d \n", count, reads[count])
+  delete reads
+}

+ In Example 3.18, “noncumulative-vfsreads.stp”, the second probe prints the number of VFS reads each process made within the probed 3-second period only. The delete reads statement clears the reads array within the probe. +

Note

+ You can have multiple array operations within the same probe. Using the examples from Section 3.5.4, “Processing Multiple Elements in an Array” and Section 3.5.5, “Clearing/Deleting Arrays and Array Elements” , you can track the number of VFS reads each process makes per 3-second period and tally the cumulative VFS reads of those same processes. Consider the following example: +
global reads, totalreads
+
+probe vfs.read
+{
+  reads[execname()] ++
+  totalreads[execname()] ++
+}
+
+probe timer.s(3)
+{
+  printf("=======\n")
+  foreach (count in reads-)
+    printf("%s : %d \n", count, reads[count])
+  delete reads
+}
+
+probe end
+{
+  printf("TOTALS\n")
+  foreach (total in totalreads-)
+    printf("%s : %d \n", total, totalreads[total])
+}
+ In this example, the arrays reads and totalreads track the same information, and are printed out in a similar fashion. The only difference here is that reads is cleared every 3-second period, whereas totalreads keeps growing. +
diff --git a/SystemTap_Beginners_Guide/arrayops-foreach.html b/SystemTap_Beginners_Guide/arrayops-foreach.html new file mode 100644 index 00000000..1464e7a7 --- /dev/null +++ b/SystemTap_Beginners_Guide/arrayops-foreach.html @@ -0,0 +1,30 @@ + + +3.5.4. Processing Multiple Elements in an Array

Product SiteDocumentation Site

3.5.4. Processing Multiple Elements in an Array

+ Once you've collected enough information in an array, you will need to retrieve and process all elements in that array to make it useful. Consider Example 3.16, “vfsreads.stp”: the script collects information about how many VFS reads each process performs, but does not specify what to do with it. The obvious means for making Example 3.16, “vfsreads.stp” useful is to print the key pairs in the array reads, but how? +
+ The best way to process all key pairs in an array (as an iteration) is to use the foreach statement. Consider the following example: +
Example 3.17. cumulative-vfsreads.stp
global reads
+probe vfs.read
+{
+  reads[execname()] ++
+}
+probe timer.s(3)
+{
+  foreach (count in reads)
+    printf("%s : %d \n", count, reads[count])
+}

+ In the second probe of Example 3.17, “cumulative-vfsreads.stp”, the foreach statement uses the variable count to reference each iteration of a unique key in the array reads. The reads[count] array statement in the same probe retrieves the associated value of each unique key. +
+ Given what we know about the first probe in Example 3.17, “cumulative-vfsreads.stp”, the script prints VFS-read statistics every 3 seconds, displaying names of processes that performed a VFS-read along with a corresponding VFS-read count. +
+ Now, remember that the foreach statement in Example 3.17, “cumulative-vfsreads.stp” prints all iterations of process names in the array, and in no particular order. You can instruct the script to process the iterations in a particular order by using + (ascending) or - (descending). In addition, you can also limit the number of iterations the script needs to process with the limit value option. +
+ For example, consider the following replacement probe: +
probe timer.s(3)
+{
+  foreach (count in reads- limit 10)
+    printf("%s : %d \n", count, reads[count])
+}
+ This foreach statement instructs the script to process the elements in the array reads in descending order (of associated value). The limit 10 option instructs the foreach to only process the first ten iterations (i.e. print the first 10, starting with the highest value). +
diff --git a/SystemTap_Beginners_Guide/arrayops-increment.html b/SystemTap_Beginners_Guide/arrayops-increment.html new file mode 100644 index 00000000..ecfdfc2b --- /dev/null +++ b/SystemTap_Beginners_Guide/arrayops-increment.html @@ -0,0 +1,12 @@ + + +3.5.3. Incrementing Associated Values

Product SiteDocumentation Site

3.5.3. Incrementing Associated Values

+ Use ++ to increment the associated value of a unique key in an array, as in: +
array_name[index_expression] ++
+ Again, you can also use a handler function for your index_expression. For example, if you wanted to tally how many times a specific process performed a read to the virtual file system (using the event vfs.read), you can use the following probe: +
Example 3.16. vfsreads.stp
probe vfs.read
+{
+  reads[execname()] ++
+}

+ In Example 3.16, “vfsreads.stp”, the first time that the probe returns the process name gnome-terminal (i.e. the first time gnome-terminal performs a VFS read), that process name is set as the unique key gnome-terminal with an associated value of 1. The next time that the probe returns the process name gnome-terminal, SystemTap increments the associated value of gnome-terminal by 1. SystemTap performs this operation for all process names as the probe returns them. +
diff --git a/SystemTap_Beginners_Guide/arrayops-readvalues.html b/SystemTap_Beginners_Guide/arrayops-readvalues.html new file mode 100644 index 00000000..565fab54 --- /dev/null +++ b/SystemTap_Beginners_Guide/arrayops-readvalues.html @@ -0,0 +1,11 @@ + + +3.5.2. Reading Values From Arrays

Product SiteDocumentation Site

3.5.2. Reading Values From Arrays

+ You can also read values from an array the same way you would read the value of a variable. To do so, include the array_name[index_expression] statement as an element in a mathematical expression. For example: +
Example 3.15. Using Array Values in Simple Computations
delta = gettimeofday_s() - foo[tid()]

+ This example assumes that the array foo was built using the construct in Example 3.14, “Associating Timestamps to Process Names” (from Section 3.5.1, “Assigning an Associated Value”). This sets a timestamp that will serve as a reference point, to be used in computing for delta. +
+ The construct in Example 3.15, “Using Array Values in Simple Computations” computes a value for the variable delta by subtracting the associated value of the key tid() from the current gettimeofday_s(). The construct does this by reading the value of tid() from the array. This particular construct is useful for determining the time between two events, such as the start and completion of a read operation. +

Note

+ If the index_expression cannot find the unique key, it returns a value of 0 (for numerical operations, such as Example 3.15, “Using Array Values in Simple Computations”) or a null/empty string value (for string operations) by default. +
diff --git a/SystemTap_Beginners_Guide/associativearrays.html b/SystemTap_Beginners_Guide/associativearrays.html new file mode 100644 index 00000000..61a971fe --- /dev/null +++ b/SystemTap_Beginners_Guide/associativearrays.html @@ -0,0 +1,15 @@ + + +3.4. Associative Arrays

Product SiteDocumentation Site

3.4. Associative Arrays

+ SystemTap also supports the use of associative arrays. While an ordinary variable represents a single value, associative arrays can represent a collection of values. Simply put, an associative array is a collection of unique keys; each key in the array has a value associated with it. +
+ Since associative arrays are normally processed in multiple probes (as we will demonstrate later), they should be declared as global variables in the SystemTap script. The syntax for accessing an element in an associative array is similar to that of awk, and is as follows: +
array_name[index_expression]
+ Here, the array_name is any arbitrary name the array uses. The index_expression is used to refer to a specific unique key in the array. To illustrate, let us try to build an array named foo that specifies the ages of three people (i.e. the unique keys): tom, dick, and harry. To assign them the ages (i.e. associated values) of 23, 24, and 25 respectively, we'd use the following array statements: +
Example 3.13. Basic Array Statements
foo["tom"] = 23
+foo["dick"] = 24
+foo["harry"] = 25

+ You can specify up to nine index expressons in an array statement, each one delimited by a comma (,). This is useful if you wish to have a key that contains multiple pieces of information. The following line from disktop.stp uses 5 elements for the key: process ID, executable name, user ID, parent process ID, and string "W". It associates the value of devname with that key. +
device[pid(),execname(),uid(),ppid(),"W"] = devname

Important

+ All associate arrays must be declared as global, regardless of whether the associate array is used in one or multiple probes. +
diff --git a/SystemTap_Beginners_Guide/commandlineargssect.html b/SystemTap_Beginners_Guide/commandlineargssect.html new file mode 100644 index 00000000..69890c82 --- /dev/null +++ b/SystemTap_Beginners_Guide/commandlineargssect.html @@ -0,0 +1,8 @@ + + +3.3.4. Command-Line Arguments

Product SiteDocumentation Site

3.3.4. Command-Line Arguments

+ You can also allow a SystemTap script to accept simple command-line arguments using a $ or @ immediately followed by the number of the argument on the command line. Use $ if you are expecting the user to enter an integer as a command-line argument, and @ if you are expecting a string. +
Example 3.12. commandlineargs.stp
probe kernel.function(@1) { }
+probe kernel.function(@1).return { }

+ Example 3.12, “commandlineargs.stp” is similar to Example 3.1, “wildcards.stp”, except that it allows you to pass the kernel function to be probed as a command-line argument (as in stap commandlineargs.stp kernel function). You can also specify the script to accept multiple command-line arguments, noting them as @1, @2, and so on, in the order they are entered by the user. +
diff --git a/SystemTap_Beginners_Guide/cross-compiling.html b/SystemTap_Beginners_Guide/cross-compiling.html new file mode 100644 index 00000000..8edd186a --- /dev/null +++ b/SystemTap_Beginners_Guide/cross-compiling.html @@ -0,0 +1,59 @@ + + +2.2. Generating Instrumentation for Other Computers

Product SiteDocumentation Site

2.2. Generating Instrumentation for Other Computers

+ When users run a SystemTap script, SystemTap builds a kernel module out of that script. SystemTap then loads the module into the kernel, allowing it to extract the specified data directly from the kernel (refer to Procedure 3.1, “SystemTap Session” in Section 3.1, “Architecture” for more information). +
+ Normally, however, SystemTap scripts can only be run on systems where SystemTap is deployed (as in Section 2.1, “Installation and Setup”). This could mean that if you want to run SystemTap on ten systems, you would need to deploy SystemTap on all those systems. In some cases, this may be neither feasible nor desired. For instance, corporate policy may prohibit an administrator from installing RPMs that provide compilers or debug information on specific machines, which will prevent the deployment of SystemTap. +
+ To work around this, you can resort to cross-instrumentation. Cross-instrumentation is the process of generating SystemTap instrumentation module from a SystemTap script on one computer to be used on another computer. This process offers the following benefits: +
  • + The kernel information packages for various machines can be installed on a single host machine. +
  • + Each target machine only needs one RPM to be installed to use the generated SystemTap instrumentation module: systemtap-runtime. +

Note

+ For the sake of simplicity, we will be using the following terms throughout this section: +
  • + + + instrumentation module — the kernel module built from a SystemTap script; i.e. the SystemTap module is built on the host system, and will be loaded on the target kernel of target system. +
  • + + + host system — the system on which you compile the instrumentation modules (from SystemTap scripts), to be loaded on target systems. +
  • + + + target system — the system for which you are building the instrumentation module (from SystemTap scripts). +
  • + + + target kernel — the kernel of the target system. This is the kernel on which you wish to load/run the instrumentation module. +
Procedure 2.1. Configuring a Host System and Target Systems
  1. + Install the systemtap-runtime RPM on each target system. +
  2. + Determine the kernel running on each target system by running uname -r on each target system. +
  3. + Install SystemTap on the host system. You will be building the instrumentation module for the target systems on the host system. For instructions on how to install SystemTap, refer to Section 2.1.1, “Installing SystemTap”. +
  4. + Using the target kernel version determined earlier, install the target kernel and related RPMs on the host system by the method described in Section 2.1.2, “Installing Required Kernel Information RPMs”. If multiple target systems use different target kernels, you will need to repeat this step for each different kernel used on the target systems. +
+ After performing Procedure 2.1, “Configuring a Host System and Target Systems”, you can now build the instrumentation module (for any target system) on the host system. +
+ To build the instrumentation module, run the following command on the host system (be sure to specify the appropriate values): +
stap -r kernel_version script -m module_name
+ Here, kernel_version refers to the version of the target kernel (the output of uname -r on the target machine), script refers to the script to be converted into an instrumentation module, and module_name is the desired name of the instrumentation module. +

Note

+ To determine the architecture notation of a running kernel, run uname -m. +
+ Once the the instrumentation module is compiled, copy it to the target system and then load it using: +
staprun module_name.ko
+ For example, to create the instrumentation module simple.ko from a SystemTap script named simple.stp for the target kernel 2.6.18-92.1.10.el5 (on x86_64 architecture), use the following command: +
+ stap -r 2.6.18-92.1.10.el5 -e 'probe vfs.read {exit()}' -m simple +
+ This will create a module named simple.ko. To use the instrumentation module simple.ko, copy it to the target system and run the following command (on the target system): +
+ staprun simple.ko +

Important

+ The host system must be the same architecture and running the same distribution of Linux as the target system in order for the built instrumentation module to work. +
diff --git a/SystemTap_Beginners_Guide/errors.html b/SystemTap_Beginners_Guide/errors.html new file mode 100644 index 00000000..a6c2c1b7 --- /dev/null +++ b/SystemTap_Beginners_Guide/errors.html @@ -0,0 +1,56 @@ + + +Chapter 6. Understanding SystemTap Errors

Product SiteDocumentation Site

Chapter 6. Understanding SystemTap Errors

+ This chapter explains the most common errors you may encounter while using SystemTap. +

6.1. Parse and Semantic Errors

+ These types of errors occur while SystemTap attempts to parse and translate the script into C, prior to being converted into a kernel module. For example type errors result from operations that assign invalid values to variables or arrays. +
parse error: expected foo, saw bar
+ The script contains a grammatical/typographical error. SystemTap detected type of construct that is incorrect, given the context of the probe. +
+ The following invalid SystemTap script is missing its probe handlers: +
+ +
probe vfs.read
+probe vfs.write
+
+
+ It results in the following error message showing that the parser was expecting something other than the probe keyword in column 1 of line 2: +
+ +
parse error: expected one of '. , ( ? ! { = +='
+	saw: keyword at perror.stp:2:1
+1 parse error(s).
+
parse error: embedded code in unprivileged script
+ The script contains unsafe embedded C code (blocks of code surrounded by %{ %}. SystemTap allows you to embed C code in a script, which is useful if there are no tapsets to suit your purposes. However, embedded C constructs are not safe; as such, SystemTap warns you with this error if such constructs appear in the script. +
+ If you are sure of the safety of any similar constructs in the script and are member of stapdev group (or have root privileges), run the script in "guru" mode by using the option -g (i.e. stap -g script). +
semantic error: type mismatch for identifier 'foo' ... string vs. long
+ The function foo in the script used the wrong type (i.e. %s or %d). This error will present itself in Example 6.1, “error-variable.stp”, because the function execname() returns a string the format specifier should be a %s, not %d. +
Example 6.1. error-variable.stp
probe syscall.open
+{
+  printf ("%d(%d) open\n", execname(), pid())
+}

semantic error: unresolved type for identifier 'foo'
+ The identifier (e.g. a variable) was used, but no type (integer or string) could be determined. This occurs, for instance, if you use a variable in a printf statement while the script never assigns a value to the variable. +
semantic error: Expecting symbol or array index expression
+ SystemTap could not assign a value to a variable or to a location in an array. The destination for the assignment is not a valid destination. The following example code would generate this error: +
+ +
probe begin { printf("x") = 1 }
+
+
while searching for arity N function, semantic error: unresolved function call
+ A function call or array index expression in the script used an invalid number of arguments/parameters. In SystemTap arity can either refer to the number of indices for an array, or the number of parameters to a function. +
semantic error: array locals not supported, missing global declaration?
+ The script used an array operation without declaring the array as a global variable (global variables can be declared after their use in SystemTap scripts). Similar messages appear if an array is used, but with inconsistent arities. +
semantic error: variable ’foo’ modified during ’foreach’ iteration
+ The array foo is being modifed (being assigned to or deleted from) within an active foreach loop. This error also displays if an operation within the script performs a function call within the foreach loop. +
semantic error: probe point mismatch at position N, while resolving probe point foo
+ SystemTap did not understand what the event or SystemTap function foo refers to. This usually means that SystemTap could not find a match for foo in the tapset library. The N refers to the line and column of the error. +
semantic error: no match for probe point, while resolving probe point foo
+ The events/handler function foo could not be resolved altogether, for a variety of reasons. This error occurs when the script contains the event kernel.function("blah"), and blah does not exist. In some cases, the error could also mean the script contains an invalid kernel file name or source line number. +
semantic error: unresolved target-symbol expression
+ A handler in the script references a target variable, but the value of the variable could not be resolved. This error could also mean that a handler is referencing a target variable that is not valid in the context when it was referenced. This may be a result of compiler optimization of the generated code. +
semantic error: libdwfl failure
+ There was a problem processing the debugging information. In most cases, this error results from the installation of a kernel-debuginfo RPM whose version does not match the probed kernel exactly. The installed kernel-debuginfo RPM itself may have some consistency/correctness problems. +
semantic error: cannot find foo debuginfo
+ SystemTap could not find a suitable kernel-debuginfo at all. +
diff --git a/SystemTap_Beginners_Guide/futexcontentionsect.html b/SystemTap_Beginners_Guide/futexcontentionsect.html new file mode 100644 index 00000000..c4becf08 --- /dev/null +++ b/SystemTap_Beginners_Guide/futexcontentionsect.html @@ -0,0 +1,54 @@ + + +5.4. Identifying Contended User-Space Locks

Product SiteDocumentation Site

5.4. Identifying Contended User-Space Locks

+ This section describes how to identify contended user-space locks throughout the system within a specific time period. The ability to identify contended user-space locks can help you investigate poor program performance that you suspect may be caused by futex contentions. +
+ Simply put, futex contention occurs when multiple processes are trying to access the same lock variable at the same time. This can result in a poor performance because the lock serializes execution; one process obtains the lock while the other processes must wait for the lock variable to become available again. +
+ The futexes.stp script probes the futex system call to show lock contention. +
futexes.stp
+ +
#! /usr/bin/env stap
+
+# This script tries to identify contended user-space locks by hooking
+# into the futex system call.
+
+global FUTEX_WAIT = 0 /*, FUTEX_WAKE = 1 */
+global FUTEX_PRIVATE_FLAG = 128 /* linux 2.6.22+ */
+global FUTEX_CLOCK_REALTIME = 256 /* linux 2.6.29+ */
+
+global lock_waits # long-lived stats on (tid,lock) blockage elapsed time
+global process_names # long-lived pid-to-execname mapping
+
+probe syscall.futex.return {  
+  if (($op & ~(FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME)) != FUTEX_WAIT) next
+  process_names[pid()] = execname()
+  elapsed = gettimeofday_us() - @entry(gettimeofday_us())
+  lock_waits[pid(), $uaddr] <<< elapsed
+}
+
+probe end {
+  foreach ([pid+, lock] in lock_waits) 
+    printf ("%s[%d] lock %p contended %d times, %d avg us\n",
+            process_names[pid], pid, lock, @count(lock_waits[pid,lock]),
+            @avg(lock_waits[pid,lock]))
+}
+
+
+ futexes.stp needs to be manually stopped; upon exit, it prints the following information: +
  • + Name and ID of the process responsible for a contention +
  • + The location of the contested lock variable +
  • + How many times the lock variable was contended +
  • + Average time of contention throughout the probe +
+ Example 5.19, “futexes.stp Sample Output” contains an excerpt from the output of futexes.stp upon exiting the script (after approximately 20 seconds). +
Example 5.19. futexes.stp Sample Output
[...]
+automount[2825] lock 0x00bc7784 contended 18 times, 999931 avg us
+synergyc[3686] lock 0x0861e96c contended 192 times, 101991 avg us
+synergyc[3758] lock 0x08d98744 contended 192 times, 101990 avg us
+synergyc[3938] lock 0x0982a8b4 contended 192 times, 101997 avg us
+[...]

diff --git a/SystemTap_Beginners_Guide/handlerconditionalstatements.html b/SystemTap_Beginners_Guide/handlerconditionalstatements.html new file mode 100644 index 00000000..f46a6ceb --- /dev/null +++ b/SystemTap_Beginners_Guide/handlerconditionalstatements.html @@ -0,0 +1,49 @@ + + +3.3.3. Conditional Statements

Product SiteDocumentation Site

3.3.3. Conditional Statements

+ In some cases, the output of a SystemTap script may be too big. To address this, you need to further refine the script's logic in order to delimit the output into something more relevant or useful to your probe. +
+ You can do this by using conditionals in handlers. SystemTap accepts the following types of conditional statements: +
If/Else Statements
+ Format: +
if (condition)
+  statement1
+else
+  statement2
+ The statement1 is executed if the condition expression is non-zero. The statement2 is executed if the condition expression is zero. The else clause (else statement2) is optional. Both statement1 and statement2 can be statement blocks. +
Example 3.11. ifelse.stp
global countread, countnonread
+probe kernel.function("vfs_read"),kernel.function("vfs_write")
+{
+  if (probefunc()=="vfs_read")
+    countread ++
+  else
+    countnonread ++
+}
+probe timer.s(5) { exit() }
+probe end
+{
+  printf("VFS reads total %d\n VFS writes total %d\n", countread, countnonread)
+}

+ Example 3.11, “ifelse.stp” is a script that counts how many virtual file system reads (vfs_read) and writes (vfs_write) the system performs within a 5-second span. When run, the script increments the value of the variable countread by 1 if the name of the function it probed matches vfs_read (as noted by the condition if (probefunc()=="vfs_read")); otherwise, it increments countnonread (else {countnonread ++}). +
While Loops
+ Format: +
while (condition)
+  statement
+ So long as condition is non-zero the block of statements in statement are executed. The statement is often a statement block and it must change a value so condition will eventually be zero. +
For Loops
+ Format: +
for (initialization; conditional; increment) statement
+ The for loop is simply shorthand for a while loop. The following is the equivalent while loop: +
initialization
+while (conditional) {
+   statement
+   increment
+}
Conditional Operators
+ Aside from == ("is equal to"), you can also use the following operators in your conditional statements: +
>=
+ Greater than or equal to +
<=
+ Less than or equal to +
!=
+ Is not equal to +
diff --git a/SystemTap_Beginners_Guide/images/gnuplotsample.png b/SystemTap_Beginners_Guide/images/gnuplotsample.png new file mode 100755 index 0000000000000000000000000000000000000000..c84bbd57c4c6adf8491b5d59dbbd9ba4e17c2f05 GIT binary patch literal 8286 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 W=}#Xq*1&%P0O$2h^oq|qM*Tmb=lXE~ literal 0 HcmV?d00001 diff --git a/SystemTap_Beginners_Guide/images/icon.svg b/SystemTap_Beginners_Guide/images/icon.svg new file mode 100644 index 00000000..c471a607 --- /dev/null +++ b/SystemTap_Beginners_Guide/images/icon.svg @@ -0,0 +1,3936 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="path2858" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SystemTap_Beginners_Guide/index.html b/SystemTap_Beginners_Guide/index.html new file mode 100644 index 00000000..328e68de --- /dev/null +++ b/SystemTap_Beginners_Guide/index.html @@ -0,0 +1,18 @@ + + +SystemTap Beginners Guide

Product SiteDocumentation Site

Systemtap 1.7

SystemTap Beginners Guide

Introduction to SystemTap (for Fedora)

Edition 2.0

+ Logo + +

+ Red Hat, Inc. +

Don Domingo

Engineering Services and Operations Content Services

William Cohen

Engineering Services and Operations Performance Tools

Legal Notice

+ This documentation is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. +
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +
+ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +
+ For more details see the file COPYING in the source distribution of Linux. +
Abstract
+ This guide provides basic instructions on how to use SystemTap to monitor different subsystems of Fedora in finer detail. The SystemTap Beginners Guide is recommended for users who have taken RHCT or have a similar level of expertise in Fedora. +

Preface
1. Document Conventions
1.1. Typographic Conventions
1.2. Pull-quote Conventions
1.3. Notes and Warnings
2. We Need Feedback!
1. Introduction
1.1. Documentation Goals
1.2. SystemTap Capabilities
2. Using SystemTap
2.1. Installation and Setup
2.1.1. Installing SystemTap
2.1.2. Installing Required Kernel Information RPMs
2.1.3. Initial Testing
2.2. Generating Instrumentation for Other Computers
2.3. Running SystemTap Scripts
2.3.1. SystemTap Flight Recorder Mode
3. Understanding How SystemTap Works
3.1. Architecture
3.2. SystemTap Scripts
3.2.1. Event
3.2.2. Systemtap Handler/Body
3.3. Basic SystemTap Handler Constructs
3.3.1. Variables
3.3.2. Target Variables
3.3.3. Conditional Statements
3.3.4. Command-Line Arguments
3.4. Associative Arrays
3.5. Array Operations in SystemTap
3.5.1. Assigning an Associated Value
3.5.2. Reading Values From Arrays
3.5.3. Incrementing Associated Values
3.5.4. Processing Multiple Elements in an Array
3.5.5. Clearing/Deleting Arrays and Array Elements
3.5.6. Using Arrays in Conditional Statements
3.5.7. Computing for Statistical Aggregates
3.6. Tapsets
4. User-Space Probing
4.1. User-Space Events
4.2. Accessing User-Space Target Variables
4.3. User-Space Stack Backtraces
5. Useful SystemTap Scripts
5.1. Network
5.1.1. Network Profiling
5.1.2. Tracing Functions Called in Network Socket Code
5.1.3. Monitoring Incoming TCP Connections
5.1.4. Monitoring TCP Packets
5.1.5. Monitoring Network Packets Drops in Kernel
5.2. Disk
5.2.1. Summarizing Disk Read/Write Traffic
5.2.2. Tracking I/O Time For Each File Read or Write
5.2.3. Track Cumulative IO
5.2.4. I/O Monitoring (By Device)
5.2.5. Monitoring Reads and Writes to a File
5.2.6. Monitoring Changes to File Attributes
5.2.7. Periodically Print I/O Block Time
5.3. Profiling
5.3.1. Counting Function Calls Made
5.3.2. Call Graph Tracing
5.3.3. Determining Time Spent in Kernel and User Space
5.3.4. Monitoring Polling Applications
5.3.5. Tracking Most Frequently Used System Calls
5.3.6. Tracking System Call Volume Per Process
5.4. Identifying Contended User-Space Locks
6. Understanding SystemTap Errors
6.1. Parse and Semantic Errors
6.2. Run Time Errors and Warnings
7. References
A. Revision History
Index
diff --git a/SystemTap_Beginners_Guide/inodewatch2sect.html b/SystemTap_Beginners_Guide/inodewatch2sect.html new file mode 100644 index 00000000..8779c1a5 --- /dev/null +++ b/SystemTap_Beginners_Guide/inodewatch2sect.html @@ -0,0 +1,29 @@ + + +5.2.6. Monitoring Changes to File Attributes

Product SiteDocumentation Site

5.2.6. Monitoring Changes to File Attributes

+ This section describes how to monitor if any processes are changing the attributes of a targeted file, in real time. +
inodewatch2.stp
+ +
#! /usr/bin/env stap
+
+global ATTR_MODE = 1
+
+probe kernel.function("setattr_copy")!,
+      kernel.function("generic_setattr")!,
+      kernel.function("inode_setattr") {
+  dev_nr = $inode->i_sb->s_dev
+  inode_nr = $inode->i_ino
+
+  if (dev_nr == MKDEV($1,$2) # major/minor device
+      && inode_nr == $3
+      && $attr->ia_valid & ATTR_MODE)
+    printf ("%s(%d) %s 0x%x/%u %o %d\n",
+      execname(), pid(), probefunc(), dev_nr, inode_nr, $attr->ia_mode, uid())
+}
+
+
+ Like inodewatch.stp from Section 5.2.5, “Monitoring Reads and Writes to a File”, inodewatch2.stp takes the targeted file's device number (in integer format) and inode number as arguments. For more information on how to retrieve this information, refer to Section 5.2.5, “Monitoring Reads and Writes to a File”. +
+ The output for inodewatch2.stp is similar to that of inodewatch.stp, except that inodewatch2.stp also contains the attribute changes to the monitored file, as well as the ID of the user responsible (uid()). Example 5.11, “inodewatch2.stp Sample Output” shows the output of inodewatch2.stp while monitoring /home/joe/bigfile when user joe executes chmod 777 /home/joe/bigfile and chmod 666 /home/joe/bigfile. +
Example 5.11. inodewatch2.stp Sample Output
chmod(17448) inode_setattr 0x800005/6011835 100777 500
+chmod(17449) inode_setattr 0x800005/6011835 100666 500

diff --git a/SystemTap_Beginners_Guide/inodewatchsect.html b/SystemTap_Beginners_Guide/inodewatchsect.html new file mode 100644 index 00000000..855e59b2 --- /dev/null +++ b/SystemTap_Beginners_Guide/inodewatchsect.html @@ -0,0 +1,35 @@ + + +5.2.5. Monitoring Reads and Writes to a File

Product SiteDocumentation Site

5.2.5. Monitoring Reads and Writes to a File

+ This section describes how to monitor reads from and writes to a file in real time. +
inodewatch.stp
+ +
#! /usr/bin/env stap
+
+probe vfs.write, vfs.read
+{
+  # dev and ino are defined by vfs.write and vfs.read
+  if (dev == MKDEV($1,$2) # major/minor device
+      && ino == $3)
+    printf ("%s(%d) %s 0x%x/%u\n",
+      execname(), pid(), probefunc(), dev, ino)
+}
+
+
+ inodewatch.stp takes the following information about the file as arguments on the command line: +
  • + The file's major device number. +
  • + The file's minor device number. +
  • + The file's inode number. +
+ To get this information, use stat -c '%D %i' filename, where filename is an absolute path. +
+ For instance: if you wish to monitor /etc/crontab, run stat -c '%D %i' /etc/crontab first. This gives the following output: +
805 1078319
+ 805 is the base-16 (hexadecimal) device number. The lower two digits are the minor device number and the upper digits are the major number. 1078319 is the inode number. To start monitoring /etc/crontab, run stap inodewatch.stp 0x8 0x05 1078319 (The 0x prefixes indicate base-16 values. +
+ The output of this command contains the name and ID of any process performing a read/write, the function it is performing (i.e. vfs_read or vfs_write), the device number (in hex format), and the inode number. Example 5.10, “inodewatch.stp Sample Output” contains the output of stap inodewatch.stp 0x8 0x05 1078319 (when cat /etc/crontab is executed while the script is running) : +
Example 5.10. inodewatch.stp Sample Output
cat(16437) vfs_read 0x800005/1078319
+cat(16437) vfs_read 0x800005/1078319

diff --git a/SystemTap_Beginners_Guide/intro-systemtap-vs-others.html b/SystemTap_Beginners_Guide/intro-systemtap-vs-others.html new file mode 100644 index 00000000..dae64f10 --- /dev/null +++ b/SystemTap_Beginners_Guide/intro-systemtap-vs-others.html @@ -0,0 +1,13 @@ + + +1.2. SystemTap Capabilities

Product SiteDocumentation Site

1.2. SystemTap Capabilities

+ SystemTap was originally developed to provide functionality for Fedora similar to previous Linux probing tools such as dprobes and the Linux Trace Toolkit. SystemTap aims to supplement the existing suite of Linux monitoring tools by providing users with the infrastructure to track kernel activity. In addition, SystemTap combines this capability with two things: +
  • + Flexibility: SystemTap's framework allows users to develop simple scripts for investigating and monitoring a wide variety of kernel functions, system calls, and other events that occur in kernel-space. With this, SystemTap is not so much a tool as it is a system that allows you to develop your own kernel-specific forensic and monitoring tools. +
  • + Ease-Of-Use: as mentioned earlier, SystemTap allows users to probe kernel-space events without having to resort to instrument, recompile, install, and reboot the kernel. +
+ Most of the SystemTap scripts enumerated in Chapter 5, Useful SystemTap Scripts demonstrate system forensics and monitoring capabilities not natively available with other similar tools (such as top, oprofile, or ps). These scripts are provided to give readers extensive examples of the application of SystemTap, which in turn will educate them further on the capabilities they can employ when writing their own SystemTap scripts. +
Limitations
+ The current iteration of SystemTap allows for a multitude of options when probing kernel-space events for a wide range of kernels. However, SystemTap's ability to probe user-space events is dependent on kernel support (the Utrace mechanism) that is unavailable in many kernels. Thus, only some kernel versions support user-space probing. At present, the developmental efforts of the SystemTap community are geared towards improving SystemTap's user-space probing capabilities. +
diff --git a/SystemTap_Beginners_Guide/introduction.html b/SystemTap_Beginners_Guide/introduction.html new file mode 100644 index 00000000..f1c3716e --- /dev/null +++ b/SystemTap_Beginners_Guide/introduction.html @@ -0,0 +1,19 @@ + + +Chapter 1. Introduction

Product SiteDocumentation Site

Chapter 1. Introduction

+ SystemTap is a tracing and probing tool that allows users to study and monitor the activities of the computer system (particularly, the kernel) in fine detail. It provides information similar to the output of tools like netstat, ps, top, and iostat; however, SystemTap is designed to provide more filtering and analysis options for collected information. +
+ For system administrators, SystemTap can be used as a performance monitoring tool for Fedora. It is most useful when other similar tools cannot precisely pinpoint a bottleneck in the system, requiring a deep analysis of kernel activity. In the same manner, application developers can also use SystemTap to monitor, in finer detail, how their application behaves within the Linux system. +

1.1. Documentation Goals

+ SystemTap provides the infrastructure to monitor the running Linux kernel for detailed analysis. This can assist administrators and developers in identifying the underlying cause of a bug or performance problem. +
+ Without SystemTap, monitoring the activity of a running kernel would require a tedious instrument, recompile, install, and reboot sequence. SystemTap is designed to eliminate this, allowing users to gather the same information by simply running user-written SystemTap scripts. +
+ However, SystemTap was initially designed for users with intermediate to advanced knowledge of the kernel. This makes SystemTap less useful to administrators or developers with limited knowledge of and experience with the Linux kernel. Moreover, much of the existing SystemTap documentation is similarly aimed at knowledgeable and experienced users. This makes learning the tool similarly difficult. +
+ To lower these barriers the SystemTap Beginners Guide was written with the following goals: +
  • + To introduce users to SystemTap, familiarize them with its architecture, and provide setup instructions. +
  • + To provide pre-written SystemTap scripts for monitoring detailed activity in different components of the system, along with instructions on how to run them and analyze their output. +
diff --git a/SystemTap_Beginners_Guide/ioblktimesect.html b/SystemTap_Beginners_Guide/ioblktimesect.html new file mode 100644 index 00000000..87e98b96 --- /dev/null +++ b/SystemTap_Beginners_Guide/ioblktimesect.html @@ -0,0 +1,47 @@ + + +5.2.7. Periodically Print I/O Block Time

Product SiteDocumentation Site

5.2.7. Periodically Print I/O Block Time

+ This section describes how to track the amount of time each block I/O requests spends waiting for completion. This is useful in determining whether there are too many outstanding block I/O operations at any given time. +
ioblktime.stp
+ +
#! /usr/bin/env stap
+
+global req_time, etimes
+
+probe ioblock.request
+{
+  req_time[$bio] = gettimeofday_us()
+}
+
+probe ioblock.end
+{
+  t = gettimeofday_us()
+  s =  req_time[$bio]
+  delete req_time[$bio]
+  if (s) {
+    etimes[devname, bio_rw_str(rw)] <<< t - s
+  }
+}
+
+probe timer.s(10), end {
+  ansi_clear_screen()
+  printf("%10s %3s %10s %10s %10s\n",
+         "device", "rw", "total (us)", "count", "avg (us)")
+  foreach ([dev,rw] in etimes - limit 20) {
+    printf("%10s %3s %10d %10d %10d\n", dev, rw,
+           @sum(etimes[dev,rw]), @count(etimes[dev,rw]), @avg(etimes[dev,rw]))
+  }
+  delete etimes
+}
+
+
+ ioblktime.stp computes the average waiting time for block I/O per device, and prints a list every 10 seconds. As always, you can revise this refresh rate by editing the specified value in probe timer.s(10), end {. +
+ In some cases, there can be too many outstanding block I/O operations, at which point the script can exceed the default number of MAXMAPENTRIES. MAXMAPENTRIES is the maximum number of rows in an array if the array size is not specified explicitly when declared. If the script exceeds the default MAXMAPENTRIES value of 2048, run the script again with the stap option -DMAXMAPENTRIES=10000. +
Example 5.12. ioblktime.stp Sample Output
    device  rw total (us)      count   avg (us)
+       sda   W       9659          6       1609
+      dm-0   W      20278          6       3379
+      dm-0   R      20524          5       4104
+       sda   R      19277          5       3855

+ Example 5.12, “ioblktime.stp Sample Output” displays the device name, operations performed (rw), total wait time of all operations (total(us)), number of operations (count), and average wait time for all those operations (avg (us)). The times tallied by the script are in microseconds. +
diff --git a/SystemTap_Beginners_Guide/iotimesect.html b/SystemTap_Beginners_Guide/iotimesect.html new file mode 100644 index 00000000..231e6d3b --- /dev/null +++ b/SystemTap_Beginners_Guide/iotimesect.html @@ -0,0 +1,119 @@ + + +5.2.2. Tracking I/O Time For Each File Read or Write

Product SiteDocumentation Site

5.2.2. Tracking I/O Time For Each File Read or Write

+ This section describes how to monitor the amount of time it takes for each process to read from or write to any file. This is useful if you wish to determine what files are slow to load on a given system. +
iotime.stp
+ +
#! /usr/bin/env stap
+
+/*
+ * Copyright (C) 2006-2007 Red Hat Inc.
+ * 
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU General Public License v.2.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Print out the amount of time spent in the read and write systemcall
+ * when each file opened by the process is closed. Note that the systemtap 
+ * script needs to be running before the open operations occur for
+ * the script to record data.
+ *
+ * This script could be used to to find out which files are slow to load
+ * on a machine. e.g.
+ *
+ * stap iotime.stp -c 'firefox'
+ *
+ * Output format is:
+ * timestamp pid (executabable) info_type path ...
+ *
+ * 200283135 2573 (cupsd) access /etc/printcap read: 0 write: 7063
+ * 200283143 2573 (cupsd) iotime /etc/printcap time: 69
+ *
+ */
+
+global start
+global time_io
+
+function timestamp:long() { return gettimeofday_us() - start }
+
+function proc:string() { return sprintf("%d (%s)", pid(), execname()) }
+
+probe begin { start = gettimeofday_us() }
+
+global filehandles, fileread, filewrite
+
+probe syscall.open.return {
+  filename = user_string($filename)
+  if ($return != -1) {
+    filehandles[pid(), $return] = filename
+  } else {
+    printf("%d %s access %s fail\n", timestamp(), proc(), filename)
+  }
+}
+
+probe syscall.read.return {
+  p = pid()
+  fd = $fd
+  bytes = $return
+  time = gettimeofday_us() - @entry(gettimeofday_us())
+  if (bytes > 0)
+    fileread[p, fd] += bytes
+  time_io[p, fd] <<< time
+}
+
+probe syscall.write.return {
+  p = pid()
+  fd = $fd
+  bytes = $return
+  time = gettimeofday_us() - @entry(gettimeofday_us())
+  if (bytes > 0)
+    filewrite[p, fd] += bytes
+  time_io[p, fd] <<< time
+}
+
+probe syscall.close {
+  if ([pid(), $fd] in filehandles) {
+    printf("%d %s access %s read: %d write: %d\n",
+           timestamp(), proc(), filehandles[pid(), $fd],
+           fileread[pid(), $fd], filewrite[pid(), $fd])
+    if (@count(time_io[pid(), $fd]))
+      printf("%d %s iotime %s time: %d\n",  timestamp(), proc(),
+             filehandles[pid(), $fd], @sum(time_io[pid(), $fd]))
+   }
+  delete fileread[pid(), $fd]
+  delete filewrite[pid(), $fd]
+  delete filehandles[pid(), $fd]
+  delete time_io[pid(),$fd]
+}
+
+
+ iotime.stp tracks each time a system call opens, closes, reads from, and writes to a file. For each file any system call accesses, iotime.stp counts the number of microseconds it takes for any reads or writes to finish and tracks the amount of data (in bytes) read from or written to the file. +
+ iotime.stp also uses the local variable $count to track the amount of data (in bytes) that any system call attempts to read or write. Note that $return (as used in disktop.stp from Section 5.2.1, “Summarizing Disk Read/Write Traffic”) stores the actual amount of data read/written. $count can only be used on probes that track data reads or writes (e.g. syscall.read and syscall.write). +
Example 5.7. iotime.stp Sample Output
[...]
+825946 3364 (NetworkManager) access /sys/class/net/eth0/carrier read: 8190 write: 0
+825955 3364 (NetworkManager) iotime /sys/class/net/eth0/carrier time: 9
+[...]
+117061 2460 (pcscd) access /dev/bus/usb/003/001 read: 43 write: 0
+117065 2460 (pcscd) iotime /dev/bus/usb/003/001 time: 7
+[...]
+3973737 2886 (sendmail) access /proc/loadavg read: 4096 write: 0
+3973744 2886 (sendmail) iotime /proc/loadavg time: 11
+[...]

+ Example 5.7, “iotime.stp Sample Output” prints out the following data: +
  • + A timestamp, in microseconds. +
  • + Process ID and process name. +
  • + An access or iotime flag. +
  • + The file accessed. +
+ If a process was able to read or write any data, a pair of access and iotime lines should appear together. The access line's timestamp refers to the time that a given process started accessing a file; at the end of the line, it will show the amount of data read/written (in bytes). The iotime line will show the amount of time (in microseconds) that the process took in order to perform the read or write. +
+ If an access line is not followed by an iotime line, it simply means that the process did not read or write any data. +
diff --git a/SystemTap_Beginners_Guide/ix01.html b/SystemTap_Beginners_Guide/ix01.html new file mode 100644 index 00000000..1bb47dd5 --- /dev/null +++ b/SystemTap_Beginners_Guide/ix01.html @@ -0,0 +1,3 @@ + + +Index

Product SiteDocumentation Site

Index

Symbols

$count
sample usage
local variables, Tracking I/O Time For Each File Read or Write
$return
sample usage
local variables, Summarizing Disk Read/Write Traffic, Track Cumulative IO
@avg (integer extractor)
computing for statistical aggregates
array operations, Computing for Statistical Aggregates
@count (integer extractor)
computing for statistical aggregates
array operations, Computing for Statistical Aggregates
@max (integer extractor)
computing for statistical aggregates
array operations, Computing for Statistical Aggregates
@min (integer extractor)
computing for statistical aggregates
array operations, Computing for Statistical Aggregates
@sum (integer extractor)
computing for statistical aggregates
array operations, Computing for Statistical Aggregates

A

adding values to statistical aggregates
computing for statistical aggregates
array operations, Computing for Statistical Aggregates
advantages of cross-instrumentation, Generating Instrumentation for Other Computers
aggregate element not found
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings
aggregates (statistical)
array operations, Computing for Statistical Aggregates
aggregation overflow
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings
algebraic formulas using arrays
reading values from arrays
array operations, Reading Values From Arrays
architecture notation, determining, Generating Instrumentation for Other Computers
architecture of SystemTap, Architecture
array locals not supported
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
array operations
assigning associated values, Assigning an Associated Value
associating timestamps to process names, Assigning an Associated Value
associative arrays, Array Operations in SystemTap
clearing arrays/array elements, Clearing/Deleting Arrays and Array Elements
delete operator, Clearing/Deleting Arrays and Array Elements
multiple array operations within the same probe, Clearing/Deleting Arrays and Array Elements
virtual file system reads (non-cumulative), tallying, Clearing/Deleting Arrays and Array Elements
computing for statistical aggregates, Computing for Statistical Aggregates
@avg (integer extractor), Computing for Statistical Aggregates
@count (integer extractor), Computing for Statistical Aggregates
@max (integer extractor), Computing for Statistical Aggregates
@min (integer extractor), Computing for Statistical Aggregates
@sum (integer extractor), Computing for Statistical Aggregates
adding values to statistical aggregates, Computing for Statistical Aggregates
count (operator), Computing for Statistical Aggregates
extracting data collected by statistical aggregates, Computing for Statistical Aggregates
conditional statements, using arrays in, Using Arrays in Conditional Statements
testing for array membership, Using Arrays in Conditional Statements
deleting arrays and array elements, Clearing/Deleting Arrays and Array Elements
incrementing associated values, Incrementing Associated Values
tallying virtual file system reads (VFS reads), Incrementing Associated Values
multiple elements in an array, Processing Multiple Elements in an Array
processing multiple elements in an array, Processing Multiple Elements in an Array
cumulative virtual file system reads, tallying, Processing Multiple Elements in an Array
foreach, Processing Multiple Elements in an Array
iterations, processing elements in an array as, Processing Multiple Elements in an Array
limiting the output of foreach, Processing Multiple Elements in an Array
ordering the output of foreach, Processing Multiple Elements in an Array
reading values from arrays, Reading Values From Arrays
computing for timestamp deltas, Reading Values From Arrays
empty unique keys, Reading Values From Arrays
using arrays in simple computations, Reading Values From Arrays
arrays, Associative Arrays
(see also associative arrays)
assigning associated values
array operations, Assigning an Associated Value
associating timestamps to process names, Assigning an Associated Value
associating timestamps to process names
array operations, Assigning an Associated Value
associated values
introduction
arrays, Associative Arrays
associating timestamps to process names
assigning associated values
array operations, Assigning an Associated Value
associative arrays
introduction, Associative Arrays
associated values, Associative Arrays
example, Associative Arrays
index expression, Associative Arrays
key pairs, Associative Arrays
syntax, Associative Arrays
unique keys, Associative Arrays
asynchronous events
Events, Event

B

begin
Events, Event
building instrumentation modules from SystemTap scripts, Generating Instrumentation for Other Computers
building kernel modules from SystemTap scripts, Generating Instrumentation for Other Computers

C

call graph tracing
examples of SystemTap scripts, Call Graph Tracing
capabilities of SystemTap
Introduction, SystemTap Capabilities
changes to file attributes, monitoring
examples of SystemTap scripts, Monitoring Changes to File Attributes
clearing arrays/array elements
array operations, Clearing/Deleting Arrays and Array Elements
delete operator, Clearing/Deleting Arrays and Array Elements
multiple array operations within the same probe, Clearing/Deleting Arrays and Array Elements
virtual file system reads (non-cumulative), tallying, Clearing/Deleting Arrays and Array Elements
command-line arguments
SystemTap handler constructs
handlers, Command-Line Arguments
compiling instrumentation/kernel modules from SystemTap scripts, Generating Instrumentation for Other Computers
components
SystemTap scripts
introduction, SystemTap Scripts
computing for statistical aggregates
array operations, Computing for Statistical Aggregates
@avg (integer extractor), Computing for Statistical Aggregates
@count (integer extractor), Computing for Statistical Aggregates
@max (integer extractor), Computing for Statistical Aggregates
@min (integer extractor), Computing for Statistical Aggregates
@sum (integer extractor), Computing for Statistical Aggregates
adding values to statistical aggregates, Computing for Statistical Aggregates
count (operator), Computing for Statistical Aggregates
extracting data collected by statistical aggregates, Computing for Statistical Aggregates
computing for timestamp deltas
reading values from arrays
array operations, Reading Values From Arrays
conditional operators
conditional statements
handlers, Conditional Statements
conditional statements, using arrays in
array operations, Using Arrays in Conditional Statements
testing for array membership, Using Arrays in Conditional Statements
CONFIG_HZ, computing for, Variables
contended user-space locks (futex contentions), identifying
examples of SystemTap scripts, Identifying Contended User-Space Locks
copy fault
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings
count operator
computing for statistical aggregates
array (operator), Computing for Statistical Aggregates
counting function calls
examples of SystemTap scripts, Counting Function Calls Made
CPU ticks
examples of SystemTap scripts, Determining Time Spent in Kernel and User Space
cpu()
functions, Systemtap Handler/Body
cross-compiling, Generating Instrumentation for Other Computers
cross-instrumentation
advantages of, Generating Instrumentation for Other Computers
building kernel modules from SystemTap scripts, Generating Instrumentation for Other Computers
configuration
host system and target system, Generating Instrumentation for Other Computers
generating instrumentation from SystemTap scripts, Generating Instrumentation for Other Computers
host system, Generating Instrumentation for Other Computers
instrumentation module, Generating Instrumentation for Other Computers
target kernel, Generating Instrumentation for Other Computers
target system, Generating Instrumentation for Other Computers
ctime()
functions, Systemtap Handler/Body
ctime(), example of usage
script examples, Summarizing Disk Read/Write Traffic
cumulative I/O, tracking
examples of SystemTap scripts, Track Cumulative IO
cumulative virtual file system reads, tallying
processing multiple elements in an array
array operations, Processing Multiple Elements in an Array

D

delete operator
clearing arrays/array elements
array operations, Clearing/Deleting Arrays and Array Elements
determining architecture notation, Generating Instrumentation for Other Computers
determining the kernel version, Installing Required Kernel Information RPMs
determining time spent in kernel and user space
examples of SystemTap scripts, Determining Time Spent in Kernel and User Space
device I/O, monitoring
examples of SystemTap scripts, I/O Monitoring (By Device)
device number of a file (integer format)
examples of SystemTap scripts, Monitoring Reads and Writes to a File
disk I/O traffic, summarizing
script examples, Summarizing Disk Read/Write Traffic
division by 0
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings
documentation goals
Introduction, Documentation Goals

E

embedded code in unprivileged script
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
empty unique keys
reading values from arrays
array operations, Reading Values From Arrays
end
Events, Event
errors
parse/semantics error, Parse and Semantic Errors
embedded code in unprivileged script, Parse and Semantic Errors
expected symbol/array index expression, Parse and Semantic Errors
grammatical/typographical script error, Parse and Semantic Errors
guru mode, Parse and Semantic Errors
invalid values to variables/arrays, Parse and Semantic Errors
libdwfl failure, Parse and Semantic Errors
no match for probe point, Parse and Semantic Errors
non-global arrays, Parse and Semantic Errors
probe mismatch, Parse and Semantic Errors
type mismatch for identifier, Parse and Semantic Errors
unresolved function call, Parse and Semantic Errors
unresolved target-symbol expression, Parse and Semantic Errors
unresolved type for identifier, Parse and Semantic Errors
variable modified during 'foreach', Parse and Semantic Errors
runtime errors/warnings, Run Time Errors and Warnings
aggregate element not found, Run Time Errors and Warnings
aggregation overflow, Run Time Errors and Warnings
copy fault, Run Time Errors and Warnings
division by 0, Run Time Errors and Warnings
MAXACTION exceeded, Run Time Errors and Warnings
MAXNESTING exceeded, Run Time Errors and Warnings
number of errors: N, skipped probes: M, Run Time Errors and Warnings
pointer dereference fault, Run Time Errors and Warnings
event types
Understanding How SystemTap Works, Understanding How SystemTap Works
Events
asynchronous events, Event
begin, Event
end, Event
examples of synchronous and asynchronous events, Event
introduction, Event
kernel.function("function"), Event
kernel.trace("tracepoint"), Event
module("module"), Event
synchronous events, Event
syscall.system_call, Event
timer events, Event
user-space, User-Space Events
vfs.file_operation, Event
wildcards, Event
events and handlers, Understanding How SystemTap Works
events wildcards, Event
example
introduction
arrays, Associative Arrays
example of multiple command-line arguments
examples of SystemTap scripts, Call Graph Tracing
examples of synchronous and asynchronous events
Events, Event
examples of SystemTap scripts, Useful SystemTap Scripts
call graph tracing, Call Graph Tracing
CPU ticks, Determining Time Spent in Kernel and User Space
ctime(), example of usage, Summarizing Disk Read/Write Traffic
determining time spent in kernel and user space, Determining Time Spent in Kernel and User Space
file device number (integer format), Monitoring Reads and Writes to a File
futex (lock) contentions, Identifying Contended User-Space Locks
futex system call, Identifying Contended User-Space Locks
identifying contended user-space locks (i.e. futex contentions), Identifying Contended User-Space Locks
if/else conditionals, alternative syntax, Network Profiling
inode number, Monitoring Reads and Writes to a File
monitoring changes to file attributes, Monitoring Changes to File Attributes
monitoring device I/O, I/O Monitoring (By Device)
monitoring I/O block time, Periodically Print I/O Block Time
monitoring I/O time, Tracking I/O Time For Each File Read or Write
monitoring incoming TCP connections, Monitoring Incoming TCP Connections
monitoring polling applications, Monitoring Polling Applications
monitoring reads and writes to a file, Monitoring Reads and Writes to a File
monitoring system calls, Tracking Most Frequently Used System Calls
monitoring system calls (volume per process), Tracking System Call Volume Per Process
monitoring TCP packets, Monitoring TCP Packets
multiple command-line arguments, example of, Call Graph Tracing
net/socket.c, tracing functions from, Tracing Functions Called in Network Socket Code
network profiling, Network Profiling, Monitoring Network Packets Drops in Kernel
stat -c, determining file device number (integer format), Monitoring Reads and Writes to a File
stat -c, determining whole device number, I/O Monitoring (By Device)
summarizing disk I/O traffic, Summarizing Disk Read/Write Traffic
tallying function calls, Counting Function Calls Made
thread_indent(), sample usage, Call Graph Tracing
timer.ms(), sample usage, Counting Function Calls Made
timer.s(), sample usage, Monitoring Polling Applications, Tracking Most Frequently Used System Calls
tracing functions called in network socket code, Tracing Functions Called in Network Socket Code
tracking cumulative I/O, Track Cumulative IO
trigger function, Call Graph Tracing
usrdev2kerndev(), I/O Monitoring (By Device)
whole device number (usage as a command-line argument), I/O Monitoring (By Device)
exceeded MAXACTION
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings
exceeded MAXNESTING
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings
exit()
functions, Systemtap Handler/Body
expected symbol/array index expression
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
extracting data collected by statistical aggregates
computing for statistical aggregates
array operations, Computing for Statistical Aggregates

F

fedoradebugurl.sh, Installing Required Kernel Information RPMs
feedback
contact information for this manual, We Need Feedback!
file attributes, monitoring changes to
examples of SystemTap scripts, Monitoring Changes to File Attributes
file device number (integer format)
examples of SystemTap scripts, Monitoring Reads and Writes to a File
file reads/writes, monitoring
examples of SystemTap scripts, Monitoring Reads and Writes to a File
flight recorder mode, SystemTap Flight Recorder Mode
file mode, File Flight Recorder
in-memory mode, In-memory Flight Recorder
for loops
conditional statements
handlers, Conditional Statements
foreach
processing multiple elements in an array
array operations, Processing Multiple Elements in an Array
format
introduction
arrays, Associative Arrays
format and syntax
printf(), Systemtap Handler/Body
SystemTap handler constructs
handlers, Variables
SystemTap scripts
introduction, SystemTap Scripts
format specifiers
printf(), Systemtap Handler/Body
format strings
printf(), Systemtap Handler/Body
function call (unresolved)
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
function calls (incoming/outgoing), tracing
examples of SystemTap scripts, Call Graph Tracing
function calls, tallying
examples of SystemTap scripts, Counting Function Calls Made
functions, Systemtap Handler/Body
cpu(), Systemtap Handler/Body
ctime(), Systemtap Handler/Body
gettimeofday_s(), Systemtap Handler/Body
pp(), Systemtap Handler/Body
SystemTap scripts
introduction, SystemTap Scripts
target(), Systemtap Handler/Body
thread_indent(), Systemtap Handler/Body
tid(), Systemtap Handler/Body
uid(), Systemtap Handler/Body
functions (used in handlers)
exit(), Systemtap Handler/Body
functions called in network socket code, tracing
examples of SystemTap scripts, Tracing Functions Called in Network Socket Code
futex (lock) contentions
examples of SystemTap scripts, Identifying Contended User-Space Locks
futex contention, definition
examples of SystemTap scripts, Identifying Contended User-Space Locks
futex contentions, identifying
examples of SystemTap scripts, Identifying Contended User-Space Locks
futex system call
examples of SystemTap scripts, Identifying Contended User-Space Locks

G

gettimeofday_s()
functions, Systemtap Handler/Body
global
SystemTap handler constructs
handlers, Variables
goals, documentation
Introduction, Documentation Goals
grammatical/typographical script error
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
guru mode
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors

H

handler functions, Systemtap Handler/Body
handlers
conditional statements, Conditional Statements
conditional operators, Conditional Statements
for loops, Conditional Statements
if/else, Conditional Statements
while loops, Conditional Statements
introduction, Systemtap Handler/Body
SystemTap handler constructs, Basic SystemTap Handler Constructs
command-line arguments, Command-Line Arguments
global, Variables
syntax and format, Basic SystemTap Handler Constructs
variable notations, Command-Line Arguments
variables, Variables
target variables, Target Variables
handlers and events, Understanding How SystemTap Works
SystemTap scripts
introduction, SystemTap Scripts
heaviest disk reads/writes, identifying
script examples, Summarizing Disk Read/Write Traffic
host system
cross-instrumentation, Generating Instrumentation for Other Computers
host system and target system
cross-instrumentation
configuration, Generating Instrumentation for Other Computers

I

I/O block time, monitoring
examples of SystemTap scripts, Periodically Print I/O Block Time
I/O monitoring (by device)
examples of SystemTap scripts, I/O Monitoring (By Device)
I/O time, monitoring
examples of SystemTap scripts, Tracking I/O Time For Each File Read or Write
I/O traffic, summarizing
script examples, Summarizing Disk Read/Write Traffic
identifier type mismatch
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
identifying contended user-space locks (i.e. futex contentions)
examples of SystemTap scripts, Identifying Contended User-Space Locks
identifying heaviest disk reads/writes
script examples, Summarizing Disk Read/Write Traffic
if/else
conditional statements
handlers, Conditional Statements
if/else conditionals, alternative syntax
examples of SystemTap scripts, Network Profiling
if/else statements, using arrays in
array operations, Using Arrays in Conditional Statements
incoming TCP connections, monitoring
examples of SystemTap scripts, Monitoring Incoming TCP Connections
incoming/outgoing function calls, tracing
examples of SystemTap scripts, Call Graph Tracing
incrementing associated values
array operations, Incrementing Associated Values
tallying virtual file system reads (VFS reads), Incrementing Associated Values
index expression
introduction
arrays, Associative Arrays
initial testing, Initial Testing
inode number
examples of SystemTap scripts, Monitoring Reads and Writes to a File
Installation
fedoradebugurl.sh, Installing Required Kernel Information RPMs
initial testing, Initial Testing
kernel information packages, Installing Required Kernel Information RPMs
kernel version, determining the, Installing Required Kernel Information RPMs
required packages, Installing Required Kernel Information RPMs
Setup and Installation, Installation and Setup
systemtap package, Installing SystemTap
systemtap-runtime package, Installing SystemTap
instrumentation module
cross-instrumentation, Generating Instrumentation for Other Computers
instrumentation modules from SystemTap scripts, building, Generating Instrumentation for Other Computers
integer extractors
computing for statistical aggregates
array operations, Computing for Statistical Aggregates
Introduction
capabilities of SystemTap, SystemTap Capabilities
documentation goals, Documentation Goals
goals, documentation, Documentation Goals
limitations of SystemTap, SystemTap Capabilities
performance monitoring, Introduction
invalid division
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings
invalid values to variables/arrays
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
iterations, processing elements in an array as
processing multiple elements in an array
array operations, Processing Multiple Elements in an Array

K

kernel and user space, determining time spent in
examples of SystemTap scripts, Determining Time Spent in Kernel and User Space
kernel information packages, Installing Required Kernel Information RPMs
kernel modules from SystemTap scripts, building, Generating Instrumentation for Other Computers
kernel version, determining the, Installing Required Kernel Information RPMs
kernel.function("function")
Events, Event
kernel.trace("tracepoint")
Events, Event
key pairs
introduction
arrays, Associative Arrays

L

libdwfl failure
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
limitations of SystemTap
Introduction, SystemTap Capabilities
limiting the output of foreach
processing multiple elements in an array
array operations, Processing Multiple Elements in an Array
local variables
name, Systemtap Handler/Body
sample usage
$count, Tracking I/O Time For Each File Read or Write
$return, Summarizing Disk Read/Write Traffic, Track Cumulative IO

M

MAXACTION exceeded
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings
MAXNESTING exceeded
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings
membership (in array), testing for
conditional statements, using arrays in
array operations, Using Arrays in Conditional Statements
module("module")
Events, Event
monitoring changes to file attributes
examples of SystemTap scripts, Monitoring Changes to File Attributes
monitoring cumulative I/O
examples of SystemTap scripts, Track Cumulative IO
monitoring device I/O
examples of SystemTap scripts, I/O Monitoring (By Device)
monitoring I/O block time
examples of SystemTap scripts, Periodically Print I/O Block Time
monitoring I/O time
examples of SystemTap scripts, Tracking I/O Time For Each File Read or Write
monitoring incoming TCP connections
examples of SystemTap scripts, Monitoring Incoming TCP Connections
monitoring polling applications
examples of SystemTap scripts, Monitoring Polling Applications
monitoring reads and writes to a file
examples of SystemTap scripts, Monitoring Reads and Writes to a File
monitoring system calls
examples of SystemTap scripts, Tracking Most Frequently Used System Calls
monitoring system calls (volume per process)
examples of SystemTap scripts, Tracking System Call Volume Per Process
monitoring TCP packets
examples of SystemTap scripts, Monitoring TCP Packets
multiple array operations within the same probe
clearing arrays/array elements
array operations, Clearing/Deleting Arrays and Array Elements
multiple command-line arguments, example of
examples of SystemTap scripts, Call Graph Tracing
multiple elements in an array
array operations, Processing Multiple Elements in an Array

N

name
local variables, Systemtap Handler/Body
net/socket.c, tracing functions from
examples of SystemTap scripts, Tracing Functions Called in Network Socket Code
network profiling
examples of SystemTap scripts, Network Profiling, Monitoring Network Packets Drops in Kernel
network socket code, tracing functions called in
examples of SystemTap scripts, Tracing Functions Called in Network Socket Code
network traffic, monitoring
examples of SystemTap scripts, Network Profiling, Monitoring Network Packets Drops in Kernel
no match for probe point
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
non-global arrays
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
number of errors: N, skipped probes: M
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings

O

operations
assigning associated values
associating timestamps to process names, Assigning an Associated Value
associative arrays, Array Operations in SystemTap
clearing arrays/array elements, Clearing/Deleting Arrays and Array Elements
delete operator, Clearing/Deleting Arrays and Array Elements
multiple array operations within the same probe, Clearing/Deleting Arrays and Array Elements
virtual file system reads (non-cumulative), tallying, Clearing/Deleting Arrays and Array Elements
computing for statistical aggregates, Computing for Statistical Aggregates
@avg (integer extractor), Computing for Statistical Aggregates
@count (integer extractor), Computing for Statistical Aggregates
@max (integer extractor), Computing for Statistical Aggregates
@min (integer extractor), Computing for Statistical Aggregates
@sum (integer extractor), Computing for Statistical Aggregates
adding values to statistical aggregates, Computing for Statistical Aggregates
count (operator), Computing for Statistical Aggregates
extracting data collected by statistical aggregates, Computing for Statistical Aggregates
conditional statements, using arrays in, Using Arrays in Conditional Statements
testing for array membership, Using Arrays in Conditional Statements
deleting arrays and array elements, Clearing/Deleting Arrays and Array Elements
incrementing associated values, Incrementing Associated Values
tallying virtual file system reads (VFS reads), Incrementing Associated Values
multiple elements in an array, Processing Multiple Elements in an Array
processing multiple elements in an array, Processing Multiple Elements in an Array
cumulative virtual file system reads, tallying, Processing Multiple Elements in an Array
foreach, Processing Multiple Elements in an Array
iterations, processing elements in an array as, Processing Multiple Elements in an Array
limiting the output of foreach, Processing Multiple Elements in an Array
ordering the output of foreach, Processing Multiple Elements in an Array
reading values from arrays, Reading Values From Arrays
computing for timestamp deltas, Reading Values From Arrays
empty unique keys, Reading Values From Arrays
using arrays in simple computations, Reading Values From Arrays
options, stap
Usage, Running SystemTap Scripts
ordering the output of foreach
processing multiple elements in an array
array operations, Processing Multiple Elements in an Array
overflow of aggregation
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings

P

packages required to run SystemTap, Installing Required Kernel Information RPMs
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
embedded code in unprivileged script, Parse and Semantic Errors
expected symbol/array index expression, Parse and Semantic Errors
grammatical/typographical script error, Parse and Semantic Errors
guru mode, Parse and Semantic Errors
invalid values to variables/arrays, Parse and Semantic Errors
libdwfl failure, Parse and Semantic Errors
no match for probe point, Parse and Semantic Errors
non-global arrays, Parse and Semantic Errors
probe mismatch, Parse and Semantic Errors
type mismatch for identifier, Parse and Semantic Errors
unresolved function call, Parse and Semantic Errors
unresolved target-symbol expression, Parse and Semantic Errors
unresolved type for identifier, Parse and Semantic Errors
variable modified during 'foreach', Parse and Semantic Errors
performance monitoring
Introduction, Introduction
pointer dereference fault
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings
polling applications, monitoring
examples of SystemTap scripts, Monitoring Polling Applications
pp()
functions, Systemtap Handler/Body
printf()
format specifiers, Systemtap Handler/Body
format strings, Systemtap Handler/Body
syntax and format, Systemtap Handler/Body
printing I/O activity (cumulative)
examples of SystemTap scripts, Track Cumulative IO
printing I/O block time (periodically)
examples of SystemTap scripts, Periodically Print I/O Block Time
probe mismatch
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
probe point (no match for)
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
probes
SystemTap scripts
introduction, SystemTap Scripts
processing multiple elements in an array
array operations, Processing Multiple Elements in an Array
cumulative virtual file system reads, tallying
array operations, Processing Multiple Elements in an Array
foreach
array operations, Processing Multiple Elements in an Array
limiting the output of foreach
array operations, Processing Multiple Elements in an Array
ordering the output of foreach
array operations, Processing Multiple Elements in an Array
profiling the network
examples of SystemTap scripts, Network Profiling, Monitoring Network Packets Drops in Kernel

R

reading values from arrays
array operations, Reading Values From Arrays
empty unique keys, Reading Values From Arrays
using arrays in simple computations, Reading Values From Arrays
computing for timestamp deltas
array operations, Reading Values From Arrays
reads/writes to a file, monitoring
examples of SystemTap scripts, Monitoring Reads and Writes to a File
required packages, Installing Required Kernel Information RPMs
RPMs required to run SystemTap, Installing Required Kernel Information RPMs
running scripts from standard input, Running SystemTap Scripts
running SystemTap scripts
Usage, Running SystemTap Scripts
runtime errors/warnings
understainding SystemTap errors, Run Time Errors and Warnings
aggregate element not found, Run Time Errors and Warnings
aggregation overflow, Run Time Errors and Warnings
copy fault, Run Time Errors and Warnings
division by 0, Run Time Errors and Warnings
MAXACTION exceeded, Run Time Errors and Warnings
MAXNESTING exceeded, Run Time Errors and Warnings
number of errors: N, skipped probes: M, Run Time Errors and Warnings
pointer dereference fault, Run Time Errors and Warnings

S

script examples
call graph tracing, Call Graph Tracing
CPU ticks, Determining Time Spent in Kernel and User Space
ctime(), example of usage, Summarizing Disk Read/Write Traffic
determining time spent in kernel and user space, Determining Time Spent in Kernel and User Space
file device number (integer format), Monitoring Reads and Writes to a File
futex (lock) contentions, Identifying Contended User-Space Locks
futex system call, Identifying Contended User-Space Locks
identifying contended user-space locks (i.e. futex contentions), Identifying Contended User-Space Locks
if/else conditionals, alternative syntax, Network Profiling
inode number, Monitoring Reads and Writes to a File
monitoring changes to file attributes, Monitoring Changes to File Attributes
monitoring device I/O, I/O Monitoring (By Device)
monitoring I/O block time, Periodically Print I/O Block Time
monitoring I/O time, Tracking I/O Time For Each File Read or Write
monitoring incoming TCP connections, Monitoring Incoming TCP Connections
monitoring polling applications, Monitoring Polling Applications
monitoring reads and writes to a file, Monitoring Reads and Writes to a File
monitoring system calls, Tracking Most Frequently Used System Calls
monitoring system calls (volume per process), Tracking System Call Volume Per Process
monitoring TCP packets, Monitoring TCP Packets
multiple command-line arguments, example of, Call Graph Tracing
net/socket.c, tracing functions from, Tracing Functions Called in Network Socket Code
network profiling, Network Profiling, Monitoring Network Packets Drops in Kernel
stat -c, determining file device number (integer format), Monitoring Reads and Writes to a File
stat -c, determining whole device number, I/O Monitoring (By Device)
summarizing disk I/O traffic, Summarizing Disk Read/Write Traffic
tallying function calls, Counting Function Calls Made
thread_indent(), sample usage, Call Graph Tracing
timer.ms(), sample usage, Counting Function Calls Made
timer.s(), sample usage, Monitoring Polling Applications, Tracking Most Frequently Used System Calls
tracing functions called in network socket code, Tracing Functions Called in Network Socket Code
tracking cumulative I/O, Track Cumulative IO
trigger function, Call Graph Tracing
usrdev2kerndev(), I/O Monitoring (By Device)
whole device number (usage as a command-line argument), I/O Monitoring (By Device)
scripts
introduction, SystemTap Scripts
components, SystemTap Scripts
events and handlers, SystemTap Scripts
format and syntax, SystemTap Scripts
functions, SystemTap Scripts
probes, SystemTap Scripts
statement blocks, SystemTap Scripts
sessions, SystemTap, Architecture
Setup and Installation, Installation and Setup
Stack backtrace
user-space, User-Space Stack Backtraces
standard input, running scripts from
Usage, Running SystemTap Scripts
stap
Usage, Running SystemTap Scripts
stap options, Running SystemTap Scripts
stapdev
Usage, Running SystemTap Scripts
staprun
Usage, Running SystemTap Scripts
stapusr
Usage, Running SystemTap Scripts
stat -c, determining file device number (integer format)
examples of SystemTap scripts, Monitoring Reads and Writes to a File
stat -c, determining whole device number
examples of SystemTap scripts, I/O Monitoring (By Device)
statement blocks
SystemTap scripts
introduction, SystemTap Scripts
statistical aggregates
array operations, Computing for Statistical Aggregates
summarizing disk I/O traffic
script examples, Summarizing Disk Read/Write Traffic
synchronous events
Events, Event
syntax
introduction
arrays, Associative Arrays
syntax and format
printf(), Systemtap Handler/Body
SystemTap handler constructs
handlers, Basic SystemTap Handler Constructs
SystemTap scripts
introduction, SystemTap Scripts
syscall.system_call
Events, Event
system calls volume (per process), monitoring
examples of SystemTap scripts, Tracking System Call Volume Per Process
system calls, monitoring
examples of SystemTap scripts, Tracking Most Frequently Used System Calls
SystemTap architecture, Architecture
SystemTap handlers
SystemTap handler constructs, Basic SystemTap Handler Constructs
syntax and format, Basic SystemTap Handler Constructs
systemtap package, Installing SystemTap
SystemTap script functions, Systemtap Handler/Body
SystemTap scripts
introduction, SystemTap Scripts
components, SystemTap Scripts
events and handlers, SystemTap Scripts
format and syntax, SystemTap Scripts
functions, SystemTap Scripts
probes, SystemTap Scripts
statement blocks, SystemTap Scripts
useful examples, Useful SystemTap Scripts
SystemTap scripts, how to run, Running SystemTap Scripts
SystemTap sessions, Architecture
SystemTap statements
conditional statements, Conditional Statements
conditional operators, Conditional Statements
for loops, Conditional Statements
if/else, Conditional Statements
while loops, Conditional Statements
SystemTap handler constructs
command-line arguments, Command-Line Arguments
global, Variables
variable notations, Command-Line Arguments
variables, Variables
systemtap-runtime package, Installing SystemTap
systemtap-testsuite package
sample scripts, Useful SystemTap Scripts

T

tallying function calls
examples of SystemTap scripts, Counting Function Calls Made
tallying virtual file system reads (VFS reads)
incrementing associated values
array operations, Incrementing Associated Values
Tapsets
definition of, Tapsets
target kernel
cross-instrumentation, Generating Instrumentation for Other Computers
target system
cross-instrumentation, Generating Instrumentation for Other Computers
target system and host system
configuration, Generating Instrumentation for Other Computers
target variables, Target Variables
pretty printing, Pretty Printing Target Variables
typecasting, Typecasting
user-space, Accessing User-Space Target Variables
variable availability, Checking Target Variable Availablility
target()
functions, Systemtap Handler/Body
target-symbol expression, unresolved
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
TCP connections (incoming), monitoring
examples of SystemTap scripts, Monitoring Incoming TCP Connections
TCP packets, monitoring
examples of SystemTap scripts, Monitoring TCP Packets
testing for array membership
conditional statements, using arrays in
array operations, Using Arrays in Conditional Statements
testing, initial, Initial Testing
thread_indent()
functions, Systemtap Handler/Body
thread_indent(), sample usage
examples of SystemTap scripts, Call Graph Tracing
tid()
functions, Systemtap Handler/Body
time of I/O
examples of SystemTap scripts, Tracking I/O Time For Each File Read or Write
time spent in kernel/user space, determining
examples of SystemTap scripts, Determining Time Spent in Kernel and User Space
timer events
Events, Event
timer.ms(), sample usage
examples of SystemTap scripts, Counting Function Calls Made
timer.s(), sample usage
examples of SystemTap scripts, Monitoring Polling Applications, Tracking Most Frequently Used System Calls
timestamp deltas, computing for
reading values from arrays
array operations, Reading Values From Arrays
timestamps, association thereof to process names
assigning associated values
array operations, Assigning an Associated Value
tracepoint, Event, Monitoring Network Packets Drops in Kernel
tracing call graph
examples of SystemTap scripts, Call Graph Tracing
tracing functions called in network socket code
examples of SystemTap scripts, Tracing Functions Called in Network Socket Code
tracing incoming/outgoing function calls
examples of SystemTap scripts, Call Graph Tracing
tracking cumulative I/O
examples of SystemTap scripts, Track Cumulative IO
trigger function
examples of SystemTap scripts, Call Graph Tracing
type mismatch for identifier
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
typographical script error
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors

U

uid()
functions, Systemtap Handler/Body
uname -m, Generating Instrumentation for Other Computers
uname -r, Installing Required Kernel Information RPMs
understainding SystemTap errors
runtime errors/warnings, Run Time Errors and Warnings
aggregate element not found, Run Time Errors and Warnings
aggregation overflow, Run Time Errors and Warnings
copy fault, Run Time Errors and Warnings
division by 0, Run Time Errors and Warnings
MAXACTION exceeded, Run Time Errors and Warnings
MAXNESTING exceeded, Run Time Errors and Warnings
number of errors: N, skipped probes: M, Run Time Errors and Warnings
pointer dereference fault, Run Time Errors and Warnings
Understanding How SystemTap Works, Understanding How SystemTap Works
architecture, Architecture
event types, Understanding How SystemTap Works
events and handlers, Understanding How SystemTap Works
SystemTap sessions, Architecture
understanding SystemTap errors
parse/semantics error, Parse and Semantic Errors
embedded code in unprivileged script, Parse and Semantic Errors
expected symbol/array index expression, Parse and Semantic Errors
grammatical/typographical script error, Parse and Semantic Errors
guru mode, Parse and Semantic Errors
invalid values to variables/arrays, Parse and Semantic Errors
libdwfl failure, Parse and Semantic Errors
no match for probe point, Parse and Semantic Errors
non-global arrays, Parse and Semantic Errors
probe mismatch, Parse and Semantic Errors
type mismatch for identifier, Parse and Semantic Errors
unresolved function call, Parse and Semantic Errors
unresolved target-symbol expression, Parse and Semantic Errors
unresolved type for identifier, Parse and Semantic Errors
variable modified during 'foreach', Parse and Semantic Errors
unique keys
introduction
arrays, Associative Arrays
unprivileged script, embedded code in
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
unresolved function call
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
unresolved target-symbol expression
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
unresolved type for identifier
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
unsafe embedded code in unprivileged script
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
Usage
options, stap, Running SystemTap Scripts
running SystemTap scripts, Running SystemTap Scripts
standard input, running scripts from, Running SystemTap Scripts
stap, Running SystemTap Scripts
stapdev, Running SystemTap Scripts
staprun, Running SystemTap Scripts
stapusr, Running SystemTap Scripts
useful examples of SystemTap scripts, Useful SystemTap Scripts
user and kernel space, determining time spent in
examples of SystemTap scripts, Determining Time Spent in Kernel and User Space
using arrays in simple computations
reading values from arrays
array operations, Reading Values From Arrays
Using SystemTap, Using SystemTap
usrdev2kerndev()
examples of SystemTap scripts, I/O Monitoring (By Device)

V

values, assignment of
array operations, Assigning an Associated Value
variable modified during 'foreach'
parse/semantics error
understanding SystemTap errors, Parse and Semantic Errors
variable notations
SystemTap handler constructs
handlers, Command-Line Arguments
variables
SystemTap handler constructs
handlers, Variables
variables (local)
name, Systemtap Handler/Body
sample usage
$count, Tracking I/O Time For Each File Read or Write
$return, Summarizing Disk Read/Write Traffic, Track Cumulative IO
VFS reads, tallying of
incrementing associated values
array operations, Incrementing Associated Values
vfs.file_operation
Events, Event
virtual file system reads (cumulative), tallying
processing multiple elements in an array
array operations, Processing Multiple Elements in an Array
virtual file system reads (non-cumulative), tallying
clearing arrays/array elements
array operations, Clearing/Deleting Arrays and Array Elements

W

while loops
conditional statements
handlers, Conditional Statements
whole device number (usage as a command-line argument)
examples of SystemTap scripts, I/O Monitoring (By Device)
wildcards in events, Event
writes/reads to a file, monitoring
examples of SystemTap scripts, Monitoring Reads and Writes to a File
diff --git a/SystemTap_Beginners_Guide/mainsect-disk.html b/SystemTap_Beginners_Guide/mainsect-disk.html new file mode 100644 index 00000000..ded11d90 --- /dev/null +++ b/SystemTap_Beginners_Guide/mainsect-disk.html @@ -0,0 +1,113 @@ + + +5.2. Disk

Product SiteDocumentation Site

5.2. Disk

+ The following sections showcase scripts that monitor disk and I/O activity. +

5.2.1. Summarizing Disk Read/Write Traffic

+ This section describes how to identify which processes are performing the heaviest disk reads/writes to the system. +
disktop.stp
+ +
#!/usr/bin/env stap 
+#
+# Copyright (C) 2007 Oracle Corp.
+#
+# Get the status of reading/writing disk every 5 seconds,
+# output top ten entries 
+#
+# This is free software,GNU General Public License (GPL);
+# either version 2, or (at your option) any later version.
+#
+# Usage:
+#  ./disktop.stp
+#
+
+global io_stat,device
+global read_bytes,write_bytes
+
+probe vfs.read.return {
+  if ($return>0) {
+    if (devname!="N/A") {/*skip read from cache*/
+      io_stat[pid(),execname(),uid(),ppid(),"R"] += $return
+      device[pid(),execname(),uid(),ppid(),"R"] = devname
+      read_bytes += $return
+    }
+  }
+}
+
+probe vfs.write.return {
+  if ($return>0) {
+    if (devname!="N/A") { /*skip update cache*/
+      io_stat[pid(),execname(),uid(),ppid(),"W"] += $return
+      device[pid(),execname(),uid(),ppid(),"W"] = devname
+      write_bytes += $return
+    }
+  }
+}
+
+probe timer.ms(5000) {
+  /* skip non-read/write disk */
+  if (read_bytes+write_bytes) {
+
+    printf("\n%-25s, %-8s%4dKb/sec, %-7s%6dKb, %-7s%6dKb\n\n",
+           ctime(gettimeofday_s()),
+           "Average:", ((read_bytes+write_bytes)/1024)/5,
+           "Read:",read_bytes/1024,
+           "Write:",write_bytes/1024)
+
+    /* print header */
+    printf("%8s %8s %8s %25s %8s %4s %12s\n",
+           "UID","PID","PPID","CMD","DEVICE","T","BYTES")
+  }
+  /* print top ten I/O */
+  foreach ([process,cmd,userid,parent,action] in io_stat- limit 10)
+    printf("%8d %8d %8d %25s %8s %4s %12d\n",
+           userid,process,parent,cmd,
+           device[process,cmd,userid,parent,action],
+           action,io_stat[process,cmd,userid,parent,action])
+
+  /* clear data */
+  delete io_stat
+  delete device
+  read_bytes = 0
+  write_bytes = 0  
+}
+
+probe end{
+  delete io_stat
+  delete device
+  delete read_bytes
+  delete write_bytes
+}
+
+
+ disktop.stp outputs the top ten processes responsible for the heaviest reads/writes to disk. Example 5.6, “disktop.stp Sample Output” displays a sample output for this script, and includes the following data per listed process: +
  • + UID — user ID. A user ID of 0 refers to the root user. +
  • + PID — the ID of the listed process. +
  • + PPID — the process ID of the listed process's parent process. +
  • + CMD — the name of the listed process. +
  • + DEVICE — which storage device the listed process is reading from or writing to. +
  • + T — the type of action performed by the listed process; W refers to write, while R refers to read. +
  • + BYTES — the amount of data read to or written from disk. +
+ The time and date in the output of disktop.stp is returned by the functions ctime() and gettimeofday_s(). ctime() derives calendar time in terms of seconds passed since the Unix epoch (January 1, 1970). gettimeofday_s() counts the actual number of seconds since Unix epoch, which gives a fairly accurate human-readable timestamp for the output. +
+ In this script, the $return is a local variable that stores the actual number of bytes each process reads or writes from the virtual file system. $return can only be used in return probes (e.g. vfs.read.return and vfs.read.return). +
Example 5.6. disktop.stp Sample Output
[...]
+Mon Sep 29 03:38:28 2008 , Average:  19Kb/sec, Read: 7Kb, Write: 89Kb
+
+UID      PID     PPID                       CMD   DEVICE    T    BYTES
+0    26319    26294                   firefox     sda5    W        90229
+0     2758     2757           pam_timestamp_c     sda5    R         8064
+0     2885        1                     cupsd     sda5    W         1678
+
+Mon Sep 29 03:38:38 2008 , Average:   1Kb/sec, Read: 7Kb, Write: 1Kb
+
+UID      PID     PPID                       CMD   DEVICE    T    BYTES
+0     2758     2757           pam_timestamp_c     sda5    R         8064
+0     2885        1                     cupsd     sda5    W         1678

diff --git a/SystemTap_Beginners_Guide/mainsect-profiling.html b/SystemTap_Beginners_Guide/mainsect-profiling.html new file mode 100644 index 00000000..af4ee635 --- /dev/null +++ b/SystemTap_Beginners_Guide/mainsect-profiling.html @@ -0,0 +1,59 @@ + + +5.3. Profiling

Product SiteDocumentation Site

5.3. Profiling

+ The following sections showcase scripts that profile kernel activity by monitoring function calls. +

5.3.1. Counting Function Calls Made

+ This section describes how to identify how many times the system called a specific kernel function in a 30-second sample. Depending on your use of wildcards, you can also use this script to target multiple kernel functions. +
functioncallcount.stp
+ +
#! /usr/bin/env stap
+# The following line command will probe all the functions
+# in kernel's memory management code:
+#
+# stap  functioncallcount.stp "*@mm/*.c"
+
+probe kernel.function(@1).call {  # probe functions listed on commandline
+  called[probefunc()] <<< 1  # add a count efficiently
+}
+
+global called
+
+probe end {
+  foreach (fn in called-)  # Sort by call count (in decreasing order)
+  #       (fn+ in called)  # Sort by function name
+    printf("%s %d\n", fn, @count(called[fn]))
+  exit()
+}
+
+
+ functioncallcount.stp takes the targeted kernel function as an argument. The argument supports wildcards, which enables you to target multiple kernel functions up to a certain extent. +
+ The output of functioncallcount.stp contains the name of the function called and how many times it was called during the sample time (in alphabetical order). Example 5.13, “functioncallcount.stp Sample Output” contains an excerpt from the output of stap functioncallcount.stp "*@mm/*.c": +
Example 5.13. functioncallcount.stp Sample Output
[...]
+__vma_link 97
+__vma_link_file 66
+__vma_link_list 97
+__vma_link_rb 97
+__xchg 103
+add_page_to_active_list 102
+add_page_to_inactive_list 19
+add_to_page_cache 19
+add_to_page_cache_lru 7
+all_vm_events 6
+alloc_pages_node 4630
+alloc_slabmgmt 67
+anon_vma_alloc 62
+anon_vma_free 62
+anon_vma_lock 66
+anon_vma_prepare 98
+anon_vma_unlink 97
+anon_vma_unlock 66
+arch_get_unmapped_area_topdown 94
+arch_get_unmapped_exec_area 3
+arch_unmap_area_topdown 97
+atomic_add 2
+atomic_add_negative 97
+atomic_dec_and_test 5153
+atomic_inc 470
+atomic_inc_and_test 1
+[...]

diff --git a/SystemTap_Beginners_Guide/paracallgraph.html b/SystemTap_Beginners_Guide/paracallgraph.html new file mode 100644 index 00000000..824e17bb --- /dev/null +++ b/SystemTap_Beginners_Guide/paracallgraph.html @@ -0,0 +1,55 @@ + + +5.3.2. Call Graph Tracing

Product SiteDocumentation Site

5.3.2. Call Graph Tracing

+ This section describes how to trace incoming and outgoing function calls. +
para-callgraph.stp
+ +
#! /usr/bin/env stap
+
+function trace(entry_p, extra) {
+  %( $# > 1 %? if (tid() in trace) %)
+  printf("%s%s%s %s\n",
+         thread_indent (entry_p),
+         (entry_p>0?"->":"<-"),
+         probefunc (),
+         extra)
+}
+
+
+%( $# > 1 %?
+global trace
+probe $2.call {
+  trace[tid()] = 1
+}
+probe $2.return {
+  delete trace[tid()]
+}
+%)
+
+probe $1.call   { trace(1, $$parms) }
+probe $1.return { trace(-1, $$return) }
+
+
+ para-callgraph.stp takes two command-line arguments: +
  • + The function/s whose entry/exit call you'd like to trace ($1). +
  • + A second optional trigger function ($2), which enables or disables tracing on a per-thread basis. Tracing in each thread will continue as long as the trigger function has not exited yet. +
+ para-callgraph.stp uses thread_indent(); as such, its output contains the timestamp, process name, and thread ID of $1 (i.e. the probe function you are tracing). For more information about thread_indent(), refer to its entry in SystemTap Functions. +
+ The following example contains an excerpt from the output for stap para-callgraph.stp 'kernel.function("*@fs/*.c")' 'kernel.function("sys_read")': +
Example 5.14. para-callgraph.stp Sample Output
[...]
+   267 gnome-terminal(2921): <-do_sync_read return=0xfffffffffffffff5
+   269 gnome-terminal(2921):<-vfs_read return=0xfffffffffffffff5
+     0 gnome-terminal(2921):->fput file=0xffff880111eebbc0
+     2 gnome-terminal(2921):<-fput
+     0 gnome-terminal(2921):->fget_light fd=0x3 fput_needed=0xffff88010544df54
+     3 gnome-terminal(2921):<-fget_light return=0xffff8801116ce980
+     0 gnome-terminal(2921):->vfs_read file=0xffff8801116ce980 buf=0xc86504 count=0x1000 pos=0xffff88010544df48
+     4 gnome-terminal(2921): ->rw_verify_area read_write=0x0 file=0xffff8801116ce980 ppos=0xffff88010544df48 count=0x1000
+     7 gnome-terminal(2921): <-rw_verify_area return=0x1000
+    12 gnome-terminal(2921): ->do_sync_read filp=0xffff8801116ce980 buf=0xc86504 len=0x1000 ppos=0xffff88010544df48
+    15 gnome-terminal(2921): <-do_sync_read return=0xfffffffffffffff5
+    18 gnome-terminal(2921):<-vfs_read return=0xfffffffffffffff5
+     0 gnome-terminal(2921):->fput file=0xffff8801116ce980

diff --git a/SystemTap_Beginners_Guide/pr01s02.html b/SystemTap_Beginners_Guide/pr01s02.html new file mode 100644 index 00000000..6d4fa441 --- /dev/null +++ b/SystemTap_Beginners_Guide/pr01s02.html @@ -0,0 +1,9 @@ + + +2. We Need Feedback!

Product SiteDocumentation Site

2. We Need Feedback!

+ If you find a typographical error in this manual, or if you have thought of a way to make this manual better, we would love to hear from you! Please submit a report in Bugzilla: http://bugzilla.redhat.com/bugzilla/ against the product systemtap. +
+ When submitting a report, be sure to include the specific file or URL the report refers to and the manual's identifier: SystemTap_Beginners_Guide +
+ If you have a suggestion for improving the documentation, try to be as specific as possible when describing it. If you have found an error, please include the section number and some of the surrounding text so we can find it easily. +
diff --git a/SystemTap_Beginners_Guide/references.html b/SystemTap_Beginners_Guide/references.html new file mode 100644 index 00000000..7fa62820 --- /dev/null +++ b/SystemTap_Beginners_Guide/references.html @@ -0,0 +1,23 @@ + + +Chapter 7. References

Product SiteDocumentation Site

Chapter 7. References

+ This chapter enumerates other references for more information about SystemTap. It is advisable that you refer to these sources in the course of writing advanced probes and tapsets. +
SystemTap Wiki
+ The SystemTap Wiki is a collection of links and articles related to the deployment, usage, and development of SystemTap. You can find it at http://sourceware.org/systemtap/wiki/HomePage. +
SystemTap Tutorial
+ Much of the content in this book comes from the SystemTap Tutorial. The SystemTap Tutorial is a more appropriate reference for users with intermediate to advanced knowledge of C++ and kernel development, and can be found at http://sourceware.org/systemtap/tutorial/. +
man stapprobes
+ The stapprobes man page enumerates a variety of probe points supported by SystemTap, along with additional aliases defined by the SystemTap tapset library. The bottom of the man page includes a list of other man pages enumerating similar probe points for specific system components, such as tapset::scsi, tapset::kprocess, tapset::signal, etc. +
man stapfuncs
+ The stapfuncs man page enumerates numerous functions supported by the SystemTap tapset library, along with the prescribed syntax for each one. Note, however, that this is not a complete list of all supported functions; there are more undocumented functions available. +
SystemTap Tapset Reference Manual
+ The SystemTap Tapset Reference Manual at http://sourceware.org/systemtap/tapsets/ describes the individual predefined functions and probe points of the tapsets greater detail. +
SystemTap Language Reference
+ This document is a comprehensive reference of SystemTap's language constructs and syntax. It is recommended for users with a rudimentary to intermediate knowledge of C++ and other similar programming languages. The SystemTap Language Reference is available to all users at http://sourceware.org/systemtap/langref/ +
Tapset Developers Guide
+ Once you have sufficient proficiency in writing SystemTap scripts, you can then try your hand out on writing your own tapsets. The Tapset Developers Guide describes how to add functions to your tapset library. +
Test Suite
+ The systemtap-testsuite package allows you to test the entire SystemTap toolchain without having to build from source. In addition, it also contains numerous examples of SystemTap scripts you can study and test; some of these scripts are also documented in Chapter 5, Useful SystemTap Scripts. +
+ By default, the example scripts included in systemtap-testsuite are located in /usr/share/systemtap/testsuite/systemtap.examples. +
diff --git a/SystemTap_Beginners_Guide/runtimeerror.html b/SystemTap_Beginners_Guide/runtimeerror.html new file mode 100644 index 00000000..70281127 --- /dev/null +++ b/SystemTap_Beginners_Guide/runtimeerror.html @@ -0,0 +1,21 @@ + + +6.2. Run Time Errors and Warnings

Product SiteDocumentation Site

6.2. Run Time Errors and Warnings

+ Runtime errors and warnings occur when the SystemTap instrumentation has been installed and is collecting data on the system. +
WARNING: Number of errors: N, skipped probes: M
+ Errors and/or skipped probes occurred during this run. Both N and M are the counts of the number of probes that were not executed due to conditions such as too much time required to execute event handlers over an interval of time. +
division by 0
+ The script code performed an invalid division. +
aggregate element not found
+ A statistics extractor function other than @count was invoked on an aggregate that has not had any values accumulated yet. This is similar to a division by zero. +
aggregation overflow
+ An array containing aggregate values contains too many distinct key pairs at this time. +
MAXNESTING exceeded
+ Too many levels of function call nesting were attempted. The default nesting of function calls allowed is 10. +
MAXACTION exceeded
+ The probe handler attempted to execute too many statements in the probe handler. The default number of actions allowed in a probe handler is 1000. +
kernel/user string copy fault at ADDR
+ The probe handler attempted to copy a string from kernel or user-space at an invalid address (ADDR). +
pointer dereference fault
+ There was a fault encountered during a pointer dereference operation such as a target variable evaluation. +
diff --git a/SystemTap_Beginners_Guide/scriptconstructions.html b/SystemTap_Beginners_Guide/scriptconstructions.html new file mode 100644 index 00000000..02de3db3 --- /dev/null +++ b/SystemTap_Beginners_Guide/scriptconstructions.html @@ -0,0 +1,24 @@ + + +3.3. Basic SystemTap Handler Constructs

Product SiteDocumentation Site

3.3. Basic SystemTap Handler Constructs

+ SystemTap supports the use of several basic constructs in handlers. The syntax for most of these handler constructs are mostly based on C and awk syntax. This section describes several of the most useful SystemTap handler constructs, which should provide you with enough information to write simple yet useful SystemTap scripts. +

3.3.1. Variables

+ Variables can be used freely throughout a handler; simply choose a name, assign a value from a function or expression to it, and use it in an expression. SystemTap automatically identifies whether a variable should be typed as a string or integer, based on the type of the values assigned to it. For instance, if you use set the variable foo to gettimeofday_s() (as in foo = gettimeofday_s()), then foo is typed as a number and can be printed in a printf() with the integer format specifier (%d). +
+ Note, however, that by default variables are only local to the probe they are used in. This means that variables are initialized, used and disposed at each probe handler invocation. To share a variable between probes, declare the variable name using global outside of the probes. Consider the following example: +
Example 3.8. timer-jiffies.stp
global count_jiffies, count_ms
+probe timer.jiffies(100) { count_jiffies ++ }
+probe timer.ms(100) { count_ms ++ }
+probe timer.ms(12345)
+{
+  hz=(1000*count_jiffies) / count_ms
+  printf ("jiffies:ms ratio %d:%d => CONFIG_HZ=%d\n",
+    count_jiffies, count_ms, hz)
+  exit ()
+}

+ Example 3.8, “timer-jiffies.stp” computes the CONFIG_HZ setting of the kernel using timers that count jiffies and milliseconds, then computing accordingly. The global statement allows the script to use the variables count_jiffies and count_ms (set in their own respective probes) to be shared with probe timer.ms(12345). +

Note

+ The ++ notation in Example 3.8, “timer-jiffies.stp” (i.e. count_jiffies ++ and count_ms ++) is used to increment the value of a variable by 1. In the following probe, count_jiffies is incremented by 1 every 100 jiffies: +
probe timer.jiffies(100) { count_jiffies ++ }
+ In this instance, SystemTap understands that count_jiffies is an integer. Because no initial value was assigned to count_jiffies, its initial value is zero by default. +
diff --git a/SystemTap_Beginners_Guide/scripts.html b/SystemTap_Beginners_Guide/scripts.html new file mode 100644 index 00000000..40e2289a --- /dev/null +++ b/SystemTap_Beginners_Guide/scripts.html @@ -0,0 +1,85 @@ + + +3.2. SystemTap Scripts

Product SiteDocumentation Site

3.2. SystemTap Scripts

+ For the most part, SystemTap scripts are the foundation of each SystemTap session. SystemTap scripts instruct SystemTap on what type of information to collect, and what to do once that information is collected. +
+ As stated in Chapter 3, Understanding How SystemTap Works, SystemTap scripts are made up of two components: events and handlers. Once a SystemTap session is underway, SystemTap monitors the operating system for the specified events and executes the handlers as they occur. +

Note

+ An event and its corresponding handler is collectively called a probe. A SystemTap script can have multiple probes. +
+ A probe's handler is commonly referred to as a probe body. +
+ In terms of application development, using events and handlers is similar to instrumenting the code by inserting diagnostic print statements in a program's sequence of commands. These diagnostic print statements allow you to view a history of commands executed once the program is run. +
+ SystemTap scripts allow insertion of the instrumentation code without recompilation of the code and allows more flexibility with regard to handlers. Events serve as the triggers for handlers to run; handlers can be specified to record specified data and print it in a certain manner. +
Format
+ SystemTap scripts use the file extension .stp, and contains probes written in the following format: +
probe	event {statements}
+ SystemTap supports multiple events per probe; multiple events are delimited by a comma (,). If multiple events are specified in a single probe, SystemTap will execute the handler when any of the specified events occur. +
+ Each probe has a corresponding statement block. This statement block is enclosed in braces ({ }) and contains the statements to be executed per event. SystemTap executes these statements in sequence; special separators or terminators are generally not necessary between multiple statements. +

Note

+ Statement blocks in SystemTap scripts follow the same syntax and semantics as the C programming language. A statement block can be nested within another statement block. +
+ Systemtap allows you to write functions to factor out code to be used by a number of probes. Thus, rather than repeatedly writing the same series of statements in multiple probes, you can just place the instructions in a function, as in: +
function function_name(arguments) {statements}
+probe event {function_name(arguments)}
+ The statements in function_name are executed when the probe for event executes. The arguments are optional values passed into the function. +

Important

+ Section 3.2, “SystemTap Scripts” is designed to introduce readers to the basics of SystemTap scripts. To understand SystemTap scripts better, it is advisable that you refer to Chapter 5, Useful SystemTap Scripts; each section therein provides a detailed explanation of the script, its events, handlers, and expected output. +

3.2.1. Event

+ SystemTap events can be broadly classified into two types: synchronous and asynchronous. +
Synchronous Events
+ A synchronous event occurs when any process executes an instruction at a particular location in kernel code. This gives other events a reference point from which more contextual data may be available. +
+ Examples of synchronous events include: +
syscall.system_call
+ The entry to the system call system_call. If the exit from a syscall is desired, appending a .return to the event monitor the exit of the system call instead. For example, to specify the entry and exit of the system call close, use syscall.close and syscall.close.return respectively. +
vfs.file_operation
+ The entry to the file_operation event for Virtual File System (VFS). Similar to syscall event, appending a .return to the event monitors the exit of the file_operation operation. +
kernel.function("function")
+ The entry to the kernel function function. For example, kernel.function("sys_open") refers to the "event" that occurs when the kernel function sys_open is called by any thread in the system. To specify the return of the kernel function sys_open, append the return string to the event statement; i.e. kernel.function("sys_open").return. +
+ When defining probe events, you can use asterisk (*) for wildcards. You can also trace the entry or exit of a function in a kernel source file. Consider the following example: +
Example 3.1. wildcards.stp
probe kernel.function("*@net/socket.c") { }
+probe kernel.function("*@net/socket.c").return { }

+ In the previous example, the first probe's event specifies the entry of ALL functions in the kernel source file net/socket.c. The second probe specifies the exit of all those functions. Note that in this example, there are no statements in the handler; as such, no information will be collected or displayed. +
kernel.trace("tracepoint")
+ The static probe for tracepoint. Recent kernels (2.6.30 and newer) include instrumentation for specific events in the kernel. These events are statically marked with tracepoints. One example of a tracepoint available in systemtap is kernel.trace("kfree_skb") which indicates each time a network buffer is freed in the kernel. +
module("module").function("function")
+ Allows you to probe functions within modules. For example: +
Example 3.2. moduleprobe.stp
probe module("ext3").function("*") { }
+probe module("ext3").function("*").return { }

+ The first probe in Example 3.2, “moduleprobe.stp” points to the entry of all functions for the ext3 module. The second probe points to the exits of all functions for that same module; the use of the .return suffix is similar to kernel.function(). Note that the probes in Example 3.2, “moduleprobe.stp” do not contain statements in the probe handlers, and as such will not print any useful data (as in Example 3.1, “wildcards.stp”). +
+ A system's kernel modules are typically located in /lib/modules/kernel_version, where kernel_version refers to the currently loaded kernel version. Modules use the file name extension .ko. +
Asynchronous Events
+ Asynchronous events are not tied to a particular instruction or location in code. This family of probe points consists mainly of counters, timers, and similar constructs. +
+ Examples of asynchronous events include: +
begin
+ The startup of a SystemTap session; i.e. as soon as the SystemTap script is run. +
end
+ The end of a SystemTap session. +
timer events
+ An event that specifies a handler to be executed periodically. For example: +
Example 3.3. timer-s.stp
probe timer.s(4)
+{
+  printf("hello world\n")
+}

+ Example 3.3, “timer-s.stp” is an example of a probe that prints hello world every 4 seconds. Note that you can also use the following timer events: +
  • + timer.ms(milliseconds) +
  • + timer.us(microseconds) +
  • + timer.ns(nanoseconds) +
  • + timer.hz(hertz) +
  • + timer.jiffies(jiffies) +
+ When used in conjunction with other probes that collect information, timer events allows you to print out get periodic updates and see how that information changes over time. +

Important

+ SystemTap supports the use of a large collection of probe events. For more information about supported events, refer to man stapprobes. The SEE ALSO section of man stapprobes also contains links to other man pages that discuss supported events for specific subsystems and components. +
diff --git a/SystemTap_Beginners_Guide/syscallsbyprocpidsect.html b/SystemTap_Beginners_Guide/syscallsbyprocpidsect.html new file mode 100644 index 00000000..9565a8a6 --- /dev/null +++ b/SystemTap_Beginners_Guide/syscallsbyprocpidsect.html @@ -0,0 +1,91 @@ + + +5.3.6. Tracking System Call Volume Per Process

Product SiteDocumentation Site

5.3.6. Tracking System Call Volume Per Process

+ This section illustrates how to determine which processes are performing the highest volume of system calls. In previous sections, we've described how to monitor the top system calls used by the system over time (Section 5.3.5, “Tracking Most Frequently Used System Calls”). We've also described how to identify which applications use a specific set of "polling suspect" system calls the most (Section 5.3.4, “Monitoring Polling Applications”). Monitoring the volume of system calls made by each process provides more data in investigating your system for polling processes and other resource hogs. +
syscalls_by_proc.stp
+ +
#! /usr/bin/env stap
+
+# Copyright (C) 2006 IBM Corp.
+#
+# This file is part of systemtap, and is free software.  You can
+# redistribute it and/or modify it under the terms of the GNU General
+# Public License (GPL); either version 2, or (at your option) any
+# later version.
+
+#
+# Print the system call count by process name in descending order.
+#
+
+global syscalls
+
+probe begin {
+  print ("Collecting data... Type Ctrl-C to exit and display results\n")
+}
+
+probe syscall.* {
+  syscalls[execname()]++
+}
+
+probe end {
+  printf ("%-10s %-s\n", "#SysCalls", "Process Name")
+  foreach (proc in syscalls-)
+    printf("%-10d %-s\n", syscalls[proc], proc)
+}
+
+
+ syscalls_by_proc.stp lists the top 20 processes performing the highest number of system calls. It also lists how many system calls each process performed during the time period. Refer to Example 5.18, “topsys.stp Sample Output” for a sample output. +
Example 5.18. topsys.stp Sample Output
Collecting data... Type Ctrl-C to exit and display results
+#SysCalls  Process Name
+1577       multiload-apple
+692        synergyc
+408        pcscd
+376        mixer_applet2
+299        gnome-terminal
+293        Xorg
+206        scim-panel-gtk
+95         gnome-power-man
+90         artsd
+85         dhcdbd
+84         scim-bridge
+78         gnome-screensav
+66         scim-launcher
+[...]

+ If you prefer the output to display the process IDs instead of the process names, use the following script instead. +
syscalls_by_pid.stp
+ +
#! /usr/bin/env stap
+
+# Copyright (C) 2006 IBM Corp.
+#
+# This file is part of systemtap, and is free software.  You can
+# redistribute it and/or modify it under the terms of the GNU General
+# Public License (GPL); either version 2, or (at your option) any
+# later version.
+
+#
+# Print the system call count by process ID in descending order.
+#
+
+global syscalls
+
+probe begin {
+  print ("Collecting data... Type Ctrl-C to exit and display results\n")
+}
+
+probe syscall.* {
+  syscalls[pid()]++
+}
+
+probe end {
+  printf ("%-10s %-s\n", "#SysCalls", "PID")
+  foreach (pid in syscalls-)
+    printf("%-10d %-d\n", syscalls[pid], pid)
+}
+
+
+ As indicated in the output, you need to manually exit the script in order to display the results. You can add a timed expiration to either script by simply adding a timer.s() probe; for example, to instruct the script to expire after 5 seconds, add the following probe to the script: +
probe timer.s(5)
+{
+	exit()
+}
diff --git a/SystemTap_Beginners_Guide/systemtapscript-handler.html b/SystemTap_Beginners_Guide/systemtapscript-handler.html new file mode 100644 index 00000000..f0e50e24 --- /dev/null +++ b/SystemTap_Beginners_Guide/systemtapscript-handler.html @@ -0,0 +1,107 @@ + + +3.2.2. Systemtap Handler/Body

Product SiteDocumentation Site

3.2.2. Systemtap Handler/Body

+ Consider the following sample script: +
Example 3.4. helloworld.stp
probe begin
+{
+  printf ("hello world\n")
+  exit ()
+}

+ In Example 3.4, “helloworld.stp”, the event begin (i.e. the start of the session) triggers the handler enclosed in { }, which simply prints hello world followed by a new-line, then exits. +

Note

+ SystemTap scripts continue to run until the exit() function executes. If the users wants to stop the execution of the script, it can interrupted manually with Ctrl+C. +
printf ( ) Statements
+ The printf () statement is one of the simplest functions for printing data. printf () can also be used to display data using a wide variety of SystemTap functions in the following format: +
		printf ("format string\n", arguments)
+
+ The format string specifies how arguments should be printed. The format string of Example 3.4, “helloworld.stp” simply instructs SystemTap to print hello world, and contains no format specifiers. +
+ You can use the format specifiers %s (for strings) and %d (for numbers) in format strings, depending on your list of arguments. Format strings can have multiple format specifiers, each matching a corresponding argument; multiple arguments are delimited by a comma (,). +

Note

+ Semantically, the SystemTap printf function is very similar to its C language counterpart. The aforementioned syntax and format for SystemTap's printf function is identical to that of the C-style printf. +
+ To illustrate this, consider the following probe example: +
Example 3.5. variables-in-printf-statements.stp
probe syscall.open
+{
+  printf ("%s(%d) open\n", execname(), pid())
+}

+ Example 3.5, “variables-in-printf-statements.stp” instructs SystemTap to probe all entries to the system call open; for each event, it prints the current execname() (a string with the executable name) and pid() (the current process ID number), followed by the word open. A snippet of this probe's output would look like: +
vmware-guestd(2206) open
+hald(2360) open
+hald(2360) open
+hald(2360) open
+df(3433) open
+df(3433) open
+df(3433) open
+hald(2360) open
SystemTap Functions
+ SystemTap supports a wide variety of functions that can be used as printf () arguments. Example 3.5, “variables-in-printf-statements.stp” uses the SystemTap functions execname() (name of the process that called a kernel function/performed a system call) and pid() (current process ID). +
+ The following is a list of commonly-used SystemTap functions: +
tid()
+ The ID of the current thread. +
uid()
+ The ID of the current user. +
cpu()
+ The current CPU number. +
gettimeofday_s()
+ The number of seconds since UNIX epoch (January 1, 1970). +
ctime()
+ Convert number of seconds since UNIX epoch to date. +
pp()
+ A string describing the probe point currently being handled. +
thread_indent()
+ This particular function is quite useful, providing you with a way to better organize your print results. The function takes one argument, an indentation delta, which indicates how many spaces to add or remove from a thread's "indentation counter". It then returns a string with some generic trace data along with an appropriate number of indentation spaces. +
+ The generic data included in the returned string includes a timestamp (number of microseconds since the first call to thread_indent() by the thread), a process name, and the thread ID. This allows you to identify what functions were called, who called them, and the duration of each function call. +
+ If call entries and exits immediately precede each other, it is easy to match them. However, in most cases, after a first function call entry is made several other call entries and exits may be made before the first call exits. The indentation counter helps you match an entry with its corresponding exit by indenting the next function call if it is not the exit of the previous one. +
+ Consider the following example on the use of thread_indent(): +
Example 3.6. thread_indent.stp
probe kernel.function("*@net/socket.c").call
+{
+  printf ("%s -> %s\n", thread_indent(1), probefunc())
+}
+probe kernel.function("*@net/socket.c").return
+{
+  printf ("%s <- %s\n", thread_indent(-1), probefunc())
+}

+ Example 3.6, “thread_indent.stp” prints out the thread_indent() and probe functions at each event in the following format: +
0 ftp(7223): -> sys_socketcall
+1159 ftp(7223):  -> sys_socket
+2173 ftp(7223):   -> __sock_create
+2286 ftp(7223):    -> sock_alloc_inode
+2737 ftp(7223):    <- sock_alloc_inode
+3349 ftp(7223):    -> sock_alloc
+3389 ftp(7223):    <- sock_alloc
+3417 ftp(7223):   <- __sock_create
+4117 ftp(7223):   -> sock_create
+4160 ftp(7223):   <- sock_create
+4301 ftp(7223):   -> sock_map_fd
+4644 ftp(7223):    -> sock_map_file
+4699 ftp(7223):    <- sock_map_file
+4715 ftp(7223):   <- sock_map_fd
+4732 ftp(7223):  <- sys_socket
+4775 ftp(7223): <- sys_socketcall
+ This sample output contains the following information: +
  • + The time (in microseconds) since the initial thread_indent() call for the thread (included in the string from thread_indent()). +
  • + The process name (and its corresponding ID) that made the function call (included in the string from thread_indent()). +
  • + An arrow signifying whether the call was an entry (<-) or an exit (->); the indentations help you match specific function call entries with their corresponding exits. +
  • + The name of the function called by the process. +
name
+ Identifies the name of a specific system call. This variable can only be used in probes that use the event syscall.system_call. +
target()
+ Used in conjunction with stap script -x process ID or stap script -c command. If you want to specify a script to take an argument of a process ID or command, use target() as the variable in the script to refer to it. For example: +
Example 3.7. targetexample.stp
probe syscall.* {
+  if (pid() == target())
+    printf("%s/n", name)
+}

+ When Example 3.7, “targetexample.stp” is run with the argument -x process ID, it watches all system calls (as specified by the event syscall.*) and prints out the name of all system calls made by the specified process. +
+ This has the same effect as specifying if (pid() == process ID) each time you wish to target a specific process. However, using target() makes it easier for you to re-use the script, giving you the ability to simply pass a process ID as an argument each time you wish to run the script (e.g. stap targetexample.stp -x process ID). +
+ For more information about supported SystemTap functions, refer to man stapfuncs. +
diff --git a/SystemTap_Beginners_Guide/targetavailable.html b/SystemTap_Beginners_Guide/targetavailable.html new file mode 100644 index 00000000..4e6a60b0 --- /dev/null +++ b/SystemTap_Beginners_Guide/targetavailable.html @@ -0,0 +1,15 @@ + + +3.3.2.3. Checking Target Variable Availablility

Product SiteDocumentation Site

3.3.2.3. Checking Target Variable Availablility

+ As code evolves the target variables available may change. The @defined makes it easier to handle those variations in the available target variables. The @defined provides a test to see if a particular target variable is available. The result of this test can be used to select the appropriate expression. +
+ The Example 3.10, “Testing target variable available Example” from the memory.stp tapset provides an probe event alias. Some version of the kernel functions being probed have an argument $flags. When available, the $flags argument is used to generate the local variable write_access. The versions of the probed functions that do not have the $flags argument have a $write argument and that is used instead for the local variable write_access. +
Example 3.10. Testing target variable available Example
probe vm.pagefault = kernel.function("__handle_mm_fault@mm/memory.c") ?,
+                     kernel.function("handle_mm_fault@mm/memory.c") ?
+{
+        name = "pagefault"
+        write_access = (@defined($flags)
+			? $flags & FAULT_FLAG_WRITE : $write_access)
+	address =  $address
+}
+

diff --git a/SystemTap_Beginners_Guide/targetvariables.html b/SystemTap_Beginners_Guide/targetvariables.html new file mode 100644 index 00000000..c0af802b --- /dev/null +++ b/SystemTap_Beginners_Guide/targetvariables.html @@ -0,0 +1,47 @@ + + +3.3.2. Target Variables

Product SiteDocumentation Site

3.3.2. Target Variables

+ The probe events that map to actual locations in the code (for example kernel.function("function") and kernel.statement("statement")) allow the use of target variables to obtain the value of variables visible at that location in the code. You can use the -L option to list the target variable available at a probe point. If the debug information is installed for the running kernel, you can run the following command to find out what target variables are available for the vfs_read function: +
stap -L 'kernel.function("vfs_read")'
+ This will yield something similar to the following: +
kernel.function("vfs_read@fs/read_write.c:277") $file:struct file* $buf:char* $count:size_t $pos:loff_t*
+ Each target variable is proceeded by a “$” and the type of the target variable follows the “:”. The kernel's vfs_read function has $file (pointer to structure describing the file), $buf (pointer to the user-space memory to store the read data), $count (number of bytes to read), and $pos (position to start reading from in the file) target variables at the entry to the function. +
+ SystemTap tracks the typing information of the target variable and can examine the fields of a structure with the -> operator. The -> operator can be chained to look at data structures contained within data structures and follow pointers to other data structures. The -> operator will obtain the value in the field of the structure. The -> operator is used regardless whether accessing a field in a substructure or accessing another structure through a pointer. +
+ For pointers to base types such as integers and strings there are a number of functions listed below to access kernel-space data. The first argument for each functions is the pointer to the data item. Similar functions are described in Section 4.2, “Accessing User-Space Target Variables” for accessing target variables in user-space code. +
kernel_char(address)
+ Obtain the character at address from kernel memory. +
kernel_short(address)
+ Obtain the short at address from kernel memory. +
kernel_int(address)
+ Obtain the int at address from kernel memory. +
kernel_long(address)
+ Obtain the long at address from kernel memory +
kernel_string(address)
+ Obtain the string at address from kernel memory. +
kernel_string_n(address, n)
+ Obtain the string at address from the kernel memory and limits the string to n bytes. +

3.3.2.1. Pretty Printing Target Variables

+ SystemTap scripts are often used to observe what is happening within the code. In many cases just printing the values of the various context variables is sufficient. SystemTap makes a number operations available that can generate printable strings for target variables: +
$$vars
+ Expands to a character string that is equivalent to sprintf("parm1=%x ... parmN=%x var1=%x ... varN=%x", parm1, ..., parmN, var1, ..., varN) for each variable in scope at the probe point. Some values may be printed as “=?” if their run-time location cannot be found. +
$$locals
+ Expands to a subset of $$vars containing only the local variables. +
$$parms
+ Expands to a subset of $$vars containing only the function parameters. +
$$return
+ Is available in return probes only. It expands to a string that is equivalent to sprintf("return=%x", $return) if the probed function has a return value, or else an empty string. +
+ Below is a command-line script that prints the values of the parameters passed into the function vfs_read: +
stap -e 'probe kernel.function("vfs_read") {printf("%s\n", $$parms); exit(); }'
+ There are four parameters passed into vfs_read: file, buf, count, and pos. The $$parms generates a string for the parameters passed into the function. In this case all but the count parameter are pointers. The following is an example of the output from the previous command-line script: +
file=0xffff8800b40d4c80 buf=0x7fff634403e0 count=0x2004 pos=0xffff8800af96df48
+ Having the address a pointer points to may not be useful. You might be more interested in the fields of the data structure the pointer points to. You can use the the “$” suffix to pretty print the data structure. The following command-line example uses the pretty printing suffix to print more details about the data structures passed into the function vfs_read: +
stap -e 'probe kernel.function("vfs_read") {printf("%s\n", $$parms$); exit(); }'
+ The previous command line will generate something similar to the following with the fields of the data structure included in the output: +
file={.f_u={...}, .f_path={...}, .f_op=0xffffffffa06e1d80, .f_lock={...}, .f_count={...}, .f_flags=34818, .f_mode=31, .f_pos=0, .f_owner={...}, .f_cred=0xffff88013148fc80, .f_ra={...}, .f_version=0, .f_security=0xffff8800b8dce560, .private_data=0x0, .f_ep_links={...}, .f_mapping=0xffff880037f8fdf8} buf="" count=8196 pos=-131938753921208
+ With the “$” suffix fields that are composed of data structures are not expanded. The “$$” suffix will print the values contained within the nested data structures. Below is an example using the “$$” suffix: +
stap -e 'probe kernel.function("vfs_read") {printf("%s\n", $$parms$$); exit(); }'
+ The “$$” suffix, like all strings, is limited to the maximum string size. Below is a represenative output from the previous command-line script, which is truncated because of the string size limit: +
file={.f_u={.fu_list={.next=0xffff8801336ca0e8, .prev=0xffff88012ded0840}, .fu_rcuhead={.next=0xffff8801336ca0e8, .func=0xffff88012ded0840}}, .f_path={.mnt=0xffff880132fc97c0, .dentry=0xffff88001a889cc0}, .f_op=0xffffffffa06f64c0, .f_lock={.raw_lock={.slock=196611}}, .f_count={.counter=2}, .f_flags=34818, .f_mode=31, .f_pos=0, .f_owner={.lock={.raw_lock={.lock=16777216}}, .pid=0x0, .pid_type=0, .uid=0, .euid=0, .signum=0}, .f_cred=0xffff880130129a80, .f_ra={.start=0, .size=0, .async_size=0, .ra_pages=32, .
diff --git a/SystemTap_Beginners_Guide/threadtimessect.html b/SystemTap_Beginners_Guide/threadtimessect.html new file mode 100644 index 00000000..48d39dd3 --- /dev/null +++ b/SystemTap_Beginners_Guide/threadtimessect.html @@ -0,0 +1,67 @@ + + +5.3.3. Determining Time Spent in Kernel and User Space

Product SiteDocumentation Site

5.3.3. Determining Time Spent in Kernel and User Space

+ This section illustrates how to determine the amount of time any given thread is spending in either kernel or user-space. +
thread-times.stp
+ +
#! /usr/bin/env stap
+
+probe perf.sw.cpu_clock!, timer.profile {
+  // NB: To avoid contention on SMP machines, no global scalars/arrays used,
+  // only contention-free statistics aggregates.
+  tid=tid(); e=execname()
+  if (!user_mode())
+    kticks[e,tid] <<< 1
+  else
+    uticks[e,tid] <<< 1
+  ticks <<< 1
+  tids[e,tid] <<< 1
+}
+
+global uticks, kticks, ticks
+
+global tids
+
+probe timer.s(5), end {
+  allticks = @count(ticks)
+  printf ("%16s %5s %7s %7s (of %d ticks)\n",
+          "comm", "tid", "%user", "%kernel", allticks)
+  foreach ([e,tid] in tids- limit 20) {
+    uscaled = @count(uticks[e,tid])*10000/allticks
+    kscaled = @count(kticks[e,tid])*10000/allticks
+    printf ("%16s %5d %3d.%02d%% %3d.%02d%%\n",
+      e, tid, uscaled/100, uscaled%100, kscaled/100, kscaled%100)
+  }
+  printf("\n")
+
+  delete uticks
+  delete kticks
+  delete ticks
+  delete tids
+}
+
+
+ thread-times.stp lists the top 20 processes currently taking up CPU time within a 5-second sample, along with the total number of CPU ticks made during the sample. The output of this script also notes the percentage of CPU time each process used, as well as whether that time was spent in kernel space or user space. +
+ Example 5.15, “thread-times.stp Sample Output” contains a 5-second sample of the output for thread-times.stp: +
Example 5.15. thread-times.stp Sample Output
  tid   %user %kernel (of 20002 ticks)
+    0   0.00%  87.88%
+32169   5.24%   0.03%
+ 9815   3.33%   0.36%
+ 9859   0.95%   0.00%
+ 3611   0.56%   0.12%
+ 9861   0.62%   0.01%
+11106   0.37%   0.02%
+32167   0.08%   0.08%
+ 3897   0.01%   0.08%
+ 3800   0.03%   0.00%
+ 2886   0.02%   0.00%
+ 3243   0.00%   0.01%
+ 3862   0.01%   0.00%
+ 3782   0.00%   0.00%
+21767   0.00%   0.00%
+ 2522   0.00%   0.00%
+ 3883   0.00%   0.00%
+ 3775   0.00%   0.00%
+ 3943   0.00%   0.00%
+ 3873   0.00%   0.00%

diff --git a/SystemTap_Beginners_Guide/timeoutssect.html b/SystemTap_Beginners_Guide/timeoutssect.html new file mode 100644 index 00000000..d9c57414 --- /dev/null +++ b/SystemTap_Beginners_Guide/timeoutssect.html @@ -0,0 +1,148 @@ + + +5.3.4. Monitoring Polling Applications

Product SiteDocumentation Site

5.3.4. Monitoring Polling Applications

+ This section describes how to identify and monitor which applications are polling. Doing so allows you to track unnecessary or excessive polling, which can help you pinpoint areas for improvement in terms of CPU usage and power savings. +
timeout.stp
+ +
#! /usr/bin/env stap
+# Copyright (C) 2009 Red Hat, Inc.
+# Written by Ulrich Drepper <drepper@redhat.com>
+# Modified by William Cohen <wcohen@redhat.com>
+
+global process, timeout_count, to
+global poll_timeout, epoll_timeout, select_timeout, itimer_timeout
+global nanosleep_timeout, futex_timeout, signal_timeout
+
+probe syscall.poll, syscall.epoll_wait {
+  if (timeout) to[pid()]=timeout
+}
+
+probe syscall.poll.return {
+  p = pid()
+  if ($return == 0 && to[p] > 0 ) {
+    poll_timeout[p]++
+    timeout_count[p]++
+    process[p] = execname()
+    delete to[p]
+  }
+}
+
+probe syscall.epoll_wait.return {
+  p = pid()
+  if ($return == 0 && to[p] > 0 ) {
+    epoll_timeout[p]++
+    timeout_count[p]++
+    process[p] = execname()
+    delete to[p]
+  }
+}
+
+probe syscall.select.return {
+  if ($return == 0) {
+    p = pid()
+    select_timeout[p]++
+    timeout_count[p]++
+    process[p] = execname()
+  }
+}
+
+probe syscall.futex.return {
+  if (errno_str($return) == "ETIMEDOUT") {
+    p = pid()
+    futex_timeout[p]++
+    timeout_count[p]++
+    process[p] = execname()
+  }
+}
+
+probe syscall.nanosleep.return {
+  if ($return == 0) {
+    p = pid()
+    nanosleep_timeout[p]++
+    timeout_count[p]++
+    process[p] = execname()
+  }
+}
+
+probe kernel.function("it_real_fn") {
+  p = pid()
+  itimer_timeout[p]++
+  timeout_count[p]++
+  process[p] = execname()
+}
+
+probe syscall.rt_sigtimedwait.return {
+  if (errno_str($return) == "EAGAIN") {
+    p = pid()
+    signal_timeout[p]++
+    timeout_count[p]++
+    process[p] = execname()
+  }
+}
+
+probe syscall.exit {
+  p = pid()
+  if (p in process) {
+    delete process[p]
+    delete timeout_count[p]
+    delete poll_timeout[p]
+    delete epoll_timeout[p]
+    delete select_timeout[p]
+    delete itimer_timeout[p]
+    delete futex_timeout[p]
+    delete nanosleep_timeout[p]
+    delete signal_timeout[p]
+  }
+}
+
+probe timer.s(1) {
+  ansi_clear_screen()
+  printf ("  pid |   poll  select   epoll  itimer   futex nanosle  signal| process\n")
+  foreach (p in timeout_count- limit 20) {
+     printf ("%5d |%7d %7d %7d %7d %7d %7d %7d| %-.38s\n", p,
+              poll_timeout[p], select_timeout[p],
+              epoll_timeout[p], itimer_timeout[p],
+              futex_timeout[p], nanosleep_timeout[p],
+              signal_timeout[p], process[p])
+  }
+}
+
+
+ timeout.stp tracks how many times each of the following system calls completed due to time expiring rather than due to an actual event occurring: +
  • + poll +
  • + select +
  • + epoll +
  • + itimer +
  • + futex +
  • + nanosleep +
  • + signal +
Example 5.16. timeout.stp Sample Output
  uid |   poll  select   epoll  itimer   futex nanosle  signal| process
+28937 | 148793       0       0    4727   37288       0       0| firefox
+22945 |      0   56949       0       1       0       0       0| scim-bridge
+    0 |      0       0       0   36414       0       0       0| swapper
+ 4275 |  23140       0       0       1       0       0       0| mixer_applet2
+ 4191 |      0   14405       0       0       0       0       0| scim-launcher
+22941 |   7908       1       0      62       0       0       0| gnome-terminal
+ 4261 |      0       0       0       2       0    7622       0| escd
+ 3695 |      0       0       0       0       0    7622       0| gdm-binary
+ 3483 |      0    7206       0       0       0       0       0| dhcdbd
+ 4189 |   6916       0       0       2       0       0       0| scim-panel-gtk
+ 1863 |   5767       0       0       0       0       0       0| iscsid
+ 2562 |      0    2881       0       1       0    1438       0| pcscd
+ 4257 |   4255       0       0       1       0       0       0| gnome-power-man
+ 4278 |   3876       0       0      60       0       0       0| multiload-apple
+ 4083 |      0    1331       0    1728       0       0       0| Xorg
+ 3921 |   1603       0       0       0       0       0       0| gam_server
+ 4248 |   1591       0       0       0       0       0       0| nm-applet
+ 3165 |      0    1441       0       0       0       0       0| xterm
+29548 |      0    1440       0       0       0       0       0| httpd
+ 1862 |      0       0       0       0       0    1438       0| iscsid

+ You can increase the sample time by editing the second probe (timer.s(1)). The output of timeout.stp contains the name and UID of the top 20 polling applications, along with how many times each application performed each polling system call (over time). Example 5.16, “timeout.stp Sample Output” contains an excerpt of the script. In this particular example firefox is doing an excessive amount of polling due to a plugin module. +
diff --git a/SystemTap_Beginners_Guide/topsyssect.html b/SystemTap_Beginners_Guide/topsyssect.html new file mode 100644 index 00000000..ab461d9c --- /dev/null +++ b/SystemTap_Beginners_Guide/topsyssect.html @@ -0,0 +1,56 @@ + + +5.3.5. Tracking Most Frequently Used System Calls

Product SiteDocumentation Site

5.3.5. Tracking Most Frequently Used System Calls

+ timeout.stp from Section 5.3.4, “Monitoring Polling Applications” helps you identify which applications are polling by examining a small subset of system calls ( poll, select, epoll, itimer, futex, nanosleep, and signal). However, in some systems, an excessive number of system calls outside that small subset might be responsible for time spent in the kernel. If you suspect that an application is using system calls excessively, you need to identify the most frequently used system calls on the system. To do this, use topsys.stp. +
topsys.stp
+ +
#! /usr/bin/env stap
+#
+# This script continuously lists the top 20 systemcalls in the interval 
+# 5 seconds
+#
+
+global syscalls_count
+
+probe syscall.* {
+  syscalls_count[name]++
+}
+
+function print_systop () {
+  printf ("%25s %10s\n", "SYSCALL", "COUNT")
+  foreach (syscall in syscalls_count- limit 20) {
+    printf("%25s %10d\n", syscall, syscalls_count[syscall])
+  }
+  delete syscalls_count
+}
+
+probe timer.s(5) {
+  print_systop ()
+  printf("--------------------------------------------------------------\n")
+}
+
+
+ topsys.stp lists the top 20 system calls used by the system per 5-second interval. It also lists how many times each system call was used during that period. Refer to Example 5.17, “topsys.stp Sample Output” for a sample output. +
Example 5.17. topsys.stp Sample Output
--------------------------------------------------------------
+                  SYSCALL      COUNT
+             gettimeofday       1857
+                     read       1821
+                    ioctl       1568
+                     poll       1033
+                    close        638
+                     open        503
+                   select        455
+                    write        391
+                   writev        335
+                    futex        303
+                  recvmsg        251
+                   socket        137
+            clock_gettime        124
+           rt_sigprocmask        121
+                   sendto        120
+                setitimer        106
+                     stat         90
+                     time         81
+                sigreturn         72
+                    fstat         66
+--------------------------------------------------------------

diff --git a/SystemTap_Beginners_Guide/traceio2sect.html b/SystemTap_Beginners_Guide/traceio2sect.html new file mode 100644 index 00000000..3e4b7adb --- /dev/null +++ b/SystemTap_Beginners_Guide/traceio2sect.html @@ -0,0 +1,41 @@ + + +5.2.4. I/O Monitoring (By Device)

Product SiteDocumentation Site

5.2.4. I/O Monitoring (By Device)

+ This section describes how to monitor I/O activity on a specific device. +
traceio2.stp
+ +
#! /usr/bin/env stap
+
+global device_of_interest
+
+probe begin {
+  /* The following is not the most efficient way to do this.
+      One could directly put the result of usrdev2kerndev()
+      into device_of_interest.  However, want to test out
+      the other device functions */
+  dev = usrdev2kerndev($1)
+  device_of_interest = MKDEV(MAJOR(dev), MINOR(dev))
+}
+
+probe vfs.write, vfs.read
+{
+  if (dev == device_of_interest)
+    printf ("%s(%d) %s 0x%x\n",
+            execname(), pid(), probefunc(), dev)
+}
+
+
+ traceio2.stp takes 1 argument: the whole device number. To get this number, use stat -c "0x%D" directory, where directory is located in the device you wish to monitor. +
+ The usrdev2kerndev() function converts the whole device number into the format understood by the kernel. The output produced by usrdev2kerndev() is used in conjunction with the MKDEV(), MINOR(), and MAJOR() functions to determine the major and minor numbers of a specific device. +
+ The output of traceio2.stp includes the name and ID of any process performing a read/write, the function it is performing (i.e. vfs_read or vfs_write), and the kernel device number. +
+ The following example is an excerpt from the full output of stap traceio2.stp 0x805, where 0x805 is the whole device number of /home. /home resides in /dev/sda5, which is the device we wish to monitor. +
Example 5.9. traceio2.stp Sample Output
[...]
+synergyc(3722) vfs_read 0x800005
+synergyc(3722) vfs_read 0x800005
+cupsd(2889) vfs_write 0x800005
+cupsd(2889) vfs_write 0x800005
+cupsd(2889) vfs_write 0x800005
+[...]

diff --git a/SystemTap_Beginners_Guide/traceiosect.html b/SystemTap_Beginners_Guide/traceiosect.html new file mode 100644 index 00000000..961f35ba --- /dev/null +++ b/SystemTap_Beginners_Guide/traceiosect.html @@ -0,0 +1,78 @@ + + +5.2.3. Track Cumulative IO

Product SiteDocumentation Site

5.2.3. Track Cumulative IO

+ This section describes how to track the cumulative amount of I/O to the system. +
traceio.stp
+ +
#! /usr/bin/env stap
+# traceio.stp
+# Copyright (C) 2007 Red Hat, Inc., Eugene Teo <eteo@redhat.com>
+# Copyright (C) 2009 Kai Meyer <kai@unixlords.com>
+#   Fixed a bug that allows this to run longer
+#   And added the humanreadable function
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+
+global reads, writes, total_io
+
+probe vfs.read.return {
+  reads[pid(),execname()] += $return
+  total_io[pid(),execname()] += $return
+}
+
+probe vfs.write.return {
+  writes[pid(),execname()] += $return
+  total_io[pid(),execname()] += $return
+}
+
+function humanreadable(bytes) {
+  if (bytes > 1024*1024*1024) {
+    return sprintf("%d GiB", bytes/1024/1024/1024)
+  } else if (bytes > 1024*1024) {
+    return sprintf("%d MiB", bytes/1024/1024)
+  } else if (bytes > 1024) {
+    return sprintf("%d KiB", bytes/1024)
+  } else {
+    return sprintf("%d   B", bytes)
+  }
+}
+
+probe timer.s(1) {
+  foreach([p,e] in total_io- limit 10)
+    printf("%8d %15s r: %12s w: %12s\n",
+           p, e, humanreadable(reads[p,e]),
+           humanreadable(writes[p,e]))
+  printf("\n")
+  # Note we don't zero out reads, writes and total_io,
+  # so the values are cumulative since the script started.
+}
+
+
+ traceio.stp prints the top ten executables generating I/O traffic over time. In addition, it also tracks the cumulative amount of I/O reads and writes done by those ten executables. This information is tracked and printed out in 1-second intervals, and in descending order. +
+ Note that traceio.stp also uses the local variable $return, which is also used by disktop.stp from Section 5.2.1, “Summarizing Disk Read/Write Traffic”. +
Example 5.8. traceio.stp Sample Output
[...]
+           Xorg r:   583401 KiB w:        0 KiB
+       floaters r:       96 KiB w:     7130 KiB
+multiload-apple r:      538 KiB w:      537 KiB
+           sshd r:       71 KiB w:       72 KiB
+pam_timestamp_c r:      138 KiB w:        0 KiB
+        staprun r:       51 KiB w:       51 KiB
+          snmpd r:       46 KiB w:        0 KiB
+          pcscd r:       28 KiB w:        0 KiB
+     irqbalance r:       27 KiB w:        4 KiB
+          cupsd r:        4 KiB w:       18 KiB
+
+           Xorg r:   588140 KiB w:        0 KiB
+       floaters r:       97 KiB w:     7143 KiB
+multiload-apple r:      543 KiB w:      542 KiB
+           sshd r:       72 KiB w:       72 KiB
+pam_timestamp_c r:      138 KiB w:        0 KiB
+        staprun r:       51 KiB w:       51 KiB
+          snmpd r:       46 KiB w:        0 KiB
+          pcscd r:       28 KiB w:        0 KiB
+     irqbalance r:       27 KiB w:        4 KiB
+          cupsd r:        4 KiB w:       18 KiB

diff --git a/SystemTap_Beginners_Guide/typecasting.html b/SystemTap_Beginners_Guide/typecasting.html new file mode 100644 index 00000000..c39ecaad --- /dev/null +++ b/SystemTap_Beginners_Guide/typecasting.html @@ -0,0 +1,11 @@ + + +3.3.2.2. Typecasting

Product SiteDocumentation Site

3.3.2.2. Typecasting

+ In most cases SystemTap can determine a variable's type from the debug information. However, code may use void pointers for variables (for example memory allocation routines) and typing information is not available. Also the typing information available within a probe handler is not available within a function; SystemTap functions arguments use a long in place of a typed pointer. SystemTap's @cast operator (first available in SystemTap 0.9) can be used to indicate the correct type of the object. +
+ The Example 3.9, “Casting Example” is from the task.stp tapset. The function returns the value of the state field from a task_struct pointed to by the long task. The first argument of the @cast operator, task, is the pointer to the object. The second argument is the type to cast the object to, task_struct. The third arument lists what file that the type definition information comes from and is optional. With the @cast operator the various fields of this particular task_struct task can be accessed; in this example the state field is obtained. +
Example 3.9. Casting Example
function task_state:long (task:long)
+{
+    return @cast(task, "task_struct", "kernel<linux/sched.h>")->state
+}
+

diff --git a/SystemTap_Beginners_Guide/understanding-how-systemtap-works.html b/SystemTap_Beginners_Guide/understanding-how-systemtap-works.html new file mode 100644 index 00000000..cb9385e1 --- /dev/null +++ b/SystemTap_Beginners_Guide/understanding-how-systemtap-works.html @@ -0,0 +1,23 @@ + + +Chapter 3. Understanding How SystemTap Works

Product SiteDocumentation Site

Chapter 3. Understanding How SystemTap Works

+ SystemTap allows users to write and reuse simple scripts to deeply examine the activities of a running Linux system. These scripts can be designed to extract data, filter it, and summarize it quickly (and safely), enabling the diagnosis of complex performance (or even functional) problems. +
+ The essential idea behind a SystemTap script is to name events, and to give them handlers. When SystemTap runs the script, SystemTap monitors for the event; once the event occurs, the Linux kernel then runs the handler as a quick sub-routine, then resumes. +
+ There are several kind of events; entering/exiting a function, timer expiration, session termination, etc. A handler is a series of script language statements that specify the work to be done whenever the event occurs. This work normally includes extracting data from the event context, storing them into internal variables, and printing results. +

3.1. Architecture

+ A SystemTap session begins when you run a SystemTap script. This session occurs in the following fashion: +
Procedure 3.1. SystemTap Session
  1. + First, SystemTap checks the script against the existing tapset library (normally in /usr/share/systemtap/tapset/ for any tapsets used. SystemTap will then substitute any located tapsets with their corresponding definitions in the tapset library. +
  2. + SystemTap then translates the script to C, running the system C compiler to create a kernel module from it. The tools that perform this step are contained in the systemtap package (refer to Section 2.1.1, “Installing SystemTap” for more information). +
  3. + SystemTap loads the module, then enables all the probes (events and handlers) in the script. The staprun in the systemtap-runtime package (refer to Section 2.1.1, “Installing SystemTap” for more information) provides this functionality. +
  4. + As the events occur, their corresponding handlers are executed. +
  5. + Once the SystemTap session is terminated, the probes are disabled, and the kernel module is unloaded. +
+ This sequence is driven from a single command-line program: stap. This program is SystemTap's main front-end tool. For more information about stap, refer to man stap (once SystemTap is properly installed on your machine). +
diff --git a/SystemTap_Beginners_Guide/understanding-tapsets.html b/SystemTap_Beginners_Guide/understanding-tapsets.html new file mode 100644 index 00000000..05f8164d --- /dev/null +++ b/SystemTap_Beginners_Guide/understanding-tapsets.html @@ -0,0 +1,11 @@ + + +3.6. Tapsets

Product SiteDocumentation Site

3.6. Tapsets

+ Tapsets are scripts that form a library of pre-written probes and functions to be used in SystemTap scripts. When a user runs a SystemTap script, SystemTap checks the script's probe events and handlers against the tapset library; SystemTap then loads the corresponding probes and functions before translating the script to C (refer to Section 3.1, “Architecture” for information on what transpires in a SystemTap session). +
+ Like SystemTap scripts, tapsets use the file name extension .stp. The standard library of tapsets is located in /usr/share/systemtap/tapset/ by default. However, unlike SystemTap scripts, tapsets are not meant for direct execution; rather, they constitute the library from which other scripts can pull definitions. +
+ Simply put, the tapset library is an abstraction layer designed to make it easier for users to define events and functions. In a manner of speaking, tapsets provide useful aliases for functions that users may want to specify as an event; knowing the proper alias to use is, for the most part, easier than remembering specific kernel functions that might vary between kernel versions. +
+ Several handlers and functions in Section 3.2.1, “Event” and SystemTap Functions are defined in tapsets. For example, thread_indent() is defined in indent.stp. +
diff --git a/SystemTap_Beginners_Guide/useful-systemtap-scripts.html b/SystemTap_Beginners_Guide/useful-systemtap-scripts.html new file mode 100644 index 00000000..7d70ce99 --- /dev/null +++ b/SystemTap_Beginners_Guide/useful-systemtap-scripts.html @@ -0,0 +1,298 @@ + + +Chapter 5. Useful SystemTap Scripts

Product SiteDocumentation Site

Chapter 5. Useful SystemTap Scripts

+ This chapter enumerates several SystemTap scripts you can use to monitor and investigate different subsystems. All of these scripts are available at /usr/share/systemtap/testsuite/systemtap.examples/ once you install the systemtap-testsuite RPM. +

5.1. Network

+ The following sections showcase scripts that trace network-related functions and build a profile of network activity. +

5.1.1. Network Profiling

+ This section describes how to profile network activity. nettop.stp provides a glimpse into how much network traffic each process is generating on a machine. +
nettop.stp
+ +
#! /usr/bin/env stap
+
+global ifxmit, ifrecv
+global ifmerged
+
+probe netdev.transmit
+{
+  ifxmit[pid(), dev_name, execname(), uid()] <<< length
+}
+
+probe netdev.receive
+{
+  ifrecv[pid(), dev_name, execname(), uid()] <<< length
+}
+
+function print_activity()
+{
+  printf("%5s %5s %-7s %7s %7s %7s %7s %-15s\n",
+         "PID", "UID", "DEV", "XMIT_PK", "RECV_PK",
+         "XMIT_KB", "RECV_KB", "COMMAND")
+
+  foreach ([pid, dev, exec, uid] in ifrecv) {
+	  ifmerged[pid, dev, exec, uid] += @count(ifrecv[pid,dev,exec,uid]);
+  }
+  foreach ([pid, dev, exec, uid] in ifxmit) {
+	  ifmerged[pid, dev, exec, uid] += @count(ifxmit[pid,dev,exec,uid]);
+  }
+  foreach ([pid, dev, exec, uid] in ifmerged-) {
+    n_xmit = @count(ifxmit[pid, dev, exec, uid])
+    n_recv = @count(ifrecv[pid, dev, exec, uid])
+    printf("%5d %5d %-7s %7d %7d %7d %7d %-15s\n",
+           pid, uid, dev, n_xmit, n_recv,
+           n_xmit ? @sum(ifxmit[pid, dev, exec, uid])/1024 : 0,
+           n_recv ? @sum(ifrecv[pid, dev, exec, uid])/1024 : 0,
+           exec)
+  }
+
+  print("\n")
+
+  delete ifxmit
+  delete ifrecv
+  delete ifmerged
+}
+
+probe timer.ms(5000), end, error
+{
+  print_activity()
+}
+
+
+ Note that function print_activity() uses the following expressions: +
n_xmit ? @sum(ifxmit[pid, dev, exec, uid])/1024 : 0
+n_recv ? @sum(ifrecv[pid, dev, exec, uid])/1024 : 0
+ These expressions are if/else conditionals. The first statement is simply a more concise way of writing the following psuedo code: +
if n_recv != 0 then
+  @sum(ifrecv[pid, dev, exec, uid])/1024
+else
+  0
+ nettop.stp tracks which processes are generating network traffic on the system, and provides the following information about each process: +
  • + PID — the ID of the listed process. +
  • + UID — user ID. A user ID of 0 refers to the root user. +
  • + DEV — which ethernet device the process used to send / receive data (e.g. eth0, eth1) +
  • + XMIT_PK — number of packets transmitted by the process +
  • + RECV_PK — number of packets received by the process +
  • + XMIT_KB — amount of data sent by the process, in kilobytes +
  • + RECV_KB — amount of data received by the service, in kilobytes +
+ nettop.stp provides network profile sampling every 5 seconds. You can change this setting by editing probe timer.ms(5000) accordingly. Example 5.1, “nettop.stp Sample Output” contains an excerpt of the output from nettop.stp over a 20-second period: +
Example 5.1. nettop.stp Sample Output
[...]
+  PID   UID DEV     XMIT_PK RECV_PK XMIT_KB RECV_KB COMMAND
+    0     0 eth0          0       5       0       0 swapper
+11178     0 eth0          2       0       0       0 synergyc
+
+  PID   UID DEV     XMIT_PK RECV_PK XMIT_KB RECV_KB COMMAND
+ 2886     4 eth0         79       0       5       0 cups-polld
+11362     0 eth0          0      61       0       5 firefox
+    0     0 eth0          3      32       0       3 swapper
+ 2886     4 lo            4       4       0       0 cups-polld
+11178     0 eth0          3       0       0       0 synergyc
+
+  PID   UID DEV     XMIT_PK RECV_PK XMIT_KB RECV_KB COMMAND
+    0     0 eth0          0       6       0       0 swapper
+ 2886     4 lo            2       2       0       0 cups-polld
+11178     0 eth0          3       0       0       0 synergyc
+ 3611     0 eth0          0       1       0       0 Xorg
+
+  PID   UID DEV     XMIT_PK RECV_PK XMIT_KB RECV_KB COMMAND
+    0     0 eth0          3      42       0       2 swapper
+11178     0 eth0         43       1       3       0 synergyc
+11362     0 eth0          0       7       0       0 firefox
+ 3897     0 eth0          0       1       0       0 multiload-apple
+[...]

5.1.2. Tracing Functions Called in Network Socket Code

+ This section describes how to trace functions called from the kernel's net/socket.c file. This task helps you identify, in finer detail, how each process interacts with the network at the kernel level. +
socket-trace.stp
+ +
#! /usr/bin/env stap
+
+probe kernel.function("*@net/socket.c").call {
+  printf ("%s -> %s\n", thread_indent(1), probefunc())
+}
+probe kernel.function("*@net/socket.c").return {
+  printf ("%s <- %s\n", thread_indent(-1), probefunc())
+}
+
+
+ socket-trace.stp is identical to Example 3.6, “thread_indent.stp”, which was earlier used in SystemTap Functions to illustrate how thread_indent() works. +
Example 5.2. socket-trace.stp Sample Output
[...]
+0 Xorg(3611): -> sock_poll
+3 Xorg(3611): <- sock_poll
+0 Xorg(3611): -> sock_poll
+3 Xorg(3611): <- sock_poll
+0 gnome-terminal(11106): -> sock_poll
+5 gnome-terminal(11106): <- sock_poll
+0 scim-bridge(3883): -> sock_poll
+3 scim-bridge(3883): <- sock_poll
+0 scim-bridge(3883): -> sys_socketcall
+4 scim-bridge(3883):  -> sys_recv
+8 scim-bridge(3883):   -> sys_recvfrom
+12 scim-bridge(3883):-> sock_from_file
+16 scim-bridge(3883):<- sock_from_file
+20 scim-bridge(3883):-> sock_recvmsg
+24 scim-bridge(3883):<- sock_recvmsg
+28 scim-bridge(3883):   <- sys_recvfrom
+31 scim-bridge(3883):  <- sys_recv
+35 scim-bridge(3883): <- sys_socketcall
+[...]

+ Example 5.2, “socket-trace.stp Sample Output” contains a 3-second excerpt of the output for socket-trace.stp. For more information about the output of this script as provided by thread_indent(), refer to SystemTap Functions Example 3.6, “thread_indent.stp”. +

5.1.3. Monitoring Incoming TCP Connections

+ This section illustrates how to monitor incoming TCP connections. This task is useful in identifying any unauthorized, suspicious, or otherwise unwanted network access requests in real time. +
tcp_connections.stp
+ +
#! /usr/bin/env stap
+
+probe begin {
+  printf("%6s %16s %6s %6s %16s\n",
+         "UID", "CMD", "PID", "PORT", "IP_SOURCE")
+}
+
+probe kernel.function("tcp_accept").return?,
+      kernel.function("inet_csk_accept").return? {
+  sock = $return
+  if (sock != 0)
+    printf("%6d %16s %6d %6d %16s\n", uid(), execname(), pid(),
+           inet_get_local_port(sock), inet_get_ip_source(sock))
+}
+
+
+ While tcp_connections.stp is running, it will print out the following information about any incoming TCP connections accepted by the system in real time: +
  • + Current UID +
  • + CMD - the command accepting the connection +
  • + PID of the command +
  • + Port used by the connection +
  • + IP address from which the TCP connection originated +
Example 5.3. tcp_connections.stp Sample Output
UID            CMD    PID   PORT        IP_SOURCE
+0             sshd   3165     22      10.64.0.227
+0             sshd   3165     22      10.64.0.227

5.1.4. Monitoring TCP Packets

+ This section illustrates how to monitor TCP packets received by the system. This is useful in analyzing network traffic generated by applications running on the system. +
tcpdumplike.stp
+ +
	#! /usr/bin/env stap
+
+// A TCP dump like example
+
+probe begin, timer.s(1) {
+  printf("-----------------------------------------------------------------\n")
+  printf("       Source IP         Dest IP  SPort  DPort  U  A  P  R  S  F \n")
+  printf("-----------------------------------------------------------------\n")
+}
+
+probe tcp.receive {
+  printf(" %15s %15s  %5d  %5d  %d  %d  %d  %d  %d  %d\n",
+         saddr, daddr, sport, dport, urg, ack, psh, rst, syn, fin)
+}
+
+
+ While tcpdumplike.stp is running, it will print out the following information about any received TCP packets in real time: +
  • + Source and destination IP address (saddr, daddr, respectively) +
  • + Source and destination ports (sport, dport, respectively) +
  • + Packet flags +
+ To determine the flags used by the packet, tcpdumplike.stp uses the following functions: +
  • + urg - urgent +
  • + ack - acknowledgement +
  • + psh - push +
  • + rst - reset +
  • + syn - synchronize +
  • + fin - finished +
+ The aforementioned functions return 1 or 0 to specify whether the packet uses the corresponding flag. +
Example 5.4. tcpdumplike.stp Sample Output
-----------------------------------------------------------------
+       Source IP         Dest IP  SPort  DPort  U  A  P  R  S  F
+-----------------------------------------------------------------
+  209.85.229.147       10.0.2.15     80  20373  0  1  1  0  0  0
+  92.122.126.240       10.0.2.15     80  53214  0  1  0  0  1  0
+  92.122.126.240       10.0.2.15     80  53214  0  1  0  0  0  0
+  209.85.229.118       10.0.2.15     80  63433  0  1  0  0  1  0
+  209.85.229.118       10.0.2.15     80  63433  0  1  0  0  0  0
+  209.85.229.147       10.0.2.15     80  21141  0  1  1  0  0  0
+  209.85.229.147       10.0.2.15     80  21141  0  1  1  0  0  0
+  209.85.229.147       10.0.2.15     80  21141  0  1  1  0  0  0
+  209.85.229.147       10.0.2.15     80  21141  0  1  1  0  0  0
+  209.85.229.147       10.0.2.15     80  21141  0  1  1  0  0  0
+  209.85.229.118       10.0.2.15     80  63433  0  1  1  0  0  0
+[...]

5.1.5. Monitoring Network Packets Drops in Kernel

+ + The network stack in Linux can discard packets for various reasons. Some Linux kernels include a tracepoint, kernel.trace("kfree_skb"), which easily tracks where packets are discarded. dropwatch.stp uses kernel.trace("kfree_skb") to trace packet discards; the script summarizes which locations discard packets every five-second interval. +
dropwatch.stp
+ +
#! /usr/bin/env stap
+
+############################################################
+# Dropwatch.stp
+# Author: Neil Horman <nhorman@redhat.com>
+# An example script to mimic the behavior of the dropwatch utility
+# http://fedorahosted.org/dropwatch
+############################################################
+
+# Array to hold the list of drop points we find
+global locations
+
+# Note when we turn the monitor on and off
+probe begin { printf("Monitoring for dropped packets\n") }
+probe end { printf("Stopping dropped packet monitor\n") }
+
+# increment a drop counter for every location we drop at
+probe kernel.trace("kfree_skb") { locations[$location] <<< 1 }
+
+# Every 5 seconds report our drop locations
+probe timer.sec(5)
+{
+  printf("\n")
+  foreach (l in locations-) {
+    printf("%d packets dropped at %s\n",
+           @count(locations[l]), symname(l))
+  }
+  delete locations
+}
+
+
+ The kernel.trace("kfree_skb") traces which places in the kernel drop network packets. The kernel.trace("kfree_skb") has two arguments: a pointer to the buffer being freed ($skb) and the location in kernel code the buffer is being freed ($location). The dropwatch.stp script provides the function containing $location where possible. The information to map $location back to the function is not in the instrumentation by default. On Systemtap 1.4 the --all-modules option will include the required mapping information and the following command can be used to run the script: +
stap --all-modules dropwatch.stp
+ On older versions of Systemtap you can use the following command to emulate the --all-modules option: +
stap -dkernel \
+`cat /proc/modules | awk 'BEGIN { ORS = " " } {print "-d"$1}'` \
+dropwatch.stp
+ Running the dropwatch.stp script 15 seconds would result in output similar in Example 5.5, “dropwatch.stp Sample Output”. The output lists the number of misses for each tracepoint location with either the function name or the address. +
Example 5.5. dropwatch.stp Sample Output
Monitoring for dropped packets
+
+1762 packets dropped at unix_stream_recvmsg
+4 packets dropped at tun_do_read
+2 packets dropped at nf_hook_slow
+
+467 packets dropped at unix_stream_recvmsg
+20 packets dropped at nf_hook_slow
+6 packets dropped at tun_do_read
+
+446 packets dropped at unix_stream_recvmsg
+4 packets dropped at tun_do_read
+4 packets dropped at nf_hook_slow
+Stopping dropped packet monitor
+

+ When the script is being compiled on one machine and run on another the --all-modules and /proc/modules directory are not available; the symname function will just print out the raw address. To make the raw address of packet drops more meaningful, refer to the /boot/System.map-`uname -r` file. This file lists the starting addresses for each function, allowing you to map the addresses in the output of Example 5.5, “dropwatch.stp Sample Output” to a specific function name. Given the following snippet of the /boot/System.map-`uname -r` file, the address 0xffffffff8149a8ed maps to the function unix_stream_recvmsg: +
[...]
+ffffffff8149a420 t unix_dgram_poll
+ffffffff8149a5e0 t unix_stream_recvmsg
+ffffffff8149ad00 t unix_find_other
+[...]
diff --git a/SystemTap_Beginners_Guide/userspace-probing.html b/SystemTap_Beginners_Guide/userspace-probing.html new file mode 100644 index 00000000..c0e1c929 --- /dev/null +++ b/SystemTap_Beginners_Guide/userspace-probing.html @@ -0,0 +1,35 @@ + + +Chapter 4. User-Space Probing

Product SiteDocumentation Site

Chapter 4. User-Space Probing

+ SystemTap initially focused on kernel-space probing. However, there are many instances where user-space probing can help diagnose a problem. SystemTap 0.6 added support to allow probing user-space processes. SystemTap includes support for probing the entry into and return from a function in user-space processes, probing predefined markers in user-space code, and monitoring user-process events. +
+ The SystemTap user-space probing requires the utrace kernel extensions which provide an API for tracking various user-space events. More details about the utrace infrastructure are available at http://sourceware.org/systemtap/wiki/utrace. The following command determines whether the currently running Linux kernel provides the needed utrace support: +
grep CONFIG_UTRACE /boot/config-`uname -r`
+ If the Linux kernel support user-space probing, the following output is printed: +
CONFIG_UTRACE=y
+ The SystemTap user-space probing also needs the uprobes kernel module. If the uprobes kernel module is not available, you will see an error message like the following when attempting to run a script that requires the uprobes kernel module: +
SystemTap's version of uprobes is out of date.
+As root, or a member of the 'root' group, run
+"make -C /usr/share/systemtap/runtime/uprobes".
+Pass 4: compilation failed.  Try again with another '--vp 0001' option.
+ If this occurs, you need to generate a uprobes.ko module for the kernel as directed. +

4.1. User-Space Events

+ All user-space event probes begin with process. The process events can be limited to a specific running process by specifying the process ID. The process events can also be limited to monitoring a particular executable by specifying the path to executable (PATH). SystemTap makes use of the PATH environment variable, so both the name used on the command-line to start the executable and the absolute path to the executable can be used. Several of user-space probe events limit their scope to a particular executable name (PATH) because SystemTap must use debug information to statically analyzed where to places the probes, but for many user-space probes events the process ID and executable name are optional. Any process event in the list below that include process ID or the path to the executable must include those arguments. The process ID and path to the executable are optional for the process events that do not list them: +
process("PATH").function("function")
+ The entry to the user-space function function for the executable PATH. This event is the user-space analogue of the kernel.function("function") event. It allows wildcards for the function function and .return suffix. +
process("PATH").statement("statement")
+ The earliest instruction in the code for statement. This is the user-space analogue of kernel.statement("statement"). +
process("PATH").mark("marker")
+ The static probe point marker defined in PATH. Wildcards can be used for marker to specify mutiple marks with a single probe. The static probe points may also have numbered arguments ($1, $2, etc.) available to the probe. A variety of user-space packages such as Java include these static probe points. Most packages that provide static probe points also provide aliases for the raw user-space mark events. Below is one such alias for the x86_64 Java hotspot JVM: +
probe hotspot.gc_begin =
+  process("/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64/server/libjvm.so").mark("gc__begin")
process.begin
+ User-space process is created. This can be limited to a a particular process ID or a full path to the executable. +
process.thread.begin
+ User-space thread is created. This can be limited to a a particular process ID or a full path to the executable. +
process.end
+ User-space process died. This can be limited to a a particular process ID or a full path to the executable. +
process.thread.end
+ User-space thread is destroyed. This can be limited to a a particular process ID or a full path to the executable. +
process.syscall
+ User-space process makes a system call. The system call number is available via $syscall context variable, and the fist six arguments are available via $arg1 through $arg6. The ".return" suffix will place the probe at the return from the system call. For the "syscall.return" the return value is available through the $return context variable. This can be limited to a a particular process ID or a full path to the executable. +
diff --git a/SystemTap_Beginners_Guide/using-systemtap.html b/SystemTap_Beginners_Guide/using-systemtap.html new file mode 100644 index 00000000..85575c4f --- /dev/null +++ b/SystemTap_Beginners_Guide/using-systemtap.html @@ -0,0 +1,83 @@ + + +Chapter 2. Using SystemTap

Product SiteDocumentation Site

Chapter 2. Using SystemTap

+ This chapter instructs users how to install SystemTap, and provides an introduction on how to run SystemTap scripts. +

2.1. Installation and Setup

+ To deploy SystemTap, you need to install the SystemTap packages along with the corresponding set of -devel, -debuginfo and -debuginfo-common packages for your kernel. If your system has multiple kernels installed, and you wish to use SystemTap on more than one kernel kernel, you will need to install the -devel and -debuginfo packages for each of those kernel versions. +
+ These procedures will be discussed in detail in the following sections. +

Important

+ Many users confuse -debuginfo with -debug. Remember that the deployment of SystemTap requires the installation of the -debuginfo package of the kernel, not the -debug version of the kernel. +

2.1.1. Installing SystemTap

+ To deploy Systemtap, you will need to to install the following RPMs: +
  • + systemtap +
  • + systemtap-runtime +
+ Assuming that yum is installed in the system, these two rpms can be installed with yum install systemtap systemtap-runtime. Note that before you can use SystemTap, you will still need to install the required kernel information RPMs. +

2.1.2. Installing Required Kernel Information RPMs

+ SystemTap needs information about the kernel in order to place instrumentation in it (i.e. probe it). This information also allows SystemTap to generate the code for the instrumentation. This information is contained in the matching -devel, -debuginfo, and -debuginfo-common packages for your kernel. The necessary -devel and -debuginfo packages for the ordinary "vanilla" kernel are as follows: +
  • + kernel-debuginfo +
  • + kernel-debuginfo-common +
  • + kernel-devel +
+ Likewise, the necessary packages for the PAE kernel would be kernel-PAE-debuginfo, kernel-PAE-debuginfo-common, and kernel-PAE-devel. +
+ To determine what kernel your system is currently using, use: +
uname -r
+ For example, if you wish to use SystemTap on kernel version 2.6.18-53.el5 on an i686 machine, then you would need to download and install the following RPMs: +
  • + kernel-debuginfo-2.6.18-53.1.13.el5.i686.rpm +
  • + kernel-debuginfo-common-2.6.18-53.1.13.el5.i686.rpm +
  • + kernel-devel-2.6.18-53.1.13.el5.i686.rpm +

Important

+ The version, variant, and architecture of the -devel, -debuginfo and -debuginfo-common packages must match the kernel you wish to probe with SystemTap exactly. +
+ The easiest way to install the required kernel information packages is through yum install and debuginfo-install commands. debuginfo-install is included with later versions of the yum-utils package (for example, version 1.1.10), and also requires an appropriate yum repository from which to download and install -debuginfo/-debuginfo-common packages. You can install the required -devel, -debuginfo, and -debuginfo-common packages for your kernel. +
+ With the appropriate software repositories are enabled, install the corresponding packages for a specific kernel using yum with the following commands: +
  • + yum install kernelname-devel-version +
  • + debuginfo-install kernelname-version +
+ Replace kernelname with the appropriate kernel variant name (for example, kernel-PAE), and version with the target kernel's version. For example, to install the required kernel information packages for the kernel-PAE-2.6.18-53.1.13.el5 kernel, run: +
  • + yum install kernel-PAE-devel-2.6.18-53.1.13.el5 +
  • + debuginfo-install kernel-PAE-2.6.18-53.1.13.el5 +
+ If you do not have yum and yum-utils installed (and you are unable to install them), you will have to manually download and install the required kernel information packages. To generate the URL from which to download the required packages, use the following script: +
fedoradebugurl.sh
+ +
#! /bin/bash
+echo -n "Enter nvr of kernel-debuginfo (e.g. 2.6.25-14.fc9.x86_64) " ; \
+read NVR; \
+BASE=`uname -m` ; \
+NVR=`echo $NVR | sed s/.$BASE//` ; \
+VERSION=`echo $NVR | awk -F- '{print $1}'` ; \
+RELEASE=`echo $NVR | awk -F- '{print $2}'` ; \
+echo "http://kojipkgs.fedoraproject.org/\
+packages/kernel/$VERSION/$RELEASE/$BASE/"
+
+
+ Once you have manually downloaded the required packages to the machine, install the RPMs by running rpm --force -ivh package_names. +

2.1.3. Initial Testing

+ If you are currently using the kernel you wish to probe with SystemTap, you can immediately test whether the deployment was successful. If not, you will need to reboot and load the appropriate kernel. +
+ To start the test, run the command stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'. This command simply instructs SystemTap to print read performed then exit properly once a virtual file system read is detected. If the SystemTap deployment was successful, you should get output similar to the following: +
Pass 1: parsed user script and 45 library script(s) in 340usr/0sys/358real ms.
+Pass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) in 290usr/260sys/568real ms.
+Pass 3: translated to C into "/tmp/stapiArgLX/stap_e5886fa50499994e6a87aacdc43cd392_399.c" in 490usr/430sys/938real ms.
+Pass 4: compiled C into "stap_e5886fa50499994e6a87aacdc43cd392_399.ko" in 3310usr/430sys/3714real ms.
+Pass 5: starting run.
+read performed
+Pass 5: run completed in 10usr/40sys/73real ms.
+ The last three lines of the output (i.e. beginning with Pass 5) indicate that SystemTap was able to successfully create the instrumentation to probe the kernel, run the instrumentation, detect the event being probed (in this case, a virtual file system read), and execute a valid handler (print text then close it with no errors). +
diff --git a/SystemTap_Beginners_Guide/using-usage.html b/SystemTap_Beginners_Guide/using-usage.html new file mode 100644 index 00000000..f00af2b9 --- /dev/null +++ b/SystemTap_Beginners_Guide/using-usage.html @@ -0,0 +1,64 @@ + + +2.3. Running SystemTap Scripts

Product SiteDocumentation Site

2.3. Running SystemTap Scripts

+ SystemTap scripts are run through the command stap. stap can run SystemTap scripts from standard input or from file. +
+ Running stap and staprun requires elevated privileges to the system. However, not all users can be granted root access just to run SystemTap. In some cases, for instance, you may want to allow a non-privileged user to run SystemTap instrumentation on his machine. +
+ To allow ordinary users to run SystemTap without root access, add them to one of these user groups: +
stapdev
+ Members of this group can use stap to run SystemTap scripts, or staprun to run SystemTap instrumentation modules. +
+ Running stap involves compiling SystemTap scripts into kernel modules and loading them into the kernel. This requires elevated privileges to the system, which are granted to stapdev members. Unfortunately, such privileges also grant effective root access to stapdev members. As such, you should only grant stapdev group membership to users whom you can trust root access. +
stapusr
+ Members of this group can only run staprun to run SystemTap instrumentation modules. In addition, they can only run those modules from /lib/modules/kernel_version/systemtap/. Note that this directory must be owned only by the root user, and must only be writable by the root user. +
+ Below is a list of commonly used stap options: +
-v
+ Makes the output of the SystemTap session more verbose. You can repeat this option (for example, stap -vvv script.stp) to provide more details on the script's execution. This option is particularly useful if you encounter any errors in running the script. +
+ For more information about common SystemTap script errors, refer to Chapter 6, Understanding SystemTap Errors. +
-o filename
+ Sends the standard output to file (filename). +
-S size,count
+ Limit files to size megabytes and limit the the number of files kept around to count. The file names will have a sequence number suffix. This option implements logrotate operations for SystemTap. +
-x process ID
+ Sets the SystemTap handler function target() to the specified process ID. For more information about target(), refer to SystemTap Functions. +
-c 'command'
+ Sets the SystemTap handler function target() to the specified command and runs the SystemTap instrumentation for the duration of the specified command. For more information about target(), refer to SystemTap Functions. +
-e 'script'
+ Use script string rather than a file as input for systemtap translator. +
-F
+ Use SystemTap's Flight recorder mode and make the script a background process. For more information about flight recorder mode, refer to Section 2.3.1, “SystemTap Flight Recorder Mode”. +
+ You can also instruct stap to run scripts from standard input using the switch -. To illustrate: +
Example 2.1. Running Scripts From Standard Input
echo "probe timer.s(1) {exit()}" | stap -

+ Example 2.1, “Running Scripts From Standard Input” instructs stap to run the script passed by echo to standard input. Any stap options you wish to use should be inserted before the - switch; for instance, to make the example in Example 2.1, “Running Scripts From Standard Input” more verbose, the command would be: +
+ echo "probe timer.s(1) {exit()}" | stap -v - +
+ For more information about stap, refer to man stap. +
+ To run SystemTap instrumentation (i.e. the kernel module built from SystemTap scripts during a cross-instrumentation), use staprun instead. For more information about staprun and cross-instrumentation, refer to Section 2.2, “Generating Instrumentation for Other Computers”. +

Note

+ The stap options -v and -o also work for staprun. For more information about staprun, refer to man staprun. +

2.3.1. SystemTap Flight Recorder Mode

+ SystemTap's flight recorder mode allows you to run a SystemTap script run for long periods and just focus on recent output. The flight recorder mode (the -F option) limits the amount of output generated. There are two variations of the flight recorder mode: in-memory and file mode. In both cases the SystemTap script runs as a background process. +

2.3.1.1. In-memory Flight Recorder

+ When flight recorder mode (the -F option) is used without a file name SystemTap uses a buffer in kernel memory to store the output of the script. The SystemTap instrumentation module will load and the probes start running, the instrumentation will then detach and be put in the background. When the interesting event occurs, you can reattach to the instrumentation and see the recent output in the memory buffer and any continuing output. The following command starts a script using the flight recorder in-memory mode: +
stap -F iotime.stp
+ Once the script starts, you will see a message like the following that provides the command to reconnect to the running script: +
Disconnecting from systemtap module.
+To reconnect, type "staprun -A stap_5dd0073edcb1f13f7565d8c343063e68_19556"
+ When the interesting event occurs, you reattach to the currently running script and output the recent data in the memory buffer and get continuing output with the following command: +
staprun -A stap_5dd0073edcb1f13f7565d8c343063e68_19556
+ By default the kernel buffer is 1MB in size and it can be increased with the -s option specifying the size in megabytes (rounded up to the next power over 2) for the buffer. For example -s2 on the SystemTap command line would specify 2MB for the buffer. +

2.3.1.2. File Flight Recorder

+ The flight recorder mode can also store data to files. The number and size of the files kept is controlled by the -S option followed by two numerical arguments separated by a comma. The first argument is the maximum size in megabytes for the each output file. The second argument is the number of recent files to keep. The file name is specified by the -o option followed by the name. SystemTap will add a number suffix to the file name to indicate the order of the files. The following will start SystemTap in file flight recorder mode with the output going to files named /tmp/iotime.log.[0-9]+ and each file 1MB or smaller and keeping latest two files: +
stap -F -o /tmp/pfaults.log -S 1,2  pfaults.stp
+ The number printed by the command is the process ID. Sending a SIGTERM to the process will shutdown the SystemTap script and stop the data collection. For example if the previous command listed the 7590 as the process ID, the following command whould shutdown the systemtap script: +
kill -s SIGTERM 7590
+ Only the most recent two file generated by the script are kept and the older files are been removed. Thus, ls -sh /tmp/pfaults.log.* shows the only two files: +
1020K /tmp/pfaults.log.5    44K /tmp/pfaults.log.6
+ One can look at the highest number file for the latest data, in this case /tmp/pfaults.log.6. +
diff --git a/SystemTap_Beginners_Guide/ustack.html b/SystemTap_Beginners_Guide/ustack.html new file mode 100644 index 00000000..e8e162ec --- /dev/null +++ b/SystemTap_Beginners_Guide/ustack.html @@ -0,0 +1,31 @@ + + +4.3. User-Space Stack Backtraces

Product SiteDocumentation Site

4.3. User-Space Stack Backtraces

+ The probe point (pp) function indicates which particular event triggered the the SystemTap event handler. A probe on the entry into a function would list the function name. However, in many cases the same probe point event may be triggered by many different modules in the program; this is particularly true for functions in shared libraries. A SystemTap backtrace of the user-space stack can provide additional context on how the probe point event is triggered. +
+ The user-space stack backtrace generation is complicated by the compiler producing code optimized to eliminate stack frame pointers. However, the compiler also includes information in the debug information section to allow debugging tools to produce stack backtraces. SystemTap user-space stack backtrace mechanism makes use of that debug information to walk the stack to generate stack traces for 32-bit and 64-bit x86 processors; other processor architectures do not yet support the use of debug information to unwind the user-space stack. You will need to use the -d executable for the application executable and -ldd for shared libraries to ensure that the needed debug information is used to produce the user-space stack backtraces. +
+ If you want to see how the function xmalloc function is being called by the command ls, you could use the user-space backtrack functions to provide that information. With the debuginfo for the ls command installed the following SystemTap command will provide a backtrace each time the xmalloc function is called: +
stap -d /bin/ls --ldd \
+-e 'probe process("ls").function("xmalloc") {print_ustack(ubacktrace())}' \
+-c "ls /"
+ When the SystemTap script runs will have output similar to the following: +
+bin	dev   lib	  media  net	     proc	sbin	 sys  var
+boot	etc   lib64	  misc	 op_session  profilerc	selinux  tmp
+cgroup	home  lost+found  mnt	 opt	     root	srv	 usr
+ 0x4116c0 : xmalloc+0x0/0x20 [/bin/ls]
+ 0x4116fc : xmemdup+0x1c/0x40 [/bin/ls]
+ 0x40e68b : clone_quoting_options+0x3b/0x50 [/bin/ls]
+ 0x4087e4 : main+0x3b4/0x1900 [/bin/ls]
+ 0x3fa441ec5d : __libc_start_main+0xfd/0x1d0 [/lib64/libc-2.12.so]
+ 0x402799 : _start+0x29/0x2c [/bin/ls]
+ 0x4116c0 : xmalloc+0x0/0x20 [/bin/ls]
+ 0x4116fc : xmemdup+0x1c/0x40 [/bin/ls]
+ 0x40e68b : clone_quoting_options+0x3b/0x50 [/bin/ls]
+ 0x40884a : main+0x41a/0x1900 [/bin/ls]
+ 0x3fa441ec5d : __libc_start_main+0xfd/0x1d0 [/lib64/libc-2.12.so]
+ ...
+
+ For more details on the functions available for user-space stack backtraces look at the ucontext-symbols.stp and ucontext-unwind.stp tapsets. The descriptions of the functions in those tapsets can also be found in the SystemTap Tapset Reference Manual. +
diff --git a/SystemTap_Beginners_Guide/utargetvariable.html b/SystemTap_Beginners_Guide/utargetvariable.html new file mode 100644 index 00000000..1187e6ec --- /dev/null +++ b/SystemTap_Beginners_Guide/utargetvariable.html @@ -0,0 +1,17 @@ + + +4.2. Accessing User-Space Target Variables

Product SiteDocumentation Site

4.2. Accessing User-Space Target Variables

+ User-space target variables can be accessed in the same manner as described in Section 3.3.2, “Target Variables”. However, in Linux there are separate address spaces for the user and kernel code. When using "->" operator SystemTap will access the appropriate address space. For pointers to base types such as integers and strings there are a number of functions listed below to access user-space data. The first argument for each functions is the pointer to the data item. +
user_char(address)
+ Obtain the character at address for the current user process. +
user_short(address)
+ Obtain the short at address for the current user process. +
user_int(address)
+ Obtain the int at address for the current user process. +
user_long(address)
+ Obtain the long at address for the current user process. +
user_string(address)
+ Obtain the string at address for the current user process. +
user_string_n(address, n)
+ Obtain the string at address for the current user process and limits the string to n bytes. +
-- 2.43.5