1 |
62 |
marcus.erl |
A Simple Guide to Configure KGDB
|
2 |
|
|
|
3 |
|
|
Sonic Zhang
|
4 |
|
|
Aug. 24th 2006
|
5 |
|
|
|
6 |
|
|
|
7 |
|
|
This KGDB patch enables the kernel developer to do source level debugging on
|
8 |
|
|
the kernel for the Blackfin architecture. The debugging works over either the
|
9 |
|
|
ethernet interface or one of the uarts. Both software breakpoints and
|
10 |
|
|
hardware breakpoints are supported in this version.
|
11 |
|
|
http://docs.blackfin.uclinux.org/doku.php?id=kgdb
|
12 |
|
|
|
13 |
|
|
|
14 |
|
|
2 known issues:
|
15 |
|
|
1. This bug:
|
16 |
|
|
http://blackfin.uclinux.org/tracker/index.php?func=detail&aid=544&group_id=18&atid=145
|
17 |
|
|
The GDB client for Blackfin uClinux causes incorrect values of local
|
18 |
|
|
variables to be displayed when the user breaks the running of kernel in GDB.
|
19 |
|
|
2. Because of a hardware bug in Blackfin 533 v1.0.3:
|
20 |
|
|
05000067 - Watchpoints (Hardware Breakpoints) are not supported
|
21 |
|
|
Hardware breakpoints cannot be set properly.
|
22 |
|
|
|
23 |
|
|
|
24 |
|
|
Debug over Ethernet:
|
25 |
|
|
|
26 |
|
|
1. Compile and install the cross platform version of gdb for blackfin, which
|
27 |
|
|
can be found at $(BINROOT)/bfin-elf-gdb.
|
28 |
|
|
|
29 |
|
|
2. Apply this patch to the 2.6.x kernel. Select the menuconfig option under
|
30 |
|
|
"Kernel hacking" -> "Kernel debugging" -> "KGDB: kernel debug with remote gdb".
|
31 |
|
|
With this selected, option "Full Symbolic/Source Debugging support" and
|
32 |
|
|
"Compile the kernel with frame pointers" are also selected.
|
33 |
|
|
|
34 |
|
|
3. Select option "KGDB: connect over (Ethernet)". Add "kgdboe=@target-IP/,@host-IP/" to
|
35 |
|
|
the option "Compiled-in Kernel Boot Parameter" under "Kernel hacking".
|
36 |
|
|
|
37 |
|
|
4. Connect minicom to the serial port and boot the kernel image.
|
38 |
|
|
|
39 |
|
|
5. Configure the IP "/> ifconfig eth0 target-IP"
|
40 |
|
|
|
41 |
|
|
6. Start GDB client "bfin-elf-gdb vmlinux".
|
42 |
|
|
|
43 |
|
|
7. Connect to the target "(gdb) target remote udp:target-IP:6443".
|
44 |
|
|
|
45 |
|
|
8. Set software breakpoint "(gdb) break sys_open".
|
46 |
|
|
|
47 |
|
|
9. Continue "(gdb) c".
|
48 |
|
|
|
49 |
|
|
10. Run ls in the target console "/> ls".
|
50 |
|
|
|
51 |
|
|
11. Breakpoint hits. "Breakpoint 1: sys_open(..."
|
52 |
|
|
|
53 |
|
|
12. Display local variables and function paramters.
|
54 |
|
|
(*) This operation gives wrong results, see known issue 1.
|
55 |
|
|
|
56 |
|
|
13. Single stepping "(gdb) si".
|
57 |
|
|
|
58 |
|
|
14. Remove breakpoint 1. "(gdb) del 1"
|
59 |
|
|
|
60 |
|
|
15. Set hardware breakpoint "(gdb) hbreak sys_open".
|
61 |
|
|
|
62 |
|
|
16. Continue "(gdb) c".
|
63 |
|
|
|
64 |
|
|
17. Run ls in the target console "/> ls".
|
65 |
|
|
|
66 |
|
|
18. Hardware breakpoint hits. "Breakpoint 1: sys_open(...".
|
67 |
|
|
(*) This hardware breakpoint will not be hit, see known issue 2.
|
68 |
|
|
|
69 |
|
|
19. Continue "(gdb) c".
|
70 |
|
|
|
71 |
|
|
20. Interrupt the target in GDB "Ctrl+C".
|
72 |
|
|
|
73 |
|
|
21. Detach from the target "(gdb) detach".
|
74 |
|
|
|
75 |
|
|
22. Exit GDB "(gdb) quit".
|
76 |
|
|
|
77 |
|
|
|
78 |
|
|
Debug over the UART:
|
79 |
|
|
|
80 |
|
|
1. Compile and install the cross platform version of gdb for blackfin, which
|
81 |
|
|
can be found at $(BINROOT)/bfin-elf-gdb.
|
82 |
|
|
|
83 |
|
|
2. Apply this patch to the 2.6.x kernel. Select the menuconfig option under
|
84 |
|
|
"Kernel hacking" -> "Kernel debugging" -> "KGDB: kernel debug with remote gdb".
|
85 |
|
|
With this selected, option "Full Symbolic/Source Debugging support" and
|
86 |
|
|
"Compile the kernel with frame pointers" are also selected.
|
87 |
|
|
|
88 |
|
|
3. Select option "KGDB: connect over (UART)". Set "KGDB: UART port number" to be
|
89 |
|
|
a different one from the console. Don't forget to change the mode of
|
90 |
|
|
blackfin serial driver to PIO. Otherwise kgdb works incorrectly on UART.
|
91 |
|
|
|
92 |
|
|
4. If you want connect to kgdb when the kernel boots, enable
|
93 |
|
|
"KGDB: Wait for gdb connection early"
|
94 |
|
|
|
95 |
|
|
5. Compile kernel.
|
96 |
|
|
|
97 |
|
|
6. Connect minicom to the serial port of the console and boot the kernel image.
|
98 |
|
|
|
99 |
|
|
7. Start GDB client "bfin-elf-gdb vmlinux".
|
100 |
|
|
|
101 |
|
|
8. Set the baud rate in GDB "(gdb) set remotebaud 57600".
|
102 |
|
|
|
103 |
|
|
9. Connect to the target on the second serial port "(gdb) target remote /dev/ttyS1".
|
104 |
|
|
|
105 |
|
|
10. Set software breakpoint "(gdb) break sys_open".
|
106 |
|
|
|
107 |
|
|
11. Continue "(gdb) c".
|
108 |
|
|
|
109 |
|
|
12. Run ls in the target console "/> ls".
|
110 |
|
|
|
111 |
|
|
13. A breakpoint is hit. "Breakpoint 1: sys_open(..."
|
112 |
|
|
|
113 |
|
|
14. All other operations are the same as that in KGDB over Ethernet.
|
114 |
|
|
|
115 |
|
|
|
116 |
|
|
Debug over the same UART as console:
|
117 |
|
|
|
118 |
|
|
1. Compile and install the cross platform version of gdb for blackfin, which
|
119 |
|
|
can be found at $(BINROOT)/bfin-elf-gdb.
|
120 |
|
|
|
121 |
|
|
2. Apply this patch to the 2.6.x kernel. Select the menuconfig option under
|
122 |
|
|
"Kernel hacking" -> "Kernel debugging" -> "KGDB: kernel debug with remote gdb".
|
123 |
|
|
With this selected, option "Full Symbolic/Source Debugging support" and
|
124 |
|
|
"Compile the kernel with frame pointers" are also selected.
|
125 |
|
|
|
126 |
|
|
3. Select option "KGDB: connect over UART". Set "KGDB: UART port number" to console.
|
127 |
|
|
Don't forget to change the mode of blackfin serial driver to PIO.
|
128 |
|
|
Otherwise kgdb works incorrectly on UART.
|
129 |
|
|
|
130 |
|
|
4. If you want connect to kgdb when the kernel boots, enable
|
131 |
|
|
"KGDB: Wait for gdb connection early"
|
132 |
|
|
|
133 |
|
|
5. Connect minicom to the serial port and boot the kernel image.
|
134 |
|
|
|
135 |
|
|
6. (Optional) Ask target to wait for gdb connection by entering Ctrl+A. In minicom, you should enter Ctrl+A+A.
|
136 |
|
|
|
137 |
|
|
7. Start GDB client "bfin-elf-gdb vmlinux".
|
138 |
|
|
|
139 |
|
|
8. Set the baud rate in GDB "(gdb) set remotebaud 57600".
|
140 |
|
|
|
141 |
|
|
9. Connect to the target "(gdb) target remote /dev/ttyS0".
|
142 |
|
|
|
143 |
|
|
10. Set software breakpoint "(gdb) break sys_open".
|
144 |
|
|
|
145 |
|
|
11. Continue "(gdb) c". Then enter Ctrl+C twice to stop GDB connection.
|
146 |
|
|
|
147 |
|
|
12. Run ls in the target console "/> ls". Dummy string can be seen on the console.
|
148 |
|
|
|
149 |
|
|
13. Then connect the gdb to target again. "(gdb) target remote /dev/ttyS0".
|
150 |
|
|
Now you will find a breakpoint is hit. "Breakpoint 1: sys_open(..."
|
151 |
|
|
|
152 |
|
|
14. All other operations are the same as that in KGDB over Ethernet. The only
|
153 |
|
|
difference is that after continue command in GDB, please stop GDB
|
154 |
|
|
connection by 2 "Ctrl+C"s and connect again after breakpoints are hit or
|
155 |
|
|
Ctrl+A is entered.
|