aboutsummaryrefslogtreecommitdiff
path: root/Documentation/DocBook/kgdb.tmpl
blob: 372dec20c8dab6db05fbbcd9e3cdef93f1e783a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
	"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>

<book id="kgdbOnLinux">
 <bookinfo>
  <title>Using kgdb and the kgdb Internals</title>

  <authorgroup>
   <author>
    <firstname>Jason</firstname>
    <surname>Wessel</surname>
    <affiliation>
     <address>
      <email>jason.wessel@windriver.com</email>
     </address>
    </affiliation>
   </author>
  </authorgroup>

  <authorgroup>
   <author>
    <firstname>Tom</firstname>
    <surname>Rini</surname>
    <affiliation>
     <address>
      <email>trini@kernel.crashing.org</email>
     </address>
    </affiliation>
   </author>
  </authorgroup>

  <authorgroup>
   <author>
    <firstname>Amit S.</firstname>
    <surname>Kale</surname>
    <affiliation>
     <address>
      <email>amitkale@linsyssoft.com</email>
     </address>
    </affiliation>
   </author>
  </authorgroup>

  <copyright>
   <year>2008</year>
   <holder>Wind River Systems, Inc.</holder>
  </copyright>
  <copyright>
   <year>2004-2005</year>
   <holder>MontaVista Software, Inc.</holder>
  </copyright>
  <copyright>
   <year>2004</year>
   <holder>Amit S. Kale</holder>
  </copyright>

  <legalnotice>
   <para>
   This file is licensed under the terms of the GNU General Public License
   version 2. This program is licensed "as is" without any warranty of any
   kind, whether express or implied.
   </para>

  </legalnotice>
 </bookinfo>

