Go 語言工具

Go 語言工具

有一套程序來構建和處理 Go 源代碼。套件中的程序通常由 go 程序調用,而不是直接運行。

運行這些程序的最常見方法是作爲 go 程序的子命令,例如 go fmt。像這樣運行,該命令對 Go 源代碼的完整包進行操作,go 程序使用包級參數調用基礎二進制文件。

這些程序也可以作爲獨立的二進制文件運行,使用 go 工具子命令(如 go 工具 cgo)使用未修改的參數。對於大多數命令,這主要對調試有用。某些命令,如 pprof,只能通過 go tool 子命令訪問。

最後,fmt 和 godoc 命令被安裝爲普通的二進制文件,稱爲 gofmt 和 godoc,因爲它們的引用次數很多。

單擊鏈接以獲取更多文檔、調用方法和用法詳細信息。

bChY3B

這是一份簡略的清單。有關編譯器等的文檔,請參閱 完整命令參考

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

  1. -x 列出 build 過程中用到的所有工具,mkdir/gcc 等等

  2. -n 不實際編譯,僅打印出 build 過程中用到的所有工具

  3. -a 全部重新構建(命令源碼文件與庫源碼文件)

  4. -race 競爭檢測

  5. -gcflags="all=-N -l"

    1. -N 取消優化

    2. -l 取消內聯

    3. -m 逃逸分析,打印逃逸信息

    4. go build -gcflags=-S fmt 僅打印 fmt 包的反彙編信息

    5. go build -gcflags=all=-S fmt' 打印 fmt 以及其依賴包的反彙編信息

  6. go build -buildmode - plugin 編譯成. so 插件,通過包 plugin 進行打開,獲取符號 - c-shared:使用該參數時會生成出來兩個文件,一個. so 文件,一個. h 頭文件 ,使用起來就和使用 c 生成的庫文件和模塊文件一樣使用。

go run

編譯後運行

go get

get 解析並將依賴項添加到當前開發模塊,然後生成並安裝它們。

  1. -u 更新
  2. -d 僅下載

go test

go tool

  1. go tool asm file 將 go 彙編文件編譯爲 object(.o) 文件。

  2. go tool compile file 將 go 文件編譯爲 .o 文件。

  3. go tool compile -N -l -S file 將文件編譯爲彙編代碼

    或者使用:go build -gcflags -S x.go

    gcflags == go compile flags

  4. go tool compile:處理 go 文件,執行詞法分析、語法分析、彙編、編譯,輸出 obj 文件

  5. go tool asm:處理彙編文件(.s 文件),輸出 obj 文件

  6. go tool pack:打包 package 下的所有 obj 文件,輸出. a 文件

  7. go tool link:鏈接不同 package 的. a 文件,輸出可執行文件

  8. go tool objdump:反彙編 obj 文件

  9. go tool nm:輸出 obj 文件、.a 文件或可執行文件中定義的符號

problems

  1. delve and go on grafana codebase error - decoding dwarf section info at offset 0x0: too short 需要重新編譯,攜帶調試信息
  2. 不顯示本地變量內容的問題,可以添加 go build 參數: -i -v -gcflags="all=-N -l"
  3. 加快 cockroachdb 的調試速度,將下面的文件 cockroach-v2.1.0/src/github.com/cockroachdb/cockroach/Makefile 修改爲 GOFLAGS := -i -a -v -gcflags="all=-N -l"
  4. 不要使用 goland 的 attach 到進程調試方式,非常慢

Go 調試工具

dlv 調試

基本命令:

help           打印幫助信息
c              繼續
n              next
s              step
bt             調用棧
goroutine      切換goroutine
goroutines     顯示所有goroutine
b main.go:2    打斷點
cond 1 i==2    條件斷點(在斷點1上使用條件斷點)
set            設置變量值
  1. 掌握 Debugger(以 delve 爲例)的基本設置與常用命令:單步執行,跳入函數,跳出函數,設置斷點,查看變量,查看寄存器,查看調用棧等
  2. attach pid
  3. connect 連接到調試服務器進行調試
  4. dlv core <executable> <core> 打開 core 文件和關聯的可執行程序,檢查進程出現 core 時的狀態
  5. dlv debug [package] 編譯無優化程序,開始調試
  6. dlv exec 調試已經編譯好的程序(需要用參數 - gcflags="all=-N -l" 編譯調試版本)
  7. dlv test [package] 編譯無優化的測試程序,並開始調試
  8. dlv trace [package] regexp 跟蹤程序的執行,設置每個匹配的函數一個跟蹤點,當跟蹤點觸發時打印信息。
  9. 調試命令:
    1. args 參考函數參數
    2. break (b) 打斷點
    3. breakpoints (bp) 打印所有活躍斷點的信息
    4. call
    5. clear 刪除斷點
    6. clearall 刪除多個斷點
    7. condition (cond) breakpoint-id x == 4 設置條件斷點
    8. deferred 在一個 deferred 調用中執行命令
    9. disassemble 反彙編
    10. exit quit q
    11. goroutine (gr) 顯示或者切換當前的 goroutine
    12. goroutines 列出程序的所有 goroutines
    13. list
    14. on breakpoint-name or id <command> 斷點觸發時執行命令
    15. 單步執行(n),跳入函數(s),跳出函數(so),設置斷點(b),查看變量(p x),查看寄存器(regs),bt
  10. 通過合理的日誌協助調試和定位問題
  11. 掌握 pprof、trace 工具,定位內存,併發,性能等複雜問題 - go test ./main -bench . 進行基準測試(時間) - go test ./main -bench . -benchmem 進行基準測試(時間和內存) - go tool pprof - go tool trace - GODEBUG=gctrace=1 跟蹤 gc 情況
  12. 掌握 core dump 文件的生成和解析工具與方法

gdb 調試

Go 可以用 gdb 調試:

  1. dbinit 中新增行:add-auto-load-safe-path /root/go/go/src/runtime/runtime-gdb.py 或者 source /root/go/go/src/runtime/runtime-gdb.py
  2. b github.com/bitkv/bitkv/pkg/server.(*Server).Get
  3. info goroutines
  4. goroutine 3 bt

遠程調試

  1. 啓動 dlv 調試服務器,attach 到 go 應用程序 dlv attach 69658 --headless --listen=:2345 --api-version=2

  2. 使用 goland 可以進行遠程調試

Go 模塊

  1. 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
  1. 使用

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 目錄下。

  1. 總結

參考

https://github.com/golang/go/wiki/Modules

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://iswade.github.io/go/go_tools/