Blame view

Documentation/sh/kgdb.txt 7.59 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
  
  This file describes the configuration and behavior of KGDB for the SH
  kernel. Based on a description from Henry Bell <henry.bell@st.com>, it
  has been modified to account for quirks in the current implementation.
  
  Version
  =======
  
  This version of KGDB was written for 2.4.xx kernels for the SH architecture.
  Further documentation is available from the linux-sh project website.
  
  
  Debugging Setup: Host
  ======================
  
  The two machines will be connected together via a serial line - this
  should be a null modem cable i.e. with a twist.
  
  On your DEVELOPMENT machine, go to your kernel source directory and
  build the kernel, enabling KGDB support in the "kernel hacking" section.
  This includes the KGDB code, and also makes the kernel be compiled with
  the "-g" option set -- necessary for debugging.
  
  To install this new kernel, use the following installation procedure.
  
  Decide on which tty port you want the machines to communicate, then
  cable them up back-to-back using the null modem.  On the DEVELOPMENT
  machine, you may wish to create an initialization file called .gdbinit
  (in the kernel source directory or in your home directory) to execute 
  commonly-used commands at startup.
  
  A minimal .gdbinit might look like this:
  
    file vmlinux
    set remotebaud 115200
    target remote /dev/ttyS0
  
  Change the "target" definition so that it specifies the tty port that
  you intend to use.  Change the "remotebaud" definition to match the
  data rate that you are going to use for the com line (115200 is the
  default). 
  
  Debugging Setup: Target
  ========================
  
  By default, the KGDB stub will communicate with the host GDB using
  ttySC1 at 115200 baud, 8 databits, no parity; these defaults can be
  changed in the kernel configuration. As the kernel starts up, KGDB will
  initialize so that breakpoints, kernel segfaults, and so forth will
  generally enter the debugger.
  
  This behavior can be modified by including the "kgdb" option in the
  kernel command line; this option has the general form:
  
    kgdb=<ttyspec>,<action>
  
  The <ttyspec> indicates the port to use, and can optionally specify
  baud, parity and databits -- e.g. "ttySC0,9600N8" or "ttySC1,19200".
  
  The <action> can be "halt" or "disabled".  The "halt" action enters the
  debugger via a breakpoint as soon as kgdb is initialized; the "disabled"
  action causes kgdb to ignore kernel segfaults and such until explicitly
  entered by a breakpoint in the code or by external action (sysrq or NMI). 
  
  (Both <ttyspec> and <action> can appear alone, w/o the separating comma.)
  
  For example, if you wish to debug early in kernel startup code, you
  might specify the halt option:
  
    kgdb=halt
