4. Sử dụng GDB
4.5. Debug những chương trình T-Kernel-based
4.5.1. Khởi động máy đích
Gắn boot disk vào máy đích và khởi động nó với DIP-SW1 ở vị trí OFF.Nếu DIP-SW1 ON,nó khởi động T-Monitor và dừng.Trong trường hợp này đánh lệnh bd pca0 để bắt đầu T-Kernel.
4.5.2. Debug với GDB devl@pc1:/usr/local/te/$ cd /usr/local/te/kappl/sample/sh7760.debug devl@pc1:/usr/local/te/kappl/sample/sh7760.debug/$ /usr/local/te/tool/Linux-i686/etc/gterm -3 -l/dev/ttyS0 Bắt đầu gterm << Gterm ver 2.21 : 031217 >> [/SYS]% recv sample.trg
Chuyển chương trình cho debug bằng lệnh “recv filename” của CLI.Nếu sample.trg đã tồn tại,thực thi lệnh “recv -d filename “ để overwrite nó.
Target: sample.trg
[Target: sample.trg: 15236 bytes] ....*...! (2933.0 bytes/sec)
[/SYS]% lodspg sample.trg
Thực thi lệnh “lodspg filename ” để load chương trình T-Kernel-based vào bộ nhớ. TM> .q
tm_monitor() thêm vào cho debug thực thi ,chuyển quyền điều khiển cho T-Monitor. Thoát gterm tại đây.
<< exit Gterm>>
devl@pc1:/usr/local/te/kappl/sample/sh7760.debug/$
/usr/local/te/tool/Linux-i686/bin/sh-unknown-tmonitor-gdb sample.abs
Bắt đầu GDB. GNU gdb 5.2
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "--host=i686-pc-linux-gnu
0xc0002a2c in tm monitor ()
Hiển thị source code xung quanh vị trí hiện hành. (gdb) l
11 #ifdef DEBUG
12 #include <util/tmonitor.h> 13 #endif
14
15 EXPORT ER main( INT ac, UB *av[] )
16 { 17 INT i; 18 19 #ifdef DEBUG 20 tm_monitor(); (gdb) l 21 #endif
22 printf("hello (ac=%d)\n", ac); 23
24 for ( i = 0; i < ac; ++i ) {
25 printf(" av[%d] = '%s'\n", i, av[i]);
26 }
27
28 return E_OK; 29 }
(gdb) b 25
Một breakpoint được thiết lập ở dòng 25.Để thiết lập breakpont ở một file khác,đánh lệnh như “b sub.c:34”.
Breakpoint 1 at 0xc00001e0: file ../src/main.c, line 25. (gdb) c
Continuing.
from target> hello (ac=1)
Breakpoint 1, main (ac=1, av=0x40259188) at ../src/main.c:25 25 printf(" av[%d] = '%s'\n", i, av[i]);
Sự thực thi dừng ở breakpoint.Source code xung quanh điểm này được hiển thị. (gdb) p i
Hiển thị biến i $1 = 0
(gdb) p av[i]
av[i] được hiển thị.
$2 = (UB *) 0x40259170 "sample.trg" (gdb) p ac
biến ac được hiển thị. $3 = 1
(gdb) n
n (next) tiến đến một dòng.
from target> av[0] = 'sample.trg' 24 for ( i = 0; i < ac; ++i ) { (gdb) n
28 return E_OK;
(gdb) p i
(gdb) c
Sự thực thi được khôi phục bằng c (continue). Continuing.
from target> SYSPRG sample.trg [6] c0000000 - c0005000 from target> [/SYS]%
Khi chương trình được debug kết thúc,không có kết quả trả về cho GDB .Trng trường hợp như vậy nhấn Ctrl + C hai lần để hiển thị GDB prompt.
from target> [/SYS]% [/SYS]% Interrupted while waiting for the program. Give up (and stop debugging it)? (y or n)y
(gdb) q
Thoát GDB bằng q(quit).
devl@pc1:/usr/local/te/kappl/sample/sh7760.debug/$
Thông thường khi một chương trình kết thúc,nó vẫn còn ở trong bộ nhớ.Khi GDB thoát bằng Ctrl + C mà breakpoint vẫn còn được thiết lập như trên,những breakpoint định bởi T-Monitor vẫn lưu lại.Bắt đầu gterm ,đến T-Monitor và xóa những breakpoint này.
devl@pc1:/usr/local/te/kappl/sample/sh7760.debug/$
/usr/local/te/tool/Linux-i686/etc/gterm -3 -l/dev/ttyS0
<< Gterm ver 2.21 : 031217 >> Lệnh # chuyển đến T-Monitor. [/SYS]% #
Liệt kê các breakpoint bằng lệnh b của T-Monitor . TM> b
C00001E0 S
Xóa breakpoint bằng lệnh bc của T-Moniotr TM> bc
Trở lại CLI bằng lệnh g của T-Monitor. TM> g
[/SYS]%
Thực thi lệnh “regspg” của CLI để xác nhận chương trình hệ thống được load. [/SYS]% ref spg SYSTEM PROGRAM: [ 1] - 0x40208000 - 11 kbpd [ 2] - 0x40213000 - 8 lowkbpd [ 3] - 0x4021b000 - 6 rsdrv [ 4] - 0x40221000 - 5 screen [ 5] - 0x40273000 - 53 unixemu [ 6] - 0xc0000000 - 5 sample.trg
Sử dụng lệnh “unlspg load ID” của CLI để xóa một chương trình T-Kernel-based thường trú trong bộ nhớ.
[/SYS]% unlspg 6
Sự thực thi dừng lại ở tm_moniotor().Khôi phục sự thực thi bằng lệnh g của T-Monitor TM> g
hello (ac=-1) [/SYS]%