在Docker容器中运行了两个二进制文件,一个是开源项目(第一次崩溃),另一个是闭源项目(第二次崩溃)。
它们都以 signal SIGSEGV: segmentation violation
崩溃。
第一次崩溃以这些行开始:
0x2000: fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x0]
goroutine 301131 [running]:
runtime.throw({0xff4e03, 0x2})
/usr/local/go/src/runtime/panic.go:1198 +0x71 fp=0xc010903260 sp=0xc010903230 pc=0x4355b1
runtime.sigpanic()
/usr/local/go/src/runtime/signal_unix.go:719 +0x396 fp=0xc0109032b0 sp=0xc010903260 pc=0x44ba36
runtime: unexpected return pc for runtime.hexdumpWords called from 0x40
stack: frame={sp:0xc0109032b0, fp:0xc010903310} stack=[0xc010902000,0xc010904000)
第二次崩溃以这些行开始:
fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x194b8 pc=0x436da4]
runtime stack:
runtime: unexpected return pc for runtime.acquireSudog called from 0xc00004be30
stack: frame={sp:0xc0003adf28, fp:0xc0003adf98} stack=[0xc0003ac000,0xc0003ae000)
你使用的Go版本是什么( go version
)?
开源项目使用Go版本 1.17.6
运行。
闭源项目使用Go版本 1.14.4
运行。
两者都是 linux/amd64
。
这个问题在最新版本的发布中是否重现?
我无法重现,这是一个我以前从未观察到的事件,我们在95个集群中有大约400个示例,每个示例的RPS超过100万。
你使用的操作系统和处理器架构是什么( go env
)?
go env
输出
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN="/usr/local/bin"
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/go/pkg/mod"
GONOPROXY="github.example.org"
GONOSUMDB="github.example.org"
GOOS="linux"
GOPATH="/go"
GOPRIVATE="github.example.org"
GOPROXY=" [https://proxy.golang.org,direct](https://proxy.golang.org,direct) "
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.17.6"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/workspace/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build3473157175=/tmp/go-build -gno-record-gcc-switches"
你做了什么?
我们在一个docker容器中运行了两个进程。一个进程是开源项目,它是一个具有一些额外功能的HTTP反向代理,如调用另一个HTTP端点进行authnz。第二个进程是闭源项目,它是一个HTTP服务器处理程序,用于验证JWT,这是由第一个进程调用的,以验证令牌。
在运行时,这两个进程都崩溃了。
这是一个单独的事件,我在第二次崩溃日志中找到了 https://github.com/golang/go/wiki/LinuxKernelSignalVectorBug ,但是我无法重现Bug测试 https://github.com/golang/go/wiki/LinuxKernelSignalVectorBug#bug-test. 我使用与内核相同的gcc版本进行测试。
Gcc版本:
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
内核版本:
% uname -a
Linux ip-172-31-22-74 5.4.0-1063-aws #66-Ubuntu SMP Wed Jan 12 17:49:45 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
% cat /proc/version_signature
Ubuntu 5.4.0-1063.66-aws 5.4.157
我们不使用交换空间运行所有节点,例如:
% free
total used free shared buff/cache available
Mem: 15803320 1581248 12482748 3600 1739324 13949664
Swap: 0 0 0
第一次崩溃日志
go_1st_crash.log
第二次崩溃日志
go_2nd_crash.log
你期望看到什么?
没有崩溃
你看到了什么?
崩溃
4条答案
按热度按时间os8fio9y1#
根据题意,由于$x_{1} > x_{2}$,则有$f(x_{1}) < f(x_{2})$,
反之也成立,故函数$f (x)$在R上为减函数。
s8vozzvw2#
这看起来像是内存损坏。你尝试过在race检测器下运行你的程序吗?参见https://blog.golang.org/race-detector。
w1jd8yoj3#
完整的代码路径都会被测试,并且每次更改时运行go test -race。我认为它会出现,或者你认为go run -race应该显示它而不是测试?
1bqhqjot4#
我尝试使用
go run -race
运行它,但是当我仅仅使用curl时没有错误。如果我使用vegeta以500 rps的速度运行,我会得到@aclements 也许你想要检查崩溃日志文件,就像你在#42977中所做的那样,谢谢