2fe0ae78c   Matt LaPlante   Fix typos in Docu...
71
  Boot the TARGET machine, which will appear to hang. 
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
  
  On your DEVELOPMENT machine, cd to the source directory and run the gdb
  program.  (This is likely to be a cross GDB which runs on your host but
  is built for an SH target.) If everything is working correctly you
  should see gdb print out a few lines indicating that a breakpoint has
  been taken.  It will actually show a line of code in the target kernel
  inside the gdbstub activation code.
  
  NOTE: BE SURE TO TERMINATE OR SUSPEND any other host application which
  may be using the same serial port (for example, a terminal emulator you
  have been using to connect to the target boot code.)  Otherwise, data
  from the target may not all get to GDB!
  
  You can now use whatever gdb commands you like to set breakpoints.
  Enter "continue" to start your target machine executing again.  At this
  point the target system will run at full speed until it encounters
  your breakpoint or gets a segment violation in the kernel, or whatever.
  
  Serial Ports: KGDB, Console
  ============================
  
  This version of KGDB may not gracefully handle conflict with other
  drivers in the kernel using the same port. If KGDB is configured on the
  same port (and with the same parameters) as the kernel console, or if
  CONFIG_SH_KGDB_CONSOLE is configured, things should be fine (though in
  some cases console messages may appear twice through GDB).  But if the
  KGDB port is not the kernel console and used by another serial driver
  which assumes different serial parameters (e.g. baud rate) KGDB may not
  recover.
  
  Also, when KGDB is entered via sysrq-g (requires CONFIG_KGDB_SYSRQ) and
  the kgdb port uses the same port as the console, detaching GDB will not
  restore the console to working order without the port being re-opened.
  
  Another serious consequence of this is that GDB currently CANNOT break
  into KGDB externally (e.g. via ^C or <BREAK>); unless a breakpoint or
  error is encountered, the only way to enter KGDB after the initial halt
  (see above) is via NMI (CONFIG_KGDB_NMI) or sysrq-g (CONFIG_KGDB_SYSRQ).
  
  Code is included for the basic Hitachi Solution Engine boards to allow
  the use of ttyS0 for KGDB if desired; this is less robust, but may be
  useful in some cases.  (This cannot be selected using the config file, 
  but only through the kernel command line, e.g. "kgdb=ttyS0", though the
  configured defaults for baud rate etc. still apply if not overridden.)
  
  If gdbstub Does Not Work
  ========================
  
  If it doesn't work, you will have to troubleshoot it.  Do the easy
  things first like double checking your cabling and data rates.  You
  might try some non-kernel based programs to see if the back-to-back
  connection works properly.  Just something simple like cat /etc/hosts
  /dev/ttyS0 on one machine and cat /dev/ttyS0 on the other will tell you
  if you can send data from one machine to the other.  There is no point
  in tearing out your hair in the kernel if the line doesn't work.
  
  If you need to debug the GDB/KGDB communication itself, the gdb commands
  "set debug remote 1" and "set debug serial 1" may be useful, but be
  warned: they produce a lot of output.
  
  Threads
  =======
  
  Each process in a target machine is seen as a gdb thread. gdb thread related
  commands (info threads, thread n) can be used. CONFIG_KGDB_THREAD must
  be defined for this to work.
  
  In this version, kgdb reports PID_MAX (32768) as the process ID for the
  idle process (pid 0), since GDB does not accept 0 as an ID.
  
  Detaching (exiting KGDB)
  =========================
  
  There are two ways to resume full-speed target execution: "continue" and
  "detach". With "continue", GDB inserts any specified breakpoints in the
  target code and resumes execution; the target is still in "gdb mode".
  If a breakpoint or other debug event (e.g. NMI) happens, the target
  halts and communicates with GDB again, which is waiting for it.
  
  With "detach", GDB does *not* insert any breakpoints; target execution
  is resumed and GDB stops communicating (does not wait for the target).
  In this case, the target is no longer in "gdb mode" -- for example,
  console messages no longer get sent separately to the KGDB port, or
  encapsulated for GDB.  If a debug event (e.g. NMI) occurs, the target
  will re-enter "gdb mode" and will display this fact on the console; you
  must give a new "target remote" command to gdb.
  
  NOTE: TO AVOID LOSSING CONSOLE MESSAGES IN CASE THE KERNEL CONSOLE AND
  KGDB USING THE SAME PORT, THE TARGET WAITS FOR ANY INPUT CHARACTER ON
  THE KGDB PORT AFTER A DETACH COMMAND.  For example, after the detach you
  could start a terminal emulator on the same host port and enter a <cr>;
  however, this program must then be terminated or suspended in order to
  use GBD again if KGDB is re-entered.
  
  
  Acknowledgements
  ================
  
  This code was mostly generated by Henry Bell <henry.bell@st.com>;
  largely from KGDB by Amit S. Kale <akale@veritas.com> - extracts from
  code by Glenn Engel, Jim Kingdon, David Grothe <dave@gcom.com>, Tigran
  Aivazian <tigran@sco.com>, William Gatliff <bgat@open-widgets.com>, Ben
  Lee, Steve Chamberlain and Benoit Miller <fulg@iname.com> are also
  included. 
  
  Jeremy Siegel
  <jsiegel@mvista.com>