国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go 調試工具 - Delve 快速入門

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

簡介

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

為什么不推薦 gdb

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

安裝

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

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

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

常用命令

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

快速開始

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

源文件

// main.go

package main

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

調試源文件

$ dlv debug main.go

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

# 輸入 help 查看參數說明
(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

調試編譯后二進制文件

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

$ dlv exec ./main

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

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

調試進程

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

package main

import "time"

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

調試前先運行程序:

$ 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

# 調試進程
$ dlv attach 7602

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

...

# 1 分鐘之后,main.go 并未正常退出,因為當前正在調試
# 輸入 continue 繼續運行

(dlv) continue
Process 7602 has exited with status 0

常用調試命令

下列命令是啟動 dlv? 調試后可用的命令 (也就是當前命令行變為 (dlv) 之后可用)。

運行程序

命令

描述

call

恢復進程,調用函數 (實驗階段)

continue

繼續運行程序,直到遇到斷點或程序結束

next

單步調試

restart

重新運行

step

單步調試某個函數

step-instruction

單步調試某個 CPU 指令

stepout

從當前函數跳出

操作斷點

命令

描述

break

設置斷點

breakpoints

打印所有斷點

clear

刪除斷點

clearall

刪除所有斷點

condition

設置條件斷點

on

設置一個斷點觸發時執行的命令

toggle

打開/關閉 斷點

查看變量或內存

命令

描述

args

打印函數參數

display

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

examinemem

解析給定地址的內存

locals

打印本地變量

print

解析一個表達式

regs

打印寄存器信息

set

設置變量的值

vars

打印包內變量

whatis

打印類型信息

線程 / goroutine 的展示與切換

命令

描述

goroutine

打印或切換 goroutine

goroutines

打印所有 goroutine

thread

切換到指定的線程

threads

打印所有線程信息

調用堆棧

命令

描述

deferred

在 defer 上下文中執行命令

frame

設置當前幀,或在不同的幀上執行命令

stack

打印堆棧信息

其他命令

命令

描述

config

更改配置參數

disassemble

反匯編

dump

dump core

exit

結束調試,也可以用 ??quit??

綜合示例

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

示例程序代碼如下:

// main.go

package main

var (
x = 1024
)

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

# 開始調試
$ 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:
# 可以看到,程序停在了設置的斷點上

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

# 單步調試
(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:

# 再次單步調試
(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)

# 可以看到,程序停在了循環語句

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

# 再次單步調試
(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

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

# 退出調試
(dlv) exit

與 IDE 集成

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

常見問題

單點調試總是執行非預期的代碼?

一般是被編譯器優化了,比如內聯會導致 dlv 單步調試無法打印某些變量,解決方法是禁止編譯優化。

# 禁用內聯和優化 (細節可以閱讀引用文章列表)
go run -gcflags "-N -l" main.go

Reference

  • go-delve/delve[2]
  • 高效獲取堆棧調用信息
  • 內聯優化
  • 逃逸分析
  • golang 調試分析的高階技巧
  • 如何定位 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

責任編輯:武曉燕 來源: 洋芋編程
相關推薦

2020-07-10 16:52:43

DelveGo程序開源

2022-05-23 09:22:20

Go語言調試器Delve

2021-07-26 10:14:38

Go語言工具

2020-06-15 08:39:41

調試工具

2022-08-28 10:36:53

調試工具通用

2015-08-14 09:21:09

gdb工具調試 Go

2011-08-15 17:38:48

iPhone開發調試工具

2024-01-24 13:22:40

Python調試工具技巧

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

2025-07-03 02:00:00

2022-08-21 14:05:54

調試工具CDP

2024-02-23 10:00:27

Linux工具

2019-04-30 15:10:42

Python調試工具編程語言

2010-06-02 15:37:38

Linux 網絡性能

2018-11-27 11:35:32

systemtapMySQL調試工具

2010-06-02 15:45:45

Linux 網絡性能

2019-07-15 16:00:06

微軟開源TensorWatch
點贊
收藏

51CTO技術棧公眾號

日韩精品一区二区三区蜜臀| 亚洲欧洲中文| 日韩视频免费直播| 国产精品视频久久久| 黄色手机在线视频| 欧美三级精品| 日本亚洲精品| 亚洲毛片一区| 日韩亚洲欧美综合| 手机福利小视频在线播放| 99久久精品费精品国产| 欧美视频在线观看免费网址| 国产在线精品播放| 男同在线观看| 亚洲一区国产一区| 亚洲精品一区二区三区婷婷月 | 在线观看免费版| 国产精品呻吟| 亚洲色图13p| www.97| 国产精品久久久久久久久久10秀| 欧美专区日韩视频| 撸视在线观看免费视频| 天天操天天色综合| 日韩中文一区二区三区| 日本调教视频在线观看| 欧美福利一区| 在线日韩欧美视频| jizzjizz中文| 蜜桃视频一区| 欧美日韩国产91| 日韩在线无毛| 精品一区二区三区不卡| 亚洲国产精品电影| 白嫩少妇丰满一区二区| 色喇叭免费久久综合| 欧美日韩中字一区| 99re99热| 蜜桃精品wwwmitaows| 3d成人h动漫网站入口| 女人被男人躁得好爽免费视频 | 亚洲欧洲国产日韩| 91精品国产99久久久久久红楼| 欧美1—12sexvideos| 久久久久青草大香线综合精品| 国产精品高潮呻吟视频| 日本免费视频在线观看| 欧美一级黄色大片| 吉吉日韩欧美| 午夜一区二区三区视频| 亚洲精品欧美精品| 伊人成综合网伊人222| 欧美片网站yy| 男女视频在线看| 亚洲女同同性videoxma| 亚洲精品中文字幕在线 | 美女亚洲精品| 国产成人高清精品免费5388| 在线精品视频小说1| 国产二区视频在线| 亚洲福利精品| 国产97在线播放| h片在线观看| 亚洲18色成人| 国产精品186在线观看在线播放| 亚洲男人的天堂在线观看| 亚洲视频小说| 91网站在线播放| 欧美一区二区三区电影在线观看| 欧美大片网址| 亚洲视频在线观看| 欧美一区 二区| 欧洲一区二区在线观看| 91一区二区在线| 一区二区三区观看| 久久久精品欧美丰满| 黄色av免费在线观看| 国产欧美日韩综合| 欧美xxxx吸乳| 夜夜夜久久久| 日本毛片在线免费观看| 久久国产精品第一页| 黄色手机在线视频| 欧美精品一区二区久久久| 国产一二在线观看| 91久色porny| 欧美日本韩国一区二区| 精品国产区一区二区三区在线观看 | 精品国产亚洲在线| 欧洲激情视频| 91成人精品网站| 国产一区二区| 亚洲高清福利视频| 久久在线视频| 国产精品成av人在线视午夜片| 麻豆精品国产91久久久久久| 春色成人在线视频| 91九色精品| 国产肥臀一区二区福利视频| 日韩一区二区三| 日韩中字在线| 黄色三级视频片| 99久久国产免费看| 国产精品刘玥久久一区| 欧美日韩精品系列| 美女国产在线| 91精品国产一区二区三区蜜臀| 国内三级在线观看| 久久久女女女女999久久| 国产精品调教| av一区二区三区免费观看| 欧美视频在线观看一区二区| 国产一二三区在线观看| 精品成人免费观看| 一区二区三区网站| 国产欧美欧洲| 强制捆绑调教一区二区| 欧妇女乱妇女乱视频| 成人午夜激情影院| 日韩中文字幕组| 国产精品美女久久久久久久久久久| 亚洲xxxx2d动漫1| 亚洲人成在线播放| 美女视频黄久久| 国产日产欧美视频| 亚洲人成欧美中文字幕| 麻豆久久久久久久| 日本一本在线免费福利| 一区二区在线视频| 久久天堂久久| 国产精品高清网站| 日韩美女久久久| 精品午夜电影| 99国内精品久久久久久久软件| 欧美日韩91| 中文字幕制服丝袜在线| 欧美狂野另类xxxxoooo| 亚洲国产黄色| www.好吊操| 亚洲风情亚aⅴ在线发布| 久久一区国产| 亚洲精品久久久久久久蜜桃臀| 亚洲精品在线免费观看视频| 久久精品人人| 亚洲人成在线网站| 欧美日韩国产成人| 国产精品国产精品国产专区不片| 一级在线免费观看| 亚洲国产成人在线播放| 日韩极品在线观看| www午夜视频| 51ⅴ精品国产91久久久久久| 激情综合电影网| 午夜视频成人| 中文字幕在线亚洲精品| 综合久久国产九一剧情麻豆| 少妇一区二区三区| 亚洲国产婷婷香蕉久久久久久99 | 在线看片黄色| 亚洲国产另类 国产精品国产免费| 伊人亚洲精品| 成人激情av| 日韩手机在线导航| 国产剧情在线观看一区二区| 91久久影院| 国产精品乱子乱xxxx| 成+人+亚洲+综合天堂| 在线观看污网站| 久久久久久久久久久久久久久久av | 羞羞免费视频| 日韩一区二区三区高清免费看看| 日韩不卡一二三区| 色999久久久精品人人澡69| 97在线电影| 精品精品欲导航| 日韩电影二区| 青草青在线视频| 成熟老妇女视频| 91精品视频观看| 国产丝袜在线精品| 在线观看中文| 国产精品入口福利| 日韩视频永久免费| 91首页免费视频| 91精品国产自产拍在线观看蜜| 中文字幕日本最新乱码视频| 欧美中文在线字幕| 日韩欧美国产麻豆| 国产精品理伦片| 国产精品外国| 欧美大胆视频| 老色鬼在线视频| 久久国产手机看片| www.午夜精品| 欧美午夜精品久久久久久孕妇| 波多野结衣中文字幕一区 | 午夜一区不卡| 蜜桃精品一区二区三区| 丁香在线视频| 免费看国产黄色片|