<toc></toc>
  <chapter id="Introduction">
    <title>Introduction</title>
    <para>
    kgdb is a source level debugger for linux kernel. It is used along
    with gdb to debug a linux kernel.  The expectation is that gdb can
    be used to "break in" to the kernel to inspect memory, variables
    and look through call stack information similar to what an
    application developer would use gdb for.  It is possible to place
    breakpoints in kernel code and perform some limited execution
    stepping.
    </para>
    <para>
    Two machines are required for using kgdb. One of these machines is a
    development machine and the other is a test machine.  The kernel
    to be debugged runs on the test machine. The development machine
    runs an instance of gdb against the vmlinux file which contains
    the symbols (not boot image such as bzImage, zImage, uImage...).
    In gdb the developer specifies the connection parameters and
    connects to kgdb.  The type of connection a developer makes with
    gdb depends on the availability of kgdb I/O modules compiled as
    builtin's or kernel modules in the test machine's kernel.
    </para>
  </chapter>
  <chapter id="CompilingAKernel">
    <title>Compiling a kernel</title>
    <para>
    To enable <symbol>CONFIG_KGDB</symbol> you should first turn on
    "Prompt for development and/or incomplete code/drivers"
    (CONFIG_EXPERIMENTAL) in  "General setup", then under the
    "Kernel debugging" select "KGDB: kernel debugging with remote gdb".
    </para>
    <para>
    It is advised, but not required that you turn on the
    CONFIG_FRAME_POINTER kernel option.  This option inserts code to
    into the compiled executable which saves the frame information in
    registers or on the stack at different points which will allow a
    debugger such as gdb to more accurately construct stack back traces
    while debugging the kernel.
    </para>
    <para>
    If the architecture that you are using supports the kernel option
    CONFIG_DEBUG_RODATA, you should consider turning it off.  This
    option will prevent the use of software breakpoints because it
    marks certain regions of the kernel's memory space as read-only.
    If kgdb supports it for the architecture you are using, you can
    use hardware breakpoints if you desire to run with the
    CONFIG_DEBUG_RODATA option turned on, else you need to turn off
    this option.
    </para>
    <para>
    Next you should choose one of more I/O drivers to interconnect debugging
    host and debugged target.  Early boot debugging requires a KGDB
    I/O driver that supports early debugging and the driver must be
    built into the kernel directly. Kgdb I/O driver configuration
    takes place via kernel or module parameters, see following
    chapter.
    </para>
    <para>
    The kgdb test compile options are described in the kgdb test suite chapter.
    </para>

  </chapter>
  <chapter id="EnableKGDB">
   <title>Enable kgdb for debugging</title>
   <para>
   In order to use kgdb you must activate it by passing configuration
   information to one of the kgdb I/O drivers.  If you do not pass any
   configuration information kgdb will not do anything at all.  Kgdb
   will only actively hook up to the kernel trap hooks if a kgdb I/O
   driver is loaded and configured.  If you unconfigure a kgdb I/O
   driver, kgdb will unregister all the kernel hook points.
   </para>
   <para>
   All drivers can be reconfigured at run time, if
   <symbol>CONFIG_SYSFS</symbol> and <symbol>CONFIG_MODULES</symbol>
   are enabled, by echo'ing a new config string to
   <constant>/sys/module/&lt;driver&gt;/parameter/&lt;option&gt;</constant>.
   The driver can be unconfigured by passing an empty string.  You cannot
   change the configuration while the debugger is attached.  Make sure
   to detach the debugger with the <constant>detach</constant> command
   prior to trying unconfigure a kgdb I/O driver.
   </para>
   <sect1 id="kgdbwait">
   <title>Kernel parameter: kgdbwait</title>
   <para>
   The Kernel command line option <constant>kgdbwait</constant> makes
   kgdb wait for a debugger connection during booting of a kernel.  You
   can only use this option you compiled a kgdb I/O driver into the
   kernel and you specified the I/O driver configuration as a kernel
   command line option.  The kgdbwait parameter should always follow the
   configuration parameter for the kgdb I/O driver in the kernel
   command line else the I/O driver will not be configured prior to
   asking the kernel to use it to wait.
   </para>
   <para>
   The kernel will stop and wait as early as the I/O driver and
   architecture will allow when you use this option.  If you build the
   kgdb I/O driver as a kernel module kgdbwait will not do anything.
   </para>
   </sect1>
  <sect1 id="kgdboc">
  <title>Kernel parameter: kgdboc</title>
  <para>
  The kgdboc driver was originally an abbreviation meant to stand for
  "kgdb over console".  Kgdboc is designed to work with a single
  serial port. It was meant to cover the circumstance
  where you wanted to use a serial console as your primary console as
  well as using it to perform kernel debugging.  Of course you can
  also use kgdboc without assigning a console to the same port.
  </para>
  <sect2 id="UsingKgdboc">
  <title>Using kgdboc</title>
  <para>
  You can configure kgdboc via sysfs or a module or kernel boot line
  parameter depending on if you build with CONFIG_KGDBOC as a module
  or built-in.
  <orderedlist>
  <listitem><para>From the module load or build-in</para>
  <para><constant>kgdboc=&lt;tty-device&gt;,[baud]</constant></para>
  <para>
  The example here would be if your console port was typically ttyS0, you would use something like <constant>kgdboc=ttyS0,115200</constant> or on the ARM Versatile AB you would likely use <constant>kgdboc=ttyAMA0,115200</constant>
  </para>
  </listitem>
  <listitem><para>From sysfs</para>
  <para><constant>echo ttyS0 &gt; /sys/module/kgdboc/parameters/kgdboc</constant></para>
  </listitem>
  </orderedlist>
  </para>
  <para>
  NOTE: Kgdboc does not support interrupting the target via the
  gdb remote protocol.  You must manually send a sysrq-g unless you
  have a proxy that splits console output to a terminal problem and
  has a separate port for the debugger to connect to that sends the
  sysrq-g for you.
  </para>
  <para>When using kgdboc with no debugger proxy, you can end up
  connecting the debugger for one of two entry points.  If an
  exception occurs after you have loaded kgdboc a message should print
  on the console stating it is waiting for the debugger.  In case you
  disconnect your terminal program and then connect the debugger in
  its place.  If you want to interrupt the target system and forcibly
  enter a debug session you have to issue a Sysrq sequence and then
  type the letter <constant>g</constant>.  Then you disconnect the
  terminal session and connect gdb.  Your options if you don't like
  this are to hack gdb to send the sysrq-g for you as well as on the
  initial connect, or to use a debugger proxy that allows an
  unmodified gdb to do the debugging.
  </para>
  </sect2>
  </sect1>
  <sect1 id="kgdbcon">
  <title>Kernel parameter: kgdbcon</title>
  <para>
  Kgdb supports using the gdb serial protocol to send console messages
  to the debugger when the debugger is connected and running.  There
  are two ways to activate this feature.
  <orderedlist>
  <listitem><para>Activate with the kernel command line option:</para>
  <para><constant>kgdbcon</constant></para>
  </listitem>
  <listitem><para>Use sysfs before configuring an io driver</para>
  <para>
  <constant>echo 1 &gt; /sys/module/kgdb/parameters/kgdb_use_con</constant>
  </para>
  <para>
  NOTE: If you do this after you configure the kgdb I/O driver, the
  setting will not take effect until the next point the I/O is
  reconfigured.
  </para>
  </listitem>
  </orderedlist>
  </para>
  <para>
  IMPORTANT NOTE: Using this option with kgdb over the console
  (kgdboc) is not supported.
  </para>
  </sect1>
  </chapter>
  <chapter id="ConnectingGDB">
  <title>Connecting gdb</title>
    <para>
    If you are using kgdboc, you need to have used kgdbwait as a boot
    argument, issued a sysrq-g, or the system you are going to debug
    has already taken an exception and is waiting for the debugger to
    attach before you can connect gdb.
    </para>
    <para>
    If you are not using different kgdb I/O driver other than kgdboc,
    you should be able to connect and the target will automatically
    respond.
    </para>
    <para>
    Example (using a serial port):
    </para>
    <programlisting>
    % gdb ./vmlinux
    (gdb) set remotebaud 115200
    (gdb) target remote /dev/ttyS0
    </programlisting>
    <para>
    Example (kgdb to a terminal server on tcp port 2012):
    </para>
    <programlisting>
    % gdb ./vmlinux
    (gdb) target remote 192.168.2.2:2012
    </programlisting>
    <para>
    Once connected, you can debug a kernel the way you would debug an
    application program.
    </para>
    <para>
    If you are having problems connecting or something is going
    seriously wrong while debugging, it will most often be the case
    that you want to enable gdb to be verbose about its target
    communications.  You do this prior to issuing the <constant>target
    remote</constant> command by typing in: <constant>set remote debug 1</constant>
    </para>
  </chapter>
  <chapter id="KGDBTestSuite">
    <title>kgdb Test Suite</title>
    <para>
    When kgdb is enabled in the kernel config you can also elect to
    enable the config parameter KGDB_TESTS.  Turning this on will
    enable a special kgdb I/O module which is designed to test the
    kgdb internal functions.
    </para>
    <para>
    The kgdb tests are mainly intended for developers to test the kgdb
    internals as well as a tool for developing a new kgdb architecture
    specific implementation.  These tests are not really for end users
    of the Linux kernel.  The primary source of documentation would be
    to look in the drivers/misc/kgdbts.c file.
    </para>
    <para>
    The kgdb test suite can also be configured at compile time to run
    the core set of tests by setting the kernel config parameter
    KGDB_TESTS_ON_BOOT.  This particular option is aimed at automated
    regression testing and does not require modifying the kernel boot
    config arguments.  If this is turned on, the kgdb test suite can
    be disabled by specifying "kgdbts=" as a kernel boot argument.
    </para>
  </chapter>
  <chapter id="CommonBackEndReq">
  <title>KGDB Internals</title>
  <sect1 id="kgdbArchitecture">
    <title>Architecture Specifics</title>
      <para>
      Kgdb is organized into three basic components:
      <orderedlist>
      <listitem><para>kgdb core</para>
      <para>
      The kgdb core is found in kernel/kgdb.c.  It contains:
      <itemizedlist>
      <listitem><para>All the logic to implement the gdb serial protocol</para></listitem>
      <listitem><para>A generic OS exception handler which includes sync'ing the processors into a stopped state on an multi cpu system.</para></listitem>
      <listitem><para>The API to talk to the kgdb I/O drivers</para></listitem>
      <listitem><para>The API to make calls to the arch specific kgdb implementation</para></listitem>
      <listitem><para>The logic to perform safe memory reads and writes to memory while using the debugger</para></listitem>
      <listitem><para>A full implementation for software breakpoints unless overridden by the arch</para></listitem>
      </itemizedlist>
      </para>
      </listitem>
      <listitem><para>kgdb arch specific implementation</para>
      <para>
      This implementation is generally found in arch/*/kernel/kgdb.c.
      As an example, arch/x86/kernel/kgdb.c contains the specifics to
      implement HW breakpoint as well as the initialization to
      dynamically register and unregister for the trap handlers on
      this architecture.  The arch specific portion implements:
      <itemizedlist>
      <listitem><para>contains an arch specific trap catcher which
      invokes kgdb_handle_exception() to start kgdb about doing its
      work</para></listitem>
      <listitem><para>translation to and from gdb specific packet format to pt_regs</para></listitem>
      <listitem><para>Registration and unregistration of architecture specific trap hooks</para></listitem>
      <listitem><para>Any special exception handling and cleanup</para></listitem>
      <listitem><para>NMI exception handling and cleanup</para></listitem>
      <listitem><para>(optional)HW breakpoints</para></listitem>
      </itemizedlist>
      </para>
      </listitem>
      <listitem><para>kgdb I/O driver</para>
      <para>
      Each kgdb I/O driver has to provide an implemenation for the following:
      <itemizedlist>
      <listitem><para>configuration via builtin or module</para></listitem>
      <listitem><para>dynamic configuration and kgdb hook registration calls</para></listitem>
      <listitem><para>read and write character interface</para></listitem>
      <listitem><para>A cleanup handler for unconfiguring from the kgdb core</para></listitem>
      <listitem><para>(optional) Early debug methodology</para></listitem>
      </itemizedlist>
      Any given kgdb I/O driver has to operate very closely with the
      hardware and must do it in such a way that does not enable
      interrupts or change other parts of the system context without
      completely restoring them. The kgdb core will repeatedly "poll"
      a kgdb I/O driver for characters when it needs input.  The I/O
      driver is expected to return immediately if there is no data
      available.  Doing so allows for the future possibility to touch
      watch dog hardware in such a way as to have a target system not
      reset when these are enabled.
      </para>
      </listitem>
      </orderedlist>
      </para>
      <para>
      If you are intent on adding kgdb architecture specific support
      for a new architecture, the architecture should define
      <constant>HAVE_ARCH_KGDB</constant> in the architecture specific
      Kconfig file.  This will enable kgdb for the architecture, and
      at that point you must create an architecture specific kgdb
      implementation.
      </para>
      <para>
      There are a few flags which must be set on every architecture in
      their &lt;asm/kgdb.h&gt; file.  These are:
      <itemizedlist>
        <listitem>
	  <para>
	  NUMREGBYTES: The size in bytes of all of the registers, so
	  that we can ensure they will all fit into a packet.
	  </para>
	  <para>
	  BUFMAX: The size in bytes of the buffer GDB will read into.
	  This must be larger than NUMREGBYTES.
	  </para>
	  <para>
	  CACHE_FLUSH_IS_SAFE: Set to 1 if it is always safe to call
	  flush_cache_range or flush_icache_range.  On some architectures,
	  these functions may not be safe to call on SMP since we keep other
	  CPUs in a holding pattern.
	  </para>
	</listitem>
      </itemizedlist>
      </para>
      <para>
      There are also the following functions for the common backend,
      found in kernel/kgdb.c, that must be supplied by the
      architecture-specific backend unless marked as (optional), in
      which case a default function maybe used if the architecture
      does not need to provide a specific implementation.
      </para>
!Iinclude/linux/kgdb.h
  </sect1>
  <sect1 id="kgdbocDesign">
  <title>kgdboc internals</title>
  <para>
  The kgdboc driver is actually a very thin driver that relies on the
  underlying low level to the hardware driver having "polling hooks"
  which the to which the tty driver is attached.  In the initial
  implementation of kgdboc it the serial_core was changed to expose a
  low level uart hook for doing polled mode reading and writing of a
  single character while in an atomic context.  When kgdb makes an I/O
  request to the debugger, kgdboc invokes a call back in the serial
  core which in turn uses the call back in the uart driver.  It is
  certainly possible to extend kgdboc to work with non-uart based
  consoles in the future.
  </para>
  <para>
  When using kgdboc with a uart, the uart driver must implement two callbacks in the <constant>struct uart_ops</constant>. Example from drivers/8250.c:<programlisting>
#ifdef CONFIG_CONSOLE_POLL
	.poll_get_char = serial8250_get_poll_char,
	.poll_put_char = serial8250_put_poll_char,
#endif
  </programlisting>
  Any implementation specifics around creating a polling driver use the
  <constant>#ifdef CONFIG_CONSOLE_POLL</constant>, as shown above.
  Keep in mind that polling hooks have to be implemented in such a way
  that they can be called from an atomic context and have to restore
  the state of the uart chip on return such that the system can return
  to normal when the debugger detaches.  You need to be very careful
  with any kind of lock you consider, because failing here is most
  going to mean pressing the reset button.
  </para>
  </sect1>
  </chapter>
  <chapter id="credits">
     <title>Credits</title>
	<para>
		The following people have contributed to this document:
		<orderedlist>
			<listitem><para>Amit Kale<email>amitkale@linsyssoft.com</email></para></listitem>
			<listitem><para>Tom Rini<email>trini@kernel.crashing.org</email></para></listitem>
		</orderedlist>
                In March 2008 this document was completely rewritten by:
		<itemizedlist>
		<listitem><para>Jason Wessel<email>jason.wessel@windriver.com</email></para></listitem>
		</itemizedlist>
	</para>
  </chapter>
</book>