Sử dụng dbg trong linux

GDB là một chương trình debug, gỡ rối chương trình rất phổ biến đối với công việc lập trình trong linux.
Chúng ta sẽ đi tìm hiểu sơ lược về cách sử dụng chương trình.

Giả sử ở đây, chúng ta có file main.c với nội dung như sau

#incldue


int main()
{
int date= 22;
int month= 12;
int year = 2010;
printf(“\n***********************************”);
printf(“\n*** hello all ***”);
printf(“\n*** chung ta se cung tim hieu ve GDB ***”);
printf(“\n***********************************”);
printf(“\n@copyright mathhoang ngay %d thang %d nam %d”,date,month,year”);
return 1;
}
------------------------------------------
sử dụng gcc để biên dịch chương trình thành file thực thi, chú ý là các bạn phải thêm option [-g] để cho phép chạy debug.
Lệnh compile như sau:

$ gcc -o -g main main.c

------------------------------------------
sau khi compile xong, chúng ta sẽ được file thực thi main.
Để bắt đầu debug file thự thi
$ gdb [ten_file_thuc_thi]

ví dụ;
$gdb main

------------------------------------------
trong console của GDB, để thực thi các lệnh của linux

(gdb) shell [lenh_linux]

ví dụ:
(gdb) shell clear
(gdb) shell ls

------------------------------------------
để set break point ở một vị trí nào đó:

(gdb) break [so_dong]
hoặc
(gdb) break [ten_ham]
ví dụ:
cần đặt breakpoint tại dòng thứ 10 trong main.c
(gdb) break 10

hoặc đặt breakpoint tại hàm main
(gdb) break main

------------------------------------------
để xóa breakpoint
(gdb) delete [so_thu_tu_break_point]

ví dụ
xóa breakpoint thứ 2
(gdb) delete 2

------------------------------------------
sau khi đã đặt breakpoint( hoặc ko cần đặt breakpoint tùy cách chúng ta debug), thì chúng ta bắt đầu chạy chương trình bằng lệnh sau
(gdb) run

------------------------------------------
muốn xem chương trình đã dừng ở đâu
(gdb) list

ở ví dụ của chúng ta chỉ có hàm main, do đó khi dùng lệnh list thì sẽ hiển thị duy nhất các dòng code của hàm main. Còn nếu chương trình đang chạy ở 1 function nào đó, ví dụ function aaaa thì sẽ list code của function đó.

------------------------------------------
chúng ta muốn chương trình chạy dòng lệnh kế tiếp thì trong gdb gõ
(gdb) next [so_dong]

nếu không có [so_dong ] thì dòng lệnh kế tiếp dòng lệnh hiện tại được thực thi, còn nếu có [so_dong] thì chương trình sẽ thực thi từ dòng lệnh hiện tại tới dòng lệnh [so_dong]

------------------------------------------
muốn chạy vào bên trong thân hàm
(gdb) step

------------------------------------------
muốn quay lại đầu hàm thì dùng lệnh
(gdb) return

------------------------------------------
muốn chương trình thực thi tiếp cho đến breakpoint kế hoặc đếnt hết chương trình
(gdb) continue

------------------------------------------
trong quá trình chạy debug chúng ta muốn xem một biến có giá trị bằng bao nhiêu
(gdb) display [ten_bien]

ví dụ: trong hàm main của chúng ta có biến date, mà muốn xem biến này chúng ta thực hiện lệnh
(gdb) display date

------------------------------------------
muốn in giá trị của 1 biến trong console
(gdb) print [ten_bien]

ví dụ
(gdb) print date

------------------------------------------
muốn in địa chỉ của biến
(gdb) print &[ten_bien]

ví dụ
(gdb) print &date

------------------------------------------
hiển thị kiểu dữ liệu của biến
(gdb) ptype [ten_bien]
hoặc
(gdb) whatis [ten_bien]

ví dụ
(gdb) ptype date

------------------------------------------
gán giá trị cho 1 biến
(gdb) set variable [ten_bien] = [value]
(gdb) continue

ví dụ:
(gdb) set variable date = 15
(gdb) continue

------------------------------------------
compile lại file thực thi
(gdb) make

---
name: nguyen minh hoang
Y!M :
net name: mathhoang

1. Giới thiệu

Công cụ gỡ lỗi gdb debugger cho phép hỗ trợ debug chương trình thực thi trên KIT FriendlyArm.
Nguyên lý thực hiện debug là KIT FriendlyArm và máy host cùng chạy file thực thi đồng bộ với nhau qua giao tiếp ethernet (TCP/IP) trong đó  KIT đóng vai trờ là server (chạy chương trình gdb server) và máy host đóng vai trò là client (chạy chương trình gdb client)

2. Cài đặt công cụ debug GDB

Bước 1.
- Download gói gdb tại địa chỉ sau: http://ftp.gnu.org/gnu/gdb/
- Chọn phiên bản 7.x

Bước 2.
- Giải nén file mã nguồn đã tải

tar –jxvf gdb_7.x.tar.bz2
hoặc tar –xzvf gdb_7.x.tar


- Giải nén thành công được thư mục mã nguồn gdb_7.x

Bước 3. Bước này để biên dịch gói gdb (client) dùng cho trên máy host
- Chuyển tới thư mục gdb_7.x đã giải nén thành công ở bước 2
- Gõ lệnh uname --machine để biết dòng máy bạn đang sử dụng, ví dụ là i686
- Gõ lệnh sau để cấu hình

./configure --build=i686 --host =i686 --target=arm-linux


- Biên dịch:

 make


- Cài đặt:

 sudo make install


Bước 4. Bước này biên dịch gdbserver chạy trên KIT
- Chuyển tới thư mục gdb_7.0/gdb/gdbserver

cd gdb/gdbserver


- Export 2 biến môi trường sau

export CC=arm-linux-gcc
export LD=arm-linux-ld


- Gõ lệnh

./configure --build=i686 --host=arm-linux --target=arm-linux


- Biên dịch

    make


Kết quả sinh ra một file chạy gdbserver
Copy file này lên KIT dùng gFTP

Bước 5. Cài đặt công cụ ddd hỗ trợ debug bằng giao diện đồ họa bên phía máy host

sudo apt-get install ddd


3. Cách sử dụng công cụ debug gdb
Bước 1
- Login vào KIT qua telnet
- Chạy chương trình gdbserver với tham số port lắng nghe kết nối và chương trình muốn debug:

./gdbserver :8888 ./demo


Bước 2
- Trên máy host gõ lệnh

    ddd –debugger arm-linux-gdb


- Chương trình debug ddd giao diện đồ họa như sau: 

Sử dụng dbg trong linux

Bước 3
- Vào file/open program chọn chương trình tương ứng muốn debug với chương trình trên KIT

Sử dụng dbg trong linux

Bước 4
- Trong cửa sổ lệnh của công cụ ddd, gõ lệnh sau để kết nối đến KIT

(gdb) target remote 192.168.1.230:8888

Trong đó:
192.168.1.230 là địa chỉ cuả KIT
8888 là cổng mà chương trình gdbserver trên KIT đang lắng nghe ở Bước 1.

Khi đó bên phía KIT sẽ hiện lên như sau:

Sử dụng dbg trong linux

Bước 5. Sử dụng các thao tác của chế độ chạy debug:
- Đặt breakpoint
- Chạy từng step
- Chạy continue

Sử dụng dbg trong linux


- Có thể sử dụng thanh công cụ hoặc gõ lệnh
>>b 5 đặt breakpoint ở dòng thứ 5
>> c có nghĩa là continue
>>s có nghĩa là step