成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 調(diào)試工具 - Delve 快速入門

開發(fā) 開發(fā)工具
gdb 只能做到最基本的變量打印,卻理解不了 golang 的一些特殊類型,比如 channel,map,slice 等,gdb 原生是無法調(diào)適 goroutine 協(xié)程的, 因為這是用戶態(tài)的調(diào)度單位,gdb 只能理解線程,所以只能通過 python 腳本的擴展,把協(xié)程結(jié)構(gòu)按照鏈表輸出.
本文轉(zhuǎn)載自微信公眾號「洋芋編程」,作者蠻荊 。轉(zhuǎn)載本文請聯(lián)系洋芋編程公眾號。

簡介

Delve? 用來調(diào)試 Go? 語言開發(fā)的程序,該工具的目標(biāo)是為 Go 語言提供一個簡單、功能齊全的調(diào)試工具。

為什么不推薦 gdb

  • gdb 對 Go 的調(diào)試支持是通過一個 python 腳本文件 src/runtime/runtime-gdb.py 擴展的,功能有限
  • gdb 只能做到最基本的變量打印,卻理解不了 golang 的一些特殊類型,比如 channel,map,slice 等,gdb 原生是無法調(diào)適 goroutine 協(xié)程的, 因為這是用戶態(tài)的調(diào)度單位,gdb 只能理解線程,所以只能通過 python 腳本的擴展,把協(xié)程結(jié)構(gòu)按照鏈表輸出

安裝

$ go install github.com/go-delve/delve/cmd/dlv@latest

# 安裝完成后查看版本
$ dlv verison

Delve Debugger
Version: 1.20.1
Build: $Id: 96e65b6c615845d42e0e31d903f6475b0e4ece6e

常用命令

  •  dlv attach - 調(diào)試進程
  • dlv core - 調(diào)試 core
  • dlv debug? - 編譯并調(diào)試當(dāng)前目錄的 main 包,也可以通過參數(shù)指定其他包
  • dlv exec - 調(diào)試二進制文件
  • dlv test - 編譯并調(diào)試測試文件

快速開始

我們首先從一個簡單的示例程序開始,改程序打印字符串 hello world, 然后結(jié)束并退出。

源文件

// main.go

package main

func main() {
println("hello world")
}

調(diào)試源文件

$ dlv debug main.go

# Type 'help' for list of commands.
(dlv)

# 輸入 help 查看參數(shù)說明
(dlv) help
The following commands are available:

Running the program:
call ------------------------ Resumes process
...
...
types ---------------------- Print list of types

Type help followed by a command for full documentation.

# 運行程序
(dlv) continue
hello world
Process 3637 has exited with status 0

調(diào)試編譯后二進制文件

# 編譯源文件
$ go build -o main main.go

$ dlv exec ./main

Type 'help' for list of commands.
(dlv)

# 接下來的步驟和調(diào)試源文件的一樣,這里不再贅述

調(diào)試進程

為了讓進程保持在運行狀態(tài),我們在程序中加一行休眠代碼:

package main

import "time"

func main() {
time.Sleep(time.Minute)
println("hello world")
}

調(diào)試前先運行程序:

$ go run main.go

# 查看進程 ID
$ ps -ef | grep "go run main.go"

7602 27666 0 21:30 pts/6 00:00:00 go run main.go

# 調(diào)試進程
$ dlv attach 7602

Type 'help' for list of commands.
(dlv)

...

# 1 分鐘之后,main.go 并未正常退出,因為當(dāng)前正在調(diào)試
# 輸入 continue 繼續(xù)運行

(dlv) continue
Process 7602 has exited with status 0

常用調(diào)試命令

下列命令是啟動 dlv? 調(diào)試后可用的命令 (也就是當(dāng)前命令行變?yōu)?nbsp;(dlv) 之后可用)。

運行程序

命令

描述

call

恢復(fù)進程,調(diào)用函數(shù) (實驗階段)

continue

繼續(xù)運行程序,直到遇到斷點或程序結(jié)束

next

單步調(diào)試

restart

重新運行

step

單步調(diào)試某個函數(shù)

step-instruction

單步調(diào)試某個 CPU 指令

stepout

從當(dāng)前函數(shù)跳出

操作斷點

命令

描述

break

設(shè)置斷點

breakpoints

打印所有斷點

