4.2 آموزش کار با Debugging

4.2 آموزش کار با Debugging

برای بحث debugging در زبان گو روش های مختلفی وجود دارد که محبوبترین روش ها به شرح زیر می باشد :

  1. با استفاده پکیج fmt : شما با استفاده از تابع fmt.Println می توانید مقادیر برخی از متغیرها را چاپ کنید و یکی از روش های ساده برای بحث دیباگ هستش.
  2. با استفاده از پکیج log : یکی از کاربردی ترین روش ها بحث لاگ کردن هستش که شما می توانید هر بخش از کدهای خود را لاگ کنید و بصورت زنده در console یا داخل فایل ببینید و از همه مهمتر شما می توانید لاگ های خود را سطح بندی کنید تا بهتر بتوانید دیباگ کنید.
  3. استفاده از پکیج pprof : پکیج pprof به شما کمک می کند تا راحتر مشکلات عملکردی برنامه خود را بیابید و همچنین خروجی profile از عملکرد برنامه با CPU و Memory را آنالیز کنید.
  4. با استفاده از IDE ها: اکثر IDE هایی (Goland, Vscode) که قبلا معرفی کردیم دارای دیباگر داخلی می باشند که شما می توانید در هر بخش از کد خود breakpoint بزارید و خط به خط کد را دیباگ کنید و مشکلات را برطرف کنید.
  5. با استفاده از دیباگر dlv : یکی از محبوبترین دیباگرهایی بصورت متن باز در حال توسعه است delve می باشد که به شما برای دیباگ کردن بصورت تعاملی هنگام اجرا کمک می کند.

حال در ادامه ما با مثال هایی نحوه کار با این شیوه هایی که معرفی کردیم آموزش می دهیم.

4.2.1 نحوه دیباگ با fmt #

شما با استفاده از تابع fmt.Println می توانید مقادیر برخی از متغیرها را چاپ کنید و برای اینکار به مثال ساده زیر توجه کنید :

 1package main
 2
 3import "fmt"
 4
 5func fibonacci(n uint) uint {
 6	if n < 2 {
 7		return n
 8	}
 9
10	var a, b uint
11
12	b = 1
13
14	for n--; n > 0; n-- {
15		a += b
16		a, b = b, a
17		fmt.Println("this is example debugging value a is ", a, " value b is ", b) 
18	}
19
20	return b
21}
22
23func main() {
24	fmt.Println(fibonacci(100))
25}
 1$ go run main.go
 2this is example debugging value a is  1  value b is  1
 3this is example debugging value a is  1  value b is  2
 4this is example debugging value a is  2  value b is  3
 5this is example debugging value a is  3  value b is  5
 6this is example debugging value a is  5  value b is  8
 7...
 8this is example debugging value a is  6174643828739884737  value b is  16008811023750101250
 9this is example debugging value a is  16008811023750101250  value b is  3736710778780434371
103736710778780434371

در کد فوق برای اینکه مقدار a, b را ببینیم از تابع Println استفاده کردیم تا مقدار داخل این دو متغیر را ببینیم.

4.2.2 نحوه دیباگ با استفاده log #

یکی از کاربردی ترین روش ها بحث لاگ کردن هستش که شما می توانید هر بخش از کدهای خود را لاگ کنید و بصورت زنده در console یا داخل فایل ببینید و از همه مهمتر شما می توانید لاگ های خود را سطح بندی کنید تا بهتر بتوانید دیباگ کنید. حال برای اینکه با log دیباگ کنید یک پکیج استاندارد به نام log داریم که می توانید بسته به نیازتان تغییرات دهید و هچنین پکیج هایی نظیر zap, logrus و … هست برای بحث لاگ به شما خیلی کمک می کنند.

 1package main
 2
 3import (
 4	"log"
 5	"os"
 6)
 7
 8func main() {
 9	// Set the log level to Info
10	log.SetFlags(0)
11	log.SetPrefix("[Info] ")
12	log.SetOutput(os.Stdout)
13	log.Println("This is an informational message")
14
15	// Set the log level to Warning
16	log.SetPrefix("[Warn] ")
17	log.SetOutput(os.Stdout)
18	log.Println("This is a warning message")
19
20	// Set the log level to Error
21	log.SetPrefix("[Error] ")
22	log.SetOutput(os.Stderr)
23	log.Println("This is an error message")
24}
1$ go run main.go
2[Info] This is an informational message
3[Warn] This is a warning message
4[Error] This is an error message

در کد فوق ما با استفاده از تابع SetPrefix یک پیشوند برای لاگ ها اضافه کردیم تا بتوانیم لاگ با سطح های مختلف ایجاد کنیم. و با استفاده از log.Println لاگ را چاپ کردیم. در ادامه این فصل به بحث آموزش کار به log میپردازیم.

4.2.3 دیباگ عملکرد با استفاده از pprof #

زبان گو یک ابزار داخلی دارد جهت آنالیز و دیباگ عملکرد به نام pprof که با استفاده از آن می توانید یکسری اطلاعات در خصوص عملکرد برنامه تهیه کنید و براساس آنالیز اطلاعات مشکلات عملکردی را می توانید برطرف کنید.

 1package main
 2
 3import (
 4	"log"
 5	"net/http"
 6	_ "net/http/pprof"
 7)
 8
 9func main() {
10	log.Println(http.ListenAndServe("localhost:6060", nil))
11}
1$ go run main.go

در کد فوق ما از پکیج مسیر net/http/pprof استفاده کردیم تا عملکرد برنامه را در وب سرور زبان گو را آنالیز و دیباگ کنیم. حال اگر به آدرس http://localhost:6060/debug/pprof/ بروید می توانید وضعیت عملکرد وب سرور را در لحظه ببینید و آنالیز کنید.

pprof

4.2.3.1 آنالیز وضعیت CPU #

برای آنالیز وضعیت CPU کافیه کامند زیر را بزنید :

1go tool pprof http://localhost:6060/debug/pprof/profile

4.2.3.2 آنالیز وضعیت heap memory #

برای آنالیز حافظه heap کافیه کامند زیر را بزنید :

1go tool pprof http://localhost:6060/debug/pprof/heap
2
3Fetching profile over HTTP from http://localhost:6060/debug/pprof/heap
4Saved profile in /home/javad/pprof/pprof.main.alloc_objects.alloc_space.inuse_objects.inuse_space.001.pb.gz
5File: main
6Type: inuse_space
7Time: Jan 27, 2023 at 6:46pm (+0330)
8Entering interactive mode (type "help" for commands, "o" for options)
9(pprof) pdf

زمانیکه کامند فوق را بزنید وارد شل pprof خواهید شد که می توانید با زدن help کامندهای کاربردی را جهت آنالیز ببینید. به عنوان مثال pdf را بزنید یک خروجی pdf بصورت گراف از وضعیت حافظه heap ارائه می دهد که می توانید وضعیت را آنالیز کنید (جهت خواندن گراف این آموزش را مطالعه کنید).