Debug những phần mềm Process-based

Một phần của tài liệu T - engine and T - monitor (Trang 67 - 71)

4. Sử dụng GDB

4.6. Debug những phần mềm Process-based

Một chương trình process-based được compile cho debug sử dụng,sau đó gterm được dùng để gởi chương trình từ máy chủ đến đích,nơi mà nó được lưu lên đĩa như là load một chương trình bình thường.Trong một số trường hợp chỉ một bộ phận chương trình

process-based được load lên bộ nhớ thực,do đó một lỗi xảy ra khi trình debug truy cập phần không ở trên bộ nhớ.Trong suốt quá trình debug thực thi lệnh sau của CLI để chương trình được load lại:

ref pld 1 Thực thi lệnh: ref dbg 1

để chuyển quyền điều khiển chuyển sang cho T-Monitor khi một exection xảy ra

4.6.1. Khi độ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 ,máy đích khởi động T-Monitor và dừng.Trong trường hợp này thực thi bd pca0 để bắt đầu T-Kernel. 4.6.2. Debug vi GDB devl@pc1:/usr/local/te/$ cd /usr/local/te/bappl/fileio/sh7760.debug devl@pc1:/usr/local/te/bappl/fileio/sh7760.debug/$ /usr/local/te/tool/Linux-i686/etc/gterm -3 -l/dev/ttyS0 << Gterm ver 2.21 : 031217 >> [/SYS]% recv test.trg

Target: test.trg

.. [test.trg: 61024 bytes]

....*....*....*....*....*....*....*.! (3876.2 bytes/sec) Bắt đầu chương trình để debug

[/SYS]% ref pld 1

[/SYS]% ref dbg 1

[/SYS]% test.trg

tm_monitor() trong chương trình để debug chuyển quyền điều khiển sang T-Monitor,do đó nhập .q để thoát khỏi gterm

TM> .q

<< exit Gterm >> Bắt đầu GDB.

devl@pc1:/usr/local/te/bappl/fileio/sh7760.debug/$

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

--target=sh-unknown-tmonitor"... 0x0010917c in tm monitor ()

y This shows that processing has stopped in tm monitor().

GNU Dev. Env. Manual (SH7760) 1.A0.00 Copyright c ° 2004 by Personal Media Corporation

5 USING GDB 26

Hiển thị source code xung quanh vùng hiện hành. (gdb) l 578 tk_ext_tsk(); 579 } 580 #endif 581 582 MBEG 583 {

584 /* In case of T-Kernel based program, the following is 585 executed in the context of the initial process. */

586 #ifdef DEBUG 587 tm_monitor(); (gdb) l

588 #endif

589 printf( "ANSI-C fileio test start\n" ); 590 591 test_remove(); 592 test_rename(); 593 test_fopen_a(); 594 test_fopen_w(); 595 test_tmpfile(); 596 test_tmpnam(); 597 test_setbuf();

Thiết lập breakpoint trong hàm test_fopen_a(). (gdb) b test_ fopen_ a

Breakpoint 1 at 0x101394: file ../src/test.c, line 152. (gdb) c

Continuing.

from target> ANSI-C fileio test start

Breakpoint 1 at 0x100e28: file ../src/test.c, line 152. 152 assert( (f = fopen( F, "w" )) != NULL );

Sự thực thi dừng ở breakpoint.Source code xung quanh điểm đó được hiển thị. (gdb) s

Enters the hàm fopen()

fopen (filename=0x109f38 "tmp00", mode=0x109d2c "w") at ../src/fileio.c:793 793 initialize();

