GDB หรือ GNU Debugger เป็น Software ที่ช่วยในการ Debug โปรแกรมแล้วทำการวิเคราะห์ปัญหาที่เกิดขึ้นตอน Execute นอกจากนี้ยังช่วยตรวจสอบพฤติกรรมที่ไม่ปกติของโปรแกรม, แก้ปัญหา Logical Error และหาสาเหตุของโปรแกรม Crash สามารถติดตั้งได้ทั้ง Windows และ Linux
Pros
- สามารถ Stop / Pause การทำงานของ Program Execution ด้วยเงื่อนไขพิเศษ เพื่อทำการวิเคราะห์
- สามารถวิเคราะห์ State ของโปรแกรม ตรวจสอบค่า Variable และ Register
- สามารถเปลี่ยนค่า Variable และ Register และดูผลลัพธ์ของโปรแกรม โดยไม่จำเป็นต้องไปแก้ไข Source Code
Install
- ทำการ Update และ Upgrade
# apt-get update && apt-get upgrade -y
- ทำการติดตั้ง Package
# apt-get install gdb -y
- ตรวจสอบเวอร์ชั่น GDB
# gdb --version
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-92.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
- สร้างไฟล์ buggy.c เป็นโปรแกรมฝากเงิน 100 บาท อัตราดอกเบี้ย 10% จะต้องฝากกี่ปีถึงจะมากกว่าเป้าหมายที่ตั้งไว้คือ 1,000 บาท
# vi buggy.c
/* File: buggy.c */
#include
int main()
{
int balance=100;
int target=1000;
float rate = 0.1;
int year = 0;
do
{
float interest = balance * rate;
balance = balance + interest;
year++;
} while ( balance >= target );
printf("%d No. of years to achieve target balance.\n", year);
return 0;
}
- ทำการ Compile และ Build โปรแกรม
# gcc -g buggy.c
- ทำการรันโปรแกรมด้วย GDB
# gdb a.out
- ทำการหยุด Breakpoint ที่ฟังก์ชั่น main
(gdb) b main
Breakpoint 1 at 0x4004cc: file buggy.c, line 5.
- ทำการรันโปรแกรม ทีละ step
(gdb) run
Starting program: /home/lablocal/a.out
Breakpoint 1, main () at buggy.c:5
5 int balance=100;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.212.0.1.el6.x86_64
- ทำทีละ step ไปเรื่อย ๆ จนกระทั่งบรรทัดที่ 13
(gdb) s
6 int target=1000;
(gdb) s
7 float rate = 0.1;
(gdb) s
8 int year = 0;
(gdb) s
11 float interest = balance * rate;
(gdb) s
12 balance = balance + interest;
(gdb) s
13 year++;
- แสดงค่าของ balance, rate และ interest ซึ่งทำงานวนลูปได้ 1 รอบ
(gdb) p balance
$1 = 110
(gdb) p rate
$2 = 0.100000001
(gdb) p interest
$3 = 10
- ทำ step ถัดไป จนกระทั่งบรรทัดที่ 15
(gdb) s
14 } while ( balance >= target );
(gdb) s
15 printf("%d No. of years to achieve target balance.\n", year);
- แสดงค่าของ target, yearและ balance ซึ่งทำงานวนลูปได้ 1 รอบ
(gdb) p target
$5 = 1000
(gdb) p year
$6 = 1
(gdb) p balance
$7 = 110
Command
Command | Descripttion |
info args | แสดงค่า arguments ทั้งหมด ของฟังก์ชั่นปัจจุบัน |
info break | แสดงค่า breakpoints ทั้งหมด |
info registers | แสดงค่า cpu registers ทั้งหมด |
info threads | แสดงค่า threads ทั้งหมด |
info set | List set-able options |
run | รันโปรแกรมจนถึง breakpoint หรือสิ้นสุดการทำงานของโปรแกรม |
continue | รันคำสั่งต่อไปจนถึง breakpoint หรือสิ้นสุดการทำงานของโปรแกรม |
step | รันคำสั่งบรรทัดถัดไปของโปรแกรม |
break | ทำการหยุด breakpoint ตามฟังก์ชั่นหรือบรรทัดที่ระบุ |
finish | ทำงานของฟังก์ชั่นปัจจุบันต่อไปจนเสร็จ |
print var | แสดงค่า variable ตามที่ระบุ |
set var=val | เปลี่ยนค่า variable ตามที่ระบุ |
backtrace | แสดงค่า stack trace ทั้งหมด |
quite | ออกจาก GDB |
อ่านเพิ่มเติม : https://bit.ly/2CDVRyj
Leave a Reply