clear

刪除斷點

clearall

刪除所有斷點

condition

設(shè)置條件斷點

on

設(shè)置一個斷點觸發(fā)時執(zhí)行的命令

toggle

打開/關(guān)閉 斷點

查看變量或內(nèi)存

命令

描述

args

打印函數(shù)參數(shù)

display

每次程序停止時打印表達式的值

examinemem

解析給定地址的內(nèi)存

locals

打印本地變量

print

解析一個表達式

regs

打印寄存器信息

set

設(shè)置變量的值

vars

打印包內(nèi)變量

whatis

打印類型信息

線程 / goroutine 的展示與切換

命令

描述

goroutine

打印或切換 goroutine

goroutines

打印所有 goroutine

thread

切換到指定的線程

threads

打印所有線程信息

調(diào)用堆棧

命令

描述

deferred

在 defer 上下文中執(zhí)行命令

frame

設(shè)置當(dāng)前幀,或在不同的幀上執(zhí)行命令

stack

打印堆棧信息

其他命令

命令

描述

config

更改配置參數(shù)

disassemble

反匯編

dump

dump core

exit

結(jié)束調(diào)試,也可以用 ??quit??

綜合示例

最后,我們使用一個的小例子,熟悉下常用的幾個命令。

示例程序代碼如下:

// main.go

package main

var (
x = 1024
)

func main() {
for i := 0; i < 5; i++ {
println(i)
}
}

# 開始調(diào)試
$ dlv debug main.go

Type 'help' for list of commands.
(dlv)

# 增加斷點
(dlv) b main.main
Breakpoint 1 set at 0x45f0c6 for main.main() ./main.go:7

# 查看斷點
(dlv) bp
...
Breakpoint 2 (enabled) at 0x45f0c6 for main.main() ./main.go:7 (0)

# 運行程序
(dlv) continue
> main.main() ./main.go:7 (hits goroutine(1):1 total:1) (PC: 0x45f0c6)
2:
3: var (
4: x = 1024
5: )
6:
=> 7: func main() {
8: for i := 0; i < 5; i++ {
9: println(i)
10: }
11: }
12:
# 可以看到,程序停在了設(shè)置的斷點上

# 打印包變量
(dlv) vars vars main.x
...
main.x = 1024
...

# 單步調(diào)試
(dlv) next
> main.main() ./main.go:8 (PC: 0x45f0d4)
3: var (
4: x = 1024
5: )
6:
7: func main() {
=> 8: x = 0
9: for i := 0; i < 5; i++ {
10: println(i)
11: }
12: }
13:

# 再次單步調(diào)試
(dlv) next
> main.main() ./main.go:9 (PC: 0x45f0df)
4: x = 1024
5: )
6:
7: func main() {
8: x = 0
=> 9: for i := 0; i < 5; i++ {
10: println(i)
11: }
12: }
13:
14: //timeout := time.After(time.Minute)

# 可以看到,程序停在了循環(huán)語句

# 打印包變量
(dlv) vars main.x
main.x = 0

# 再次單步調(diào)試
(dlv) next
> main.main() ./main.go:10 (PC: 0x45f0f4)
5: )
6:
7: func main() {
8: x = 0
9: for i := 0; i < 5; i++ {
=> 10: println(i)
11: }
12: }
13:
14: //timeout := time.After(time.Minute)
15: //


# 打印本地變量
(dlv) locals
i = 0

# 查看堆棧信息
(dlv) stack
0 0x000000000045f0f4 in main.main
at ./main.go:10
1 0x00000000004358b8 in runtime.main
at /usr/local/go/src/runtime/proc.go:250
2 0x000000000045c0c1 in runtime.goexit
at /usr/local/go/src/runtime/asm_amd64.s:1594


# 打印 goroutine 信息
(dlv) goroutine
Thread 27873 at ./main.go:10
Goroutine 1:
...

# 刪除所有斷點
(dlv) clearall
Breakpoint 1 cleared at 0x45f0c6 for main.main() ./main.go:7

# 繼續(xù)執(zhí)行
(dlv) continue
1
2
3
4
Process 27873 has exited with status 0

# 退出調(diào)試
(dlv) exit

與 IDE 集成

Delve 支持以插件的形式集成到主流的 IDE 里面,具體的支持列表請看 這個頁面[1]。

常見問題

