Install GDB on Linux

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

CommandDescripttion
info argsแสดงค่า arguments ทั้งหมด ของฟังก์ชั่นปัจจุบัน
info breakแสดงค่า breakpoints ทั้งหมด
info registersแสดงค่า cpu registers ทั้งหมด
info threadsแสดงค่า threads ทั้งหมด
info setList 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

Your email address will not be published. Required fields are marked *