我已经设置了一个最小的代码库 repo 来复制错误并尽可能清楚地解释这个错误:https : //github.com/soroushjp/go_wrapper_c_err
我目前正在使用封装C secp256k1 库的 Go 包go-secp256k1进行 ECDSA 签名的项目。
如果我通过导入直接使用 go-secp256k1 中的函数(如 main.go 中所示),它工作正常。所以在 repo 中,运行 main.go 效果很好,并且打印出一个公钥。
所以这是一个奇怪的错误:如果我尝试使用 go-secp256k1 为包编写测试,我会收到一个奇怪的错误。要复制,请运行:
go test github.com/soroushjp/go_wrapper_c_err/cryptoutil -v
我收到的错误:
=== RUN TestNewPublicKey
SIGTRAP: trace trap
PC=0x4031730
signal arrived during cgo execution
goroutine 20 [syscall]:
runtime.cgocall(0x40013d0, 0x436ddd0)
/usr/local/go/src/pkg/runtime/cgocall.c:143 +0xe5 fp=0x436ddb8 sp=0x436dd70
github.com/toxeus/go-secp256k1._Cfunc_secp256k1_start(0x404c14d)
github.com/toxeus/go-secp256k1/_obj/_cgo_defun.c:99 +0x31 fp=0x436ddd0 sp=0x436ddb8
github.com/toxeus/go-secp256k1.Start()
/Users/soroushjp/Desktop/Dropbox/Development/go/src/github.com/toxeus/go-secp256k1/secp256k1.go:9 +0x1a fp=0x436ddd8 sp=0x436ddd0
github.com/soroushjp/go_wrapper_c_err/cryptoutil.NewPublicKey(0xc20800e080, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0)
/Users/soroushjp/go/src/github.com/soroushjp/go_wrapper_c_err/cryptoutil/cryptoutil.go:35 +0xbd fp=0x436de98 sp=0x436ddd8
github.com/soroushjp/go_wrapper_c_err/cryptoutil.TestNewPublicKey(0xc20804c090)
/Users/soroushjp/go/src/github.com/soroushjp/go_wrapper_c_err/cryptoutil/cryptoutil_test.go:10 +0x5f fp=0x436df68 sp=0x436de98
testing.tRunner(0xc20804c090, 0x420e110)
/usr/local/go/src/pkg/testing/testing.go:422 +0x8b fp=0x436df98 sp=0x436df68
runtime.goexit()
/usr/local/go/src/pkg/runtime/proc.c:1445 fp=0x436dfa0 sp=0x436df98
created by testing.RunTests
/usr/local/go/src/pkg/testing/testing.go:504 +0x8db
我的测试代码非常少,几乎与 main.go 中的代码相同:
package cryptoutil
import (
"fmt"
"testing"
)
func TestNewPublicKey(t *testing.T) {
privateKey := NewPrivateKey()
publicKey, err := NewPublicKey(privateKey)
if err != nil {
t.Error(err)
}
fmt.Println(publicKey)
}
知道这里发生了什么吗?“go test”和“go run”之间发生了什么不同,导致 ECDSA 包装器遇到此错误?