單點調(diào)試總是執(zhí)行非預(yù)期的代碼?

一般是被編譯器優(yōu)化了,比如內(nèi)聯(lián)會導(dǎo)致 dlv 單步調(diào)試無法打印某些變量,解決方法是禁止編譯優(yōu)化。

# 禁用內(nèi)聯(lián)和優(yōu)化 (細節(jié)可以閱讀引用文章列表)
go run -gcflags "-N -l" main.go

Reference

  • go-delve/delve[2]
  • 高效獲取堆棧調(diào)用信息
  • 內(nèi)聯(lián)優(yōu)化
  • 逃逸分析
  • golang 調(diào)試分析的高階技巧
  • 如何定位 golang 進程 hang 死的 bug[3]
  • Debugging with GDB[4]
  • 100-gdb-tips[5]
  • 深入 Go 語言 - 11[6]
  • WSL2 安裝 perf[7]

引用鏈接

[1]? 這個頁面: ??https://github.com/go-delve/delve/blob/master/Documentation/EditorIntegration.md??

[2]? go-delve/delve: ??https://github.com/go-delve/delve??

[3]? 如何定位 golang 進程 hang 死的 bug: ??https://xargin.com/how-to-locate-for-block-in-golang/??

[4]? Debugging with GDB: ??https://sourceware.org/gdb/current/onlinedocs/gdb.html/??

[5]? 100-gdb-tips: ??https://github.com/hellogcc/100-gdb-tips??

[6]? 深入 Go 語言 - 11: ??https://colobu.com/2016/07/04/dive-into-go-11/??

[7]? WSL2 安裝 perf: https://gist.github.com/abel0b/b1881e41b9e1c4b16d84e5e083c38a13

責(zé)任編輯:武曉燕 來源: 洋芋編程
相關(guān)推薦

2020-07-10 16:52:43

DelveGo程序開源

2022-05-23 09:22:20

Go語言調(diào)試器Delve

2021-07-26 10:14:38

Go語言工具

2020-06-15 08:39:41

調(diào)試工具

2022-08-28 10:36:53

調(diào)試工具通用

2015-08-14 09:21:09

gdb工具調(diào)試 Go

2011-08-15 17:38:48

iPhone開發(fā)調(diào)試工具

2024-01-24 13:22:40

Python調(diào)試工具技巧

2024-07-09 08:31:26

2016-12-02 20:23:51

AndroidADB

2025-03-31 03:25:00

2012-02-24 09:25:20

JavaScript

2022-08-21 14:05:54

調(diào)試工具CDP

2024-02-23 10:00:27

Linux工具

2010-06-02 15:21:29

Linux 網(wǎng)絡(luò)性能

2019-04-30 15:10:42

Python調(diào)試工具編程語言

2019-07-15 16:00:06

微軟開源TensorWatch

2018-11-27 11:35:32

systemtapMySQL調(diào)試工具

2020-05-21 15:53:59

遠程調(diào)試工具

2010-06-02 15:45:45

Linux 網(wǎng)絡(luò)性能
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲国产成人精品在线 | 黄色毛片在线播放 | 欧美亚洲国产一区二区三区 | av在线播放不卡 | 青青久久av北条麻妃海外网 | 国产综合av | 亚洲综合久久久 | 久久久毛片 | 国产a级毛片 | 2022精品国偷自产免费观看 | 国产精品精品视频一区二区三区 | 亚洲不卡av在线 | 久久视频免费看 | 福利视频日韩 | 亚洲视频在线看 | 久草中文在线观看 | 最新日韩欧美 | 久草精品在线 | 一区二区三区四区在线视频 | 欧美一级在线免费观看 | 91在线影院| 黄色a级一级片 | 精品国产一区久久 | 羞羞视频网站免费观看 | 亚洲精品白浆高清久久久久久 | 国产免费观看一区 | 日韩高清一区二区 | 精品自拍视频在线观看 | 免费久久久 | 国产高清av免费观看 | 男女羞羞网站 | 国产精品视频一区二区三区 | 天天操夜夜爽 | 亚洲综合大片69999 | 国产精品美女在线观看 | 中文字幕乱码一区二区三区 | 亚洲综合在线播放 | 日韩精品极品视频在线观看免费 | 成人性视频在线 | 91热在线 | 亚洲网站免费看 |