788 FILE *fopen( const char *filename, const char *mode ) 789 { 790 FILE *stream; 791 792 /* initialization */ 793 initialize(); 794

795 /* allocate FILE structure */

796 if ((stream = alloc_file()) == NULL) {

797 goto er0;

(gdb) l

798 } 799 799

800 /* open file */

801 if ( open_file( filename, mode, bdy( stream ), 0 ) < 0 ) {

802 goto er1; 803 } 804 805 /* exit normally */ 806 return stream; 807 (gdb) tb open file

Một breakpoint tạm thời được thiết lập trong open_file(). Breakpoint 2 at 0x104932: file ../src/fileio.c, line 624. (gdb) c

Continuing.

open file (filename=0x109f38 "tmp00", mode=0x109d2c "w", stream=0x1cd010, tmp flag=0) at .. /src/fileio.c:624

Sự thực thi dừng ở pen_file().Breakpoint này tự động được xóa. 624 md = LINE_MODE; (gdb) l 619 const char *p; 620 int e, fd, md, siz; 621 TC bp[FILENAME_MAX]; 622 623 /* interpret mode */ 624 md = LINE_MODE; 625 p = mode; 626 switch (*p++) { 627 case 'r' : 628 md |= READ_MODE; (gdb) l 629 break; 630 case 'w' : 631 md |= WRITE_MODE; 632 break; 633 case 'a' : 634 md |= APPEND_MODE; 635 break; 636 default :

637 goto er1; 638 } (gdb) l 639 while (*p != '\0') { 640 switch (*p++) { 641 case '+' : 642 md |= UPDATE_MODE; 643 break; 644 case 'b' : 645 md ^= LINE_MODE; 646 break; 647 default : 648 goto er1; (gdb) l 649 } 650 } 651 652 /* open file */ 653 conv_pathname( filename, bp ); 654 if (tmp_flag ||

655 get_lnk( bp, &(stream -> lnk), F_NORM ) < 0) { /* file not exists */ 656 if ((md & (READ_MODE | WRITE_MODE | APPEND_MODE)) == READ_MODE) {

657 goto er1; /* error if file not exists in read mode */

658 }

(gdb) tb 653

Breakpoint 3 at 0x104a80: file ../src/fileio.c, line 653. (gdb) c

Continuing.

open file (filename=0x109f38 "tmp00", mode=0x109d2c "w", 0x104932, tmp flag=0) at .. /src/fileio.c:653

653 conv_pathname( filename, bp ); (gdb) n

654 if (tmp_flag || (gdb) n

656 if ((md & (READ_MODE | WRITE_MODE | APPEND_MODE)) == READ_MODE) {

(gdb) n

659 fd = create_file( bp, &(stream -> lnk), !tmp_flag ); /* create a new file */ (gdb) s

Nhập create_file()

create file (path=0x1ccd58, lnk=0x1cd032, parent flag=1) at ../src/fileio.c:206 206 if ((k = get_parent_link( path, &pln )) < 0) {

(gdb) n

211 *lnk = pln; (gdb) p/x pln

Giá trị của pln được hiển thị ở dạng hexadecimal.

$1 = {fs name = {0x2357, 0x234f, 0x2352, 0x234b, 0x0 <repeats 16 times>}, f_ id = 0x0, atr1 = 0x0, atr2 = 0x0, atr3 = 0x0, atr4 = 0x0, atr5 = 0x0}

212 fd = cre_fil( lnk, (gdb) n

218 if (fd < 0) { (gdb) p fd

Giá trị của fd được hiển thị ở dạng decimal. $2 = 37

(gdb) c

Nhập c (continue) để khôi phục sự thực thi. Continuing.

from target> test OK! from target> [/SYS]%

Khi chương trình được debug kết thúc,không có giá trị trả về cho GDB.Trong trường hợp này nhập Ctrl + C hai lần để hiển thị GDB prompt.

from target> [/SYS]% [/SYS]% [/SYS]% Ngắt quãng trong khi chờ đợi chương trình Give up (and stop debugging it)? (y or n) y

(gdb) q

devl@pc1:/usr/local/te/bappl/fileio/sh7760.debug/$

Khi GDB được thoát bằng Ctrl + C mà breakpoints vẫn thiết lập như trên, breakpoints thiết lập bởi T-Monitor sẽ vẫn còn.Đến T-Monitor và xóa breakpoints .

devl@pc1:/usr/local/te/bappl/fileio/sh7760.debug/$

/usr/local/te/tool/Linux-i686/etc/gterm -3 -l/dev/ttyS0

<< Gterm ver 2.21 : 031217 >> [/SYS]% #

Liệt kê các breakpoint bằng lệnh b của T-Monitor. TM> b

00100E28 S

Xóa breakpoints bằng lệnh bc của T-Monitor. TM> bc

Trở lại CLI bằng lệnh g của T-Monitor TM> g

[/SYS]%

Một phần của tài liệu T - engine and T - monitor (Trang 67 - 71)

Tải bản đầy đủ (PDF)

(100 trang)