diff options
author | Scott Rifenbark <scott.m.rifenbark@intel.com> | 2013-01-17 10:51:51 -0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-01-27 13:56:03 +0000 |
commit | fcf615546f88e28caa56b2e977c183c792e071a6 (patch) | |
tree | 0b220e12f5df015f0717bdc1ac902fe2b411ec63 /documentation/profile-manual | |
parent | 44e838c61216df8f521bc872d536ab9d1ecc0e6b (diff) | |
download | poky-fcf615546f88e28caa56b2e977c183c792e071a6.tar.gz |
profile-manual: Systemtap section added.
No re-writing at all.
(From yocto-docs rev: 4ca472f8200f9d927a8d37c88c1ff75b017fcfc1)
Signed-off-by: Scott Rifenbark <scott.m.rifenbark@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'documentation/profile-manual')
-rw-r--r-- | documentation/profile-manual/profile-manual-usage.xml | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/documentation/profile-manual/profile-manual-usage.xml b/documentation/profile-manual/profile-manual-usage.xml index a35a112e55..39a0c5c91f 100644 --- a/documentation/profile-manual/profile-manual-usage.xml +++ b/documentation/profile-manual/profile-manual-usage.xml | |||
@@ -2004,6 +2004,223 @@ | |||
2004 | </section> | 2004 | </section> |
2005 | </section> | 2005 | </section> |
2006 | 2006 | ||
2007 | <section id='profile-manual-systemtap'> | ||
2008 | <title>systemtap</title> | ||
2009 | |||
2010 | <para> | ||
2011 | SystemTap is a system-wide script-based tracing and profiling tool. | ||
2012 | </para> | ||
2013 | |||
2014 | <para> | ||
2015 | SystemTap scripts are C-like programs that are executed in the | ||
2016 | kernel to gather/print/aggregate data extracted from the context | ||
2017 | they end up being invoked under. | ||
2018 | </para> | ||
2019 | |||
2020 | <para> | ||
2021 | For example, this probe from the | ||
2022 | <ulink url='http://sourceware.org/systemtap/tutorial/'>SystemTap tutorial</ulink> | ||
2023 | simply prints a line every time any process on the system open()s | ||
2024 | a file. For each line, it prints the executable name of the | ||
2025 | program that opened the file, along with its pid, and the name | ||
2026 | of the file it opened (or tried to open), which it extracts | ||
2027 | from the open syscall's argstr. | ||
2028 | <literallayout class='monospaced'> | ||
2029 | probe syscall.open | ||
2030 | { | ||
2031 | printf ("%s(%d) open (%s)\n", execname(), pid(), argstr) | ||
2032 | } | ||
2033 | |||
2034 | probe timer.ms(4000) # after 4 seconds | ||
2035 | { | ||
2036 | exit () | ||
2037 | } | ||
2038 | </literallayout> | ||
2039 | Normally, to execute this probe, you'd simply install | ||
2040 | systemtap on the system you want to probe, and directly run | ||
2041 | the probe on that system e.g. assuming the name of the file | ||
2042 | containing the above text is trace_open.stp: | ||
2043 | <literallayout class='monospaced'> | ||
2044 | # stap trace_open.stp | ||
2045 | </literallayout> | ||
2046 | What systemtap does under the covers to run this probe is 1) | ||
2047 | parse and convert the probe to an equivalent 'C' form, 2) | ||
2048 | compile the 'C' form into a kernel module, 3) insert the | ||
2049 | module into the kernel, which arms it, and 4) collect the data | ||
2050 | generated by the probe and display it to the user. | ||
2051 | </para> | ||
2052 | |||
2053 | <para> | ||
2054 | In order to accomplish steps 1 and 2, the 'stap' program needs | ||
2055 | access to the kernel build system that produced the kernel | ||
2056 | that the probed system is running. In the case of a typical | ||
2057 | embedded system (the 'target'), the kernel build system | ||
2058 | unfortunately isn't typically part of the image running on | ||
2059 | the target. It is normally available on the 'host' system | ||
2060 | that produced the target image however; in such cases, | ||
2061 | steps 1 and 2 are executed on the host system, and steps | ||
2062 | 3 and 4 are executed on the target system, using only the | ||
2063 | systemtap 'runtime'. | ||
2064 | </para> | ||
2065 | |||
2066 | <para> | ||
2067 | The systemtap support in Yocto assumes that only steps | ||
2068 | 3 and 4 are run on the target; it is possible to do | ||
2069 | everything on the target, but this section assumes only | ||
2070 | the typical embedded use-case. | ||
2071 | </para> | ||
2072 | |||
2073 | <para> | ||
2074 | So basically what you need to do in order to run a systemtap | ||
2075 | script on the target is to 1) on the host system, compile the | ||
2076 | probe into a kernel module that makes sense to the target, 2) | ||
2077 | copy the module onto the target system and 3) insert the | ||
2078 | module into the target kernel, which arms it, and 4) collect | ||
2079 | the data generated by the probe and display it to the user. | ||
2080 | </para> | ||
2081 | |||
2082 | <section id='systemtap-setup'> | ||
2083 | <title>Setup</title> | ||
2084 | |||
2085 | <para> | ||
2086 | Those are a lot of steps and a lot of details, but | ||
2087 | fortunately Yocto includes a script called 'crosstap' | ||
2088 | that will take care of those details, allowing you to | ||
2089 | simply execute a systemtap script on the remote target, | ||
2090 | with arguments if necessary. | ||
2091 | </para> | ||
2092 | |||
2093 | <para> | ||
2094 | In order to do this from a remote host, however, you | ||
2095 | need to have access to the build for the image you | ||
2096 | booted. The 'crosstap' script provides details on how | ||
2097 | to do this if you run the script on the host without having | ||
2098 | done a build: | ||
2099 | <literallayout class='monospaced'> | ||
2100 | $ crosstap root@192.168.1.88 trace_open.stp | ||
2101 | |||
2102 | Error: No target kernel build found. | ||
2103 | Did you forget to create a local build of your image? | ||
2104 | |||
2105 | 'crosstap' requires a local sdk build of the target system | ||
2106 | (or a build that includes 'tools-profile') in order to build | ||
2107 | kernel modules that can probe the target system. | ||
2108 | |||
2109 | Practically speaking, that means you need to do the following: | ||
2110 | - If you're running a pre-built image, download the release | ||
2111 | and/or BSP tarballs used to build the image. | ||
2112 | - If you're working from git sources, just clone the metadata | ||
2113 | and BSP layers needed to build the image you'll be booting. | ||
2114 | - Make sure you're properly set up to build a new image (see | ||
2115 | the BSP README and/or the widely available basic documentation | ||
2116 | that discusses how to build images). | ||
2117 | - Build an -sdk version of the image e.g.: | ||
2118 | $ bitbake core-image-sato-sdk | ||
2119 | OR | ||
2120 | - Build a non-sdk image but include the profiling tools: | ||
2121 | [ edit local.conf and add 'tools-profile' to the end of | ||
2122 | the EXTRA_IMAGE_FEATURES variable ] | ||
2123 | $ bitbake core-image-sato | ||
2124 | |||
2125 | [ NOTE that 'crosstap' needs to be able to ssh into the target | ||
2126 | system, which isn't enabled by default in -minimal images. ] | ||
2127 | |||
2128 | Once you've build the image on the host system, you're ready to | ||
2129 | boot it (or the equivalent pre-built image) and use 'crosstap' | ||
2130 | to probe it (you need to source the environment as usual first): | ||
2131 | |||
2132 | $ source oe-init-build-env | ||
2133 | $ cd ~/my/systemtap/scripts | ||
2134 | $ crosstap root@192.168.1.xxx myscript.stp | ||
2135 | </literallayout> | ||
2136 | So essentially what you need to do is build an SDK image or | ||
2137 | image with 'tools-profile' as detailed in the | ||
2138 | "<link linkend='profile-manual-general-setup'>General Setup</link>" | ||
2139 | section of this manual, and boot the resulting target image. | ||
2140 | </para> | ||
2141 | |||
2142 | <note> | ||
2143 | If you have a build directory containing multiple machines, | ||
2144 | you need to have the MACHINE you're connecting to selected | ||
2145 | in local.conf, and the kernel in that machine's build | ||
2146 | directory must match the kernel on the booted system exactly, | ||
2147 | or you'll get the above 'crosstap' message when you try to | ||
2148 | invoke a script. | ||
2149 | </note> | ||
2150 | </section> | ||
2151 | |||
2152 | <section id='running-a-script-on-a-target'> | ||
2153 | <title>Running a Script on a Target</title> | ||
2154 | |||
2155 | <para> | ||
2156 | Once you've done that, you should be able to run a systemtap | ||
2157 | script on the target: | ||
2158 | <literallayout class='monospaced'> | ||
2159 | $ cd /path/to/yocto | ||
2160 | $ source oe-init-build-env | ||
2161 | |||
2162 | ### Shell environment set up for builds. ### | ||
2163 | |||
2164 | You can now run 'bitbake <target>' | ||
2165 | |||
2166 | Common targets are: | ||
2167 | core-image-minimal | ||
2168 | core-image-sato | ||
2169 | meta-toolchain | ||
2170 | meta-toolchain-sdk | ||
2171 | adt-installer | ||
2172 | meta-ide-support | ||
2173 | |||
2174 | You can also run generated qemu images with a command like 'runqemu qemux86' | ||
2175 | </literallayout> | ||
2176 | Once you've done that, you can cd to whatever directory | ||
2177 | contains your scripts and use 'crosstap' to run the script: | ||
2178 | <literallayout class='monospaced'> | ||
2179 | $ cd /path/to/my/systemap/script | ||
2180 | $ crosstap root@192.168.7.2 trace_open.stp | ||
2181 | </literallayout> | ||
2182 | If you get an error connecting to the target e.g.: | ||
2183 | <literallayout class='monospaced'> | ||
2184 | $ crosstap root@192.168.7.2 trace_open.stp | ||
2185 | error establishing ssh connection on remote 'root@192.168.7.2' | ||
2186 | </literallayout> | ||
2187 | Try ssh'ing to the target and see what happens: | ||
2188 | <literallayout class='monospaced'> | ||
2189 | $ ssh root@192.168.7.2 | ||
2190 | </literallayout> | ||
2191 | A lot of the time, connection problems are due specifying a | ||
2192 | wrong IP address or having a 'host key verification error'. | ||
2193 | </para> | ||
2194 | |||
2195 | <para> | ||
2196 | If everything worked as planned, you should see something | ||
2197 | like this (enter the password when prompted, or press enter | ||
2198 | if its set up to use no password): | ||
2199 | <literallayout class='monospaced'> | ||
2200 | $ crosstap root@192.168.7.2 trace_open.stp | ||
2201 | root@192.168.7.2's password: | ||
2202 | matchbox-termin(1036) open ("/tmp/vte3FS2LW", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) | ||
2203 | matchbox-termin(1036) open ("/tmp/vteJMC7LW", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) | ||
2204 | </literallayout> | ||
2205 | </para> | ||
2206 | </section> | ||
2207 | |||
2208 | <section id='systemtap-documentation'> | ||
2209 | <title>Documentation</title> | ||
2210 | |||
2211 | <para> | ||
2212 | The SystemTap language reference can be found here: | ||
2213 | <ulink url='http://sourceware.org/systemtap/langref/'>SystemTap Language Reference</ulink> | ||
2214 | </para> | ||
2215 | |||
2216 | <para> | ||
2217 | Links to other SystemTap documents, tutorials, and examples can be | ||
2218 | found here: | ||
2219 | <ulink url='http://sourceware.org/systemtap/documentation.html'>SystemTap documentation page</ulink> | ||
2220 | </para> | ||
2221 | </section> | ||
2222 | </section> | ||
2223 | |||
2007 | </chapter> | 2224 | </chapter> |
2008 | <!-- | 2225 | <!-- |
2009 | vim: expandtab tw=80 ts=4 | 2226 | vim: expandtab tw=80 ts=4 |