99416aeb |
1 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
2 | <html> |
3 | <head> |
4 | <title>Tracing Tools</title> |
5 | </head> |
6 | <body> |
7 | |
8 | <h1>Tracing Tools</h1> |
9 | |
10 | <p>Tracing is routinely used to help understanding the behavior and performance |
11 | of various aspects of the Linux kernel and associated drivers. |
12 | Many of the 80K+ printk statements in the Linux kernel |
13 | serve this purpose, although printk is relatively low |
14 | performance and unreliable. The small default printk buffer size coupled with |
15 | the low performance brings lost messages as soon as the volume becomes |
16 | significant. |
17 | |
18 | <p>For this reason, a number of drivers include their own tracing macros |
19 | and infrastructure. A quick search looking for TRACE and related keywords |
20 | in the Linux kernel source reveals some form of tracing in at least |
21 | the following files: |
22 | |
23 | <UL> |
24 | <LI>./fs/hpfs/hpfs_fn.h |
25 | <LI>./fs/smbfs/smb_debug.h |
26 | <LI>./fs/autofs/autofs_i.h |
27 | <LI>./fs/jffs2/nodelist.h |
28 | <LI>./include/linux/wait.h |
29 | <LI>./include/linux/parport_pc.h |
30 | <LI>./include/linux/amigaffs.h |
31 | <LI>./include/linux/parport_pc.h |
32 | <LI>./include/linux/ncp_fs.h |
33 | <LI>drivers/net/wireless airport and orinoco |
34 | <LI>drivers/char/ftape |
35 | <LI>drivers/char/dtlk.c |
36 | <LI>drivers/char/mwave |
37 | <LI>drivers/char/n_r3964.c |
38 | <LI>drivers/scsi/qlogicfc.c |
39 | <LI>drivers/usb/pwc-if.c |
40 | <LI>drivers/usb/hpusbscsi.c |
41 | <LI>drivers/acpi/include/acmacros.h |
42 | <LI>arch/sparc/kernel/signal.c |
43 | <LI>arch/mips/math-emu/cp1emu.c |
44 | <LI>drivers/net/wavelan.c |
45 | <LI>drivers/net/hp100.c |
46 | <LI>drivers/net/wan/lmc/lmc_debug.c |
47 | <LI>drivers/net/skfp/h/targetos.h |
48 | <LI>drivers/char/ip2main.c |
49 | <LI>drivers/scsi/gdth.c |
50 | <LI>drivers/scsi/megaraid.c |
51 | <LI>drivers/scsi/qlogicisp.c |
52 | <LI>drivers/scsi/ips.c |
53 | <LI>drivers/scsi/qla1280.c |
54 | <LI>drivers/scsi/cpqfcTSstructs.h |
55 | <LI>drivers/cdrom/sjcd.c |
56 | <LI>drivers/isdn/eicon/sys.h |
57 | <LI>drivers/sbus/char/bbc_envctrl.c |
58 | <LI>drivers/ide/ide-tape.c |
59 | <LI>drivers/video/radeonfb.c |
60 | <LI>fs/intermezzo/sysctl.c |
61 | <LI>fs/ext3/balloc.c |
62 | <LI>net/ipv6/ip6_fib.c |
63 | <LI>net/irda/irnet/irnet.h |
64 | <UL> |
65 | |
66 | <p>A number of tracing tools have been developed for the Linux kernel. |
67 | The best known, particularly in the embedded systems area, is the Linux Trace |
68 | Toolkit, <A HREF="http://www.opersys.com/LTT">LTT at |
69 | http://www.opersys.com/LTT</A>. It |
70 | comes with a nice graphical user interface and is currently under active |
71 | development to add dynamically defined event types and graphical trace |
72 | analysis modules. |
73 | |
74 | <P> |
75 | The <A HREF="http://lkst.sf.net">Linux Kernel State Tracer at |
76 | http://lkst.sf.net</A>was developed by Hitachi and offers basic, |
77 | low overhead, tracing functionality. There is no grahical user interface |
78 | available. |
79 | |
80 | <P> |
81 | MAGNET was recently released. It was initially developed to trace the network |
82 | stack and drivers. Its performance has not been optimized for SMP systems. |
83 | It is available from |
84 | <A HREF="http://public.lanl.gov/radiant/software/magnet.html"> |
85 | http://public.lanl.gov/radiant/software/magnet.html |
86 | </A>. |
87 | |
88 | <P> |
89 | The IKD patch from Andrea Arcangeli |
90 | <A HREF="ftp://ftp.kernel.org/pub/linux/kernel/people/andrea/ikd/"> |
91 | ftp://ftp.kernel.org/pub/linux/kernel/people/andrea/ikd/ |
92 | </A> |
93 | includes ktrace which adds the -pg gcc compilation option |
94 | to specified source files. This adds a call to function <i>mcount</i> |
95 | upon entry in any function compiled with that option. A function <i>mcount</i> |
96 | is provided which records in a trace the address of the function entered. |
97 | Using the system map, this is later translated into a trace of names of |
98 | functions entered. |
99 | |
100 | <H2>Reliability, Availability and Serviceability</H2> |
101 | |
102 | <P> |
103 | Tracing may be placed in the larger context of Reliability, Availability and |
104 | Serviceability (RAS). The Linux RAS project is probably the most active and |
105 | well organized, |
106 | <A HREF="http://systemras.sourceforge.net/"> |
107 | http://systemras.sourceforge.net/ |
108 | </A> |
109 | <A HREF="http://www-124.ibm.com/linux/projects/linuxras/"> |
110 | http://www-124.ibm.com/linux/projects/linuxras/ |
111 | </A>. |
112 | It links to several underlying projects, including the Linux Trace Toolkit |
113 | <A HREF="http://www.opersys.com/LTT">LTT</A>. |
114 | |
115 | <P> |
116 | Several other projects within Linux RAS directly relate to tracing. |
117 | |
118 | <H3>Enterprise Event Logging</H3> |
119 | |
120 | <p>The Enterprise Event Logging project, |
121 | <A HREF="http://evlog.sourceforge.net/">EVLOG project |
122 | at http://evlog.sourceforge.net/</A>, produces traces and thus shares a number |
123 | of underlying implementation needs |
124 | (events recording, kernel to user mode transfer, |
125 | trace analysis and viewing tools, event types format). The intended purpose |
126 | and thus implementation constraints differ significantly, however. |
127 | EVLOG records important system events for two purposes, |
128 | to trigger service and security alarms (e.g. weak signals in a magnetic disk, |
129 | unauthorized access attempt) and to provide permament records. The volume |
130 | is typically low and full context is required for each event. While logging |
131 | (EVLOG) is therefore implemented separately from tracing (LTT), some |
132 | underlying technology may be reused as appropriate (e.g. kernel hooks, |
133 | kernel to user mode data relay...). |
134 | |
135 | <H3>Kernel Crash Dump</H3> |
136 | |
137 | <P>A common symptom of a serious kernel problem is a crash. Traces may |
138 | be extremely useful to understand the problem except that, because of the |
139 | crash, the important last events in the current trace buffer cannot be |
140 | stored on disk. The Linux Kernel Crash Dump facility (LKCD) at |
141 | <A HREF="http://oss.software.ibm.com/developer/opensource/linux/projects/flexdump/"> |
142 | http://oss.software.ibm.com/developer/opensource/linux/projects/flexdump/ |
143 | </A> is used to recover such information, when <i>warm</i> rebooting from a |
144 | crash while this information is still available in memory. |
145 | |
146 | <P>LKCD needs to be told how to find the tracing buffers in the memory |
147 | (address in a map or signature to look for) and in which file to save |
148 | their content. |
149 | |
150 | <H3>Kernel Hooks</H3> |
151 | |
152 | <p> |
153 | Kernel hooks, at |
154 | <A HREF="http://www-124.ibm.com/developerworks/oss/linux/projects/kernelhooks/"> |
155 | http://www-124.ibm.com/developerworks/oss/linux/projects/kernelhooks/ |
156 | </A> are a mechanism to insert hooks at desired locations in the kernel. |
157 | Handlers may later be registered to be called at these hooks locations. |
158 | When no handler is registered, the cost associated with a hook is almost |
159 | negligeable, a few NOPs. Skipping NOPs is even faster than testing a |
160 | global boolean variable. Kernel hooks would be ideally suited for the |
161 | dynamic activation of trace points. Furthermore, kernel hooks allow registering |
162 | multiple handlers. A same location could have a tracing handler and a |
163 | performance tool handler, reducing the number of points needed to be |
164 | inserted in the kernel source code. |
165 | |
166 | <p>Interactive tools may be used to rapidly select groups of hooks to be |
167 | activated based on facilities (networking, block devices...), level |
168 | of details (core events, detailed events) or severity level (warning, info, |
169 | debug). |
170 | |
171 | <p>As part of Kernel Hooks and Dynamic Probes, were defined handlers |
172 | which produce tracing information. The tracing data models for Dynamic Probes |
173 | and LTT are fairly similar and may eventually be consolidated. |
174 | |
175 | <H3>Dynamic Probes</H3> |
176 | |
177 | <p>The Dynamic Probes, |
178 | <A HREF="http://www-124.ibm.com/linux/projects/kprobes/"> |
179 | http://www-124.ibm.com/linux/projects/kprobes/ |
180 | </A>, |
181 | allow inserting kernel hooks dynamically in a running kernel, just like |
182 | breakpoints in debuggers. The instruction |
183 | at the desired location is saved and replaced by an interrupt instruction. |
184 | When the interrupt instruction is executed, the handlers are called, the |
185 | original instruction restored and executed in single step mode, and the |
186 | interrupt instruction is reinserted. |
187 | |
188 | </body> |
189 | </html> |