Go 語言工具
Go 語言工具
有一套程序來構建和處理 Go 源代碼。套件中的程序通常由 go 程序調用,而不是直接運行。
運行這些程序的最常見方法是作爲 go 程序的子命令,例如 go fmt。像這樣運行,該命令對 Go 源代碼的完整包進行操作,go 程序使用包級參數調用基礎二進制文件。
這些程序也可以作爲獨立的二進制文件運行,使用 go 工具子命令(如 go 工具 cgo)使用未修改的參數。對於大多數命令,這主要對調試有用。某些命令,如 pprof,只能通過 go tool 子命令訪問。
最後,fmt 和 godoc 命令被安裝爲普通的二進制文件,稱爲 gofmt 和 godoc,因爲它們的引用次數很多。
單擊鏈接以獲取更多文檔、調用方法和用法詳細信息。
這是一份簡略的清單。有關編譯器等的文檔,請參閱 完整命令參考。
go
bug start a bug report
build compile packages and dependencies
clean remove object files and cached files
doc show documentation for package or symbol
env print Go environment information
fix update packages to use new APIs
fmt gofmt (reformat) package sources
generate generate Go files by processing source
get add dependencies to current module and install them
install compile and install packages and dependencies
list list packages or modules
mod module maintenance
run compile and run Go program
test test packages
tool run specified go tool
version print Go version
vet report likely mistakes in packages
go build
-
-x 列出 build 過程中用到的所有工具,mkdir/gcc 等等
-
-n 不實際編譯,僅打印出 build 過程中用到的所有工具
-
-a 全部重新構建(命令源碼文件與庫源碼文件)
-
-race 競爭檢測
-
-gcflags="all=-N -l"
-
-N
取消優化 -
-l
取消內聯 -
-m
逃逸分析,打印逃逸信息 -
go build -gcflags=-S fmt
僅打印 fmt 包的反彙編信息 -
go build -gcflags=all=-S fmt' 打印 fmt 以及其依賴包的反彙編信息
-
-
go build -buildmode - plugin 編譯成. so 插件,通過包 plugin 進行打開,獲取符號 - c-shared:使用該參數時會生成出來兩個文件,一個. so 文件,一個. h 頭文件 ,使用起來就和使用 c 生成的庫文件和模塊文件一樣使用。
go run
編譯後運行
go get
get 解析並將依賴項添加到當前開發模塊,然後生成並安裝它們。
- -u 更新
- -d 僅下載
go test
go tool
-
go tool asm file 將 go 彙編文件編譯爲 object(.o) 文件。
-
go tool compile file 將 go 文件編譯爲 .o 文件。
-
go tool compile -N -l -S file 將文件編譯爲彙編代碼
或者使用:go build -gcflags -S x.go
gcflags == go compile flags
-
go tool compile:處理 go 文件,執行詞法分析、語法分析、彙編、編譯,輸出 obj 文件
-
go tool asm:處理彙編文件(.s 文件),輸出 obj 文件
-
go tool pack:打包 package 下的所有 obj 文件,輸出. a 文件
-
go tool link:鏈接不同 package 的. a 文件,輸出可執行文件
-
go tool objdump:反彙編 obj 文件
-
go tool nm:輸出 obj 文件、.a 文件或可執行文件中定義的符號
problems
- delve and go on grafana codebase error - decoding dwarf section info at offset 0x0: too short 需要重新編譯,攜帶調試信息
- 不顯示本地變量內容的問題,可以添加 go build 參數: -i -v -gcflags="all=-N -l"
- 加快 cockroachdb 的調試速度,將下面的文件 cockroach-v2.1.0/src/github.com/cockroachdb/cockroach/Makefile 修改爲 GOFLAGS := -i -a -v -gcflags="all=-N -l"
- 不要使用 goland 的 attach 到進程調試方式,非常慢
Go 調試工具
dlv 調試
- dlv debug ./main.go -- arg1 arg2 自動編譯,然後開始調試
- dlv exec ./main_debug -- arg1 arg2 啓動調試,程序需要按 - gcflags="all=-N -l" 方式編譯
基本命令:
help 打印幫助信息
c 繼續
n next
s step
bt 調用棧
goroutine 切換goroutine
goroutines 顯示所有goroutine
b main.go:2 打斷點
cond 1 i==2 條件斷點(在斷點1上使用條件斷點)
set 設置變量值
- 掌握 Debugger(以 delve 爲例)的基本設置與常用命令:單步執行,跳入函數,跳出函數,設置斷點,查看變量,查看寄存器,查看調用棧等
- attach pid
- connect 連接到調試服務器進行調試
dlv core <executable> <core>
打開 core 文件和關聯的可執行程序,檢查進程出現 core 時的狀態- dlv debug [package] 編譯無優化程序,開始調試
- dlv exec 調試已經編譯好的程序(需要用參數 - gcflags="all=-N -l" 編譯調試版本)
- dlv test [package] 編譯無優化的測試程序,並開始調試
- dlv trace [package] regexp 跟蹤程序的執行,設置每個匹配的函數一個跟蹤點,當跟蹤點觸發時打印信息。
- 調試命令:
- args 參考函數參數
- break (b) 打斷點
- breakpoints (bp) 打印所有活躍斷點的信息
- call
- clear 刪除斷點
- clearall 刪除多個斷點
condition (cond) breakpoint-id x == 4
設置條件斷點- deferred 在一個 deferred 調用中執行命令
- disassemble 反彙編
- exit quit q
- goroutine (gr) 顯示或者切換當前的 goroutine
- goroutines 列出程序的所有 goroutines
- list
on breakpoint-name or id <command>
斷點觸發時執行命令- 單步執行(n),跳入函數(s),跳出函數(so),設置斷點(b),查看變量(p x),查看寄存器(regs),bt
- 通過合理的日誌協助調試和定位問題
- 掌握 pprof、trace 工具,定位內存,併發,性能等複雜問題 - go test ./main -bench . 進行基準測試(時間) - go test ./main -bench . -benchmem 進行基準測試(時間和內存) - go tool pprof - go tool trace - GODEBUG=gctrace=1 跟蹤 gc 情況
- 掌握 core dump 文件的生成和解析工具與方法
gdb 調試
Go 可以用 gdb 調試:
- dbinit 中新增行:add-auto-load-safe-path /root/go/go/src/runtime/runtime-gdb.py 或者 source /root/go/go/src/runtime/runtime-gdb.py
- b github.com/bitkv/bitkv/pkg/server.(*Server).Get
- info goroutines
- goroutine 3 bt
遠程調試
-
啓動 dlv 調試服務器,attach 到 go 應用程序 dlv attach 69658 --headless --listen=:2345 --api-version=2
-
使用 goland 可以進行遠程調試
Go 模塊
- Go 模塊介紹
模塊是相關 Go 包的集合,作爲一個版本化的單元。模塊記錄依賴關係,並創建可重現的構建過程。
Usage:
go mod <command> [arguments]
The commands are:
download download modules to local cache
edit edit go.mod from tools or scripts
graph print module requirement graph
init initialize new module in current directory
tidy add missing and remove unused modules
vendor make vendored copy of dependencies
verify verify dependencies have expected content
why explain why packages or modules are needed
- 使用
2.1 基本使用
# 前提:已經存在一個 github 下的項目 bitkv
# 將項目下載到任意位置(注意不要放到 $GOPATH 目錄下)
git clone github.com/bitkv/bitkv bitkv
cd bitkv
# 初始化
go mod init github.com/bitkv/bitkv
# 自動生成 go.mod go.sum 兩個文件
go mod tidy
# 如果不確定爲什麼會依賴某個模塊,可以打開 go.mod 中查看,然後執行 why 命令分析
go mod why github.com/pkg/errors
2.2 GO111MODULE
爲了跟老版本兼容,環境變量 GO111MODULE 默認爲 auto,意思是如果在 $GOPATH
所在的目錄下,則不使用 Go 模塊。
如果已經把項目放到$GOPATH
所在的任何子目錄下,需要設置
export GO111MODULE=on
在非 $GOPATH
所在的子目錄下,則不需要設置。
2.3 GOPROXY
由於國內訪問部分網站的問題,在 go mod tidy 的過程中,可能會遇到訪問 golang.org
等地址超時的問題,可以通過設置代理解決。Go 模塊當前已經默認支持代理設置。
export GOPROXY=https://goproxy.cn
2.4 緩存
下載的模塊會保存對應版本到 $GOPATH/pkg/mod
目錄下。
- 總結
參考
https://github.com/golang/go/wiki/Modules
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://iswade.github.io/go/go_tools/