Sonic Zhang | 474f1a6 | 2007-06-29 16:35:17 +0800 | [diff] [blame] | 1 | A Simple Guide to Configure KGDB |
| 2 | |
| 3 | Sonic Zhang <sonic.zhang@analog.com> |
| 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. |