程式開發過程中總會遇到bug,所以bug的定位與分析就非常關鍵。
golang裡面定義了很多error,但有些時候只有error是很難定位到問題,所以還是需要堆棧資訊。
我們通常會先定義一個錯誤列印的函數,這樣可以對錯誤進行統一的處理和分析:
func ErrorPbResponse(errCode string, errMsg string) pb.Response { LogMessage("errcode[" + errCode + "] Errmsg:" + errMsg) if errCode == RESP_CODE_SYSTEM_ERROR { PrintStack() //堆棧函數 } //TODO}
那堆棧函數如下:
func PrintStack() { var buf [4096]byte n := runtime.Stack(buf[:], false) fmt.Printf("==> %s\n", string(buf[:n]))}
具體效果如下:
errcode[5000] Errmsg:GetDataByCompositeKey 解密資料錯誤簽名已失效==> goroutine 374 [running]:main.PrintStack() /chaincode/input/src/github.com/hyperledger/fabric/lychee/chaincode/go/cc_bscf/tool.go:54 +0x5bmain.ErrorPbResponse(0xb043e0, 0x4, 0xc420019c80, 0x37, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0) /chaincode/input/src/github.com/hyperledger/fabric/lychee/chaincode/go/cc_bscf/tool.go:47 +0x2b4main.agentCountQuery(0x1075c20, 0xc42007f680, 0xc42000c230, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, ...) /chaincode/input/src/github.com/hyperledger/fabric/lychee/chaincode/go/cc_bscf/invoke_common.go:1263 +0x512main.(*SmartContract).Invoke(0x10c8d00, 0x1075c20, 0xc42007f680, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0) /chaincode/input/src/github.com/hyperledger/fabric/lychee/chaincode/go/cc_bscf/invoke_main.go:122 +0x193github.com/hyperledger/fabric/core/chaincode/shim.(*Handler).handleTransaction.func1(0xc4201e7dc0, 0xc4203910e0) /opt/gopath/src/github.com/hyperledger/fabric/core/chaincode/shim/handler.go:329 +0x4f3created by github.com/hyperledger/fabric/core/chaincode/shim.(*Handler).handleTransaction /opt/gopath/src/github.com/hyperledger/fabric/core/chaincode/shim/handler.go:295 +0x49
問題就能快速定位了!