go 1.17.2でSIGSEGVが発生する現象を解消
ginとsqlite3のパッケージを同時に利用するとgo 1.17.2でSIGSEGVが発生していました。
どこに原因があったかわかりませんが、以下の手順で解消しています。
以下のようにginとgo-sqlite3を含むパッケージをビルドし、実行すると以下の通りSIGSEGVが発生しました。
import ( "database/sql" "github.com/gin-gonic/gin" _ "github.com/mattn/go-sqlite3" )
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env: export GIN_MODE=release - using code: gin.SetMode(gin.ReleaseMode) fatal error: unexpected signal during runtime execution [signal SIGSEGV: segmentation violation code=0x1 addr=0xb01dfacedebac1e pc=0x7fff20872c9e] runtime stack: runtime: unexpected return pc for runtime.sigpanic called from 0x7fff20872c9e stack: frame={sp:0x7ffeefbff778, fp:0x7ffeefbff7c8} stack=[0x7ffeefb80818,0x7ffeefbff880) 0x00007ffeefbff678: 0x01007ffeefbff698 0x0000000000000004 0x00007ffeefbff688: 0x000000000000001f 0x00007fff20872c9e 0x00007ffeefbff698: 0x0b01dfacedebac1e 0x0000000000000001 0x00007ffeefbff6a8: 0x00000000040358b1 <runtime.throw+0x0000000000000071> 0x00007ffeefbff748 0x00007ffeefbff6b8: 0x0000000004655f74 0x00007ffeefbff700 0x00007ffeefbff6c8: 0x0000000004035b68 <runtime.fatalthrow.func1+0x0000000000000048> 0x0000000004a374e0 0x00007ffeefbff6d8: 0x0000000000000001 0x0000000000000001 0x00007ffeefbff6e8: 0x00007ffeefbff748 0x00000000040358b1 <runtime.throw+0x0000000000000071> 0x00007ffeefbff6f8: 0x0000000004a374e0 0x00007ffeefbff738 0x00007ffeefbff708: 0x0000000004035af0 <runtime.fatalthrow+0x0000000000000050> 0x00007ffeefbff718 0x00007ffeefbff718: 0x0000000004035b20 <runtime.fatalthrow.func1+0x0000000000000000> 0x0000000004a374e0 0x00007ffeefbff728: 0x00000000040358b1 <runtime.throw+0x0000000000000071> 0x00007ffeefbff748 0x00007ffeefbff738: 0x00007ffeefbff768 0x00000000040358b1 <runtime.throw+0x0000000000000071> 0x00007ffeefbff748: 0x00007ffeefbff750 0x00000000040358e0 <runtime.throw.func1+0x0000000000000000> 0x00007ffeefbff758: 0x000000000465d1b0 0x000000000000002a 0x00007ffeefbff768: 0x00007ffeefbff7b8 0x000000000404aeb6 <runtime.sigpanic+0x0000000000000396> 0x00007ffeefbff778: <0x000000000465d1b0 0x0000000000000000 0x00007ffeefbff788: 0x00007ffeefbff7f8 0x00000000040287c6 <runtime.(*mheap).allocSpan+0x0000000000000546> 0x00007ffeefbff798: 0x000000c0000e0000 0x0000000000002000 0x00007ffeefbff7a8: 0x000000c000000008 0x00000000040ab5a0 <syscall.libc_write_trampoline+0x0000000000000000> 0x00007ffeefbff7b8: 0x00007ffeefbff800 !0x00007fff20872c9e 0x00007ffeefbff7c8: >0x00007ffeefbff800 0x00000000049d4000 0x00007ffeefbff7d8: 0x00000000000004f3 0x00000000043fe9c5 <golang.org/x/sys/unix.libc_ioctl_trampoline+0x0000000000000005> 0x00007ffeefbff7e8: 0x000000000406787f <runtime.syscall+0x000000000000001f> 0x000000c00029fcf0 0x00007ffeefbff7f8: 0x00007ffeefbff840 0x000000c00029fcc0 0x00007ffeefbff808: 0x00000000040656f0 <runtime.asmcgocall+0x0000000000000070> 0x0000000000000001 0x00007ffeefbff818: 0x0000000004002000 0x2000000000000020 0x00007ffeefbff828: 0x00007ffeefbff840 0x0000000004a6bde0 0x00007ffeefbff838: 0x0000000000000368 0x000000c0000001a0 0x00007ffeefbff848: 0x0000000004063809 <runtime.systemstack+0x0000000000000049> 0x0000000000000004 0x00007ffeefbff858: 0x00000000046f0f10 0x0000000004a374e0 0x00007ffeefbff868: 0x00007ffeefbff8b0 0x0000000004063705 <runtime.mstart+0x0000000000000005> 0x00007ffeefbff878: 0x00000000040636bd <runtime.rt0_go+0x000000000000013d> runtime.throw({0x465d1b0, 0x0}) /usr/local/Cellar/go/1.17.2/libexec/src/runtime/panic.go:1198 +0x71 runtime: unexpected return pc for runtime.sigpanic called from 0x7fff20872c9e stack: frame={sp:0x7ffeefbff778, fp:0x7ffeefbff7c8} stack=[0x7ffeefb80818,0x7ffeefbff880) 0x00007ffeefbff678: 0x01007ffeefbff698 0x0000000000000004 0x00007ffeefbff688: 0x000000000000001f 0x00007fff20872c9e 0x00007ffeefbff698: 0x0b01dfacedebac1e 0x0000000000000001 0x00007ffeefbff6a8: 0x00000000040358b1 <runtime.throw+0x0000000000000071> 0x00007ffeefbff748 0x00007ffeefbff6b8: 0x0000000004655f74 0x00007ffeefbff700 0x00007ffeefbff6c8: 0x0000000004035b68 <runtime.fatalthrow.func1+0x0000000000000048> 0x0000000004a374e0 0x00007ffeefbff6d8: 0x0000000000000001 0x0000000000000001 0x00007ffeefbff6e8: 0x00007ffeefbff748 0x00000000040358b1 <runtime.throw+0x0000000000000071> 0x00007ffeefbff6f8: 0x0000000004a374e0 0x00007ffeefbff738 0x00007ffeefbff708: 0x0000000004035af0 <runtime.fatalthrow+0x0000000000000050> 0x00007ffeefbff718 0x00007ffeefbff718: 0x0000000004035b20 <runtime.fatalthrow.func1+0x0000000000000000> 0x0000000004a374e0 0x00007ffeefbff728: 0x00000000040358b1 <runtime.throw+0x0000000000000071> 0x00007ffeefbff748 0x00007ffeefbff738: 0x00007ffeefbff768 0x00000000040358b1 <runtime.throw+0x0000000000000071> 0x00007ffeefbff748: 0x00007ffeefbff750 0x00000000040358e0 <runtime.throw.func1+0x0000000000000000> 0x00007ffeefbff758: 0x000000000465d1b0 0x000000000000002a 0x00007ffeefbff768: 0x00007ffeefbff7b8 0x000000000404aeb6 <runtime.sigpanic+0x0000000000000396> 0x00007ffeefbff778: <0x000000000465d1b0 0x0000000000000000 0x00007ffeefbff788: 0x00007ffeefbff7f8 0x00000000040287c6 <runtime.(*mheap).allocSpan+0x0000000000000546> 0x00007ffeefbff798: 0x000000c0000e0000 0x0000000000002000 0x00007ffeefbff7a8: 0x000000c000000008 0x00000000040ab5a0 <syscall.libc_write_trampoline+0x0000000000000000> 0x00007ffeefbff7b8: 0x00007ffeefbff800 !0x00007fff20872c9e 0x00007ffeefbff7c8: >0x00007ffeefbff800 0x00000000049d4000 0x00007ffeefbff7d8: 0x00000000000004f3 0x00000000043fe9c5 <golang.org/x/sys/unix.libc_ioctl_trampoline+0x0000000000000005> 0x00007ffeefbff7e8: 0x000000000406787f <runtime.syscall+0x000000000000001f> 0x000000c00029fcf0 0x00007ffeefbff7f8: 0x00007ffeefbff840 0x000000c00029fcc0 0x00007ffeefbff808: 0x00000000040656f0 <runtime.asmcgocall+0x0000000000000070> 0x0000000000000001 0x00007ffeefbff818: 0x0000000004002000 0x2000000000000020 0x00007ffeefbff828: 0x00007ffeefbff840 0x0000000004a6bde0 0x00007ffeefbff838: 0x0000000000000368 0x000000c0000001a0 0x00007ffeefbff848: 0x0000000004063809 <runtime.systemstack+0x0000000000000049> 0x0000000000000004 0x00007ffeefbff858: 0x00000000046f0f10 0x0000000004a374e0 0x00007ffeefbff868: 0x00007ffeefbff8b0 0x0000000004063705 <runtime.mstart+0x0000000000000005> 0x00007ffeefbff878: 0x00000000040636bd <runtime.rt0_go+0x000000000000013d> runtime.sigpanic() /usr/local/Cellar/go/1.17.2/libexec/src/runtime/signal_unix.go:719 +0x396 goroutine 1 [syscall]: syscall.syscall(0x43fe9c0, 0x1, 0x40487413, 0xc00029fd80) /usr/local/Cellar/go/1.17.2/libexec/src/runtime/sys_darwin.go:22 +0x3b fp=0xc00029fcf0 sp=0xc00029fcd0 pc=0x406233b syscall.syscall(0x40a6366, 0x400f394, 0xc00029fda8, 0x40a6298) <autogenerated>:1 +0x26 fp=0xc00029fd38 sp=0xc00029fcf0 pc=0x4068046 golang.org/x/sys/unix.ioctl(0x464579d, 0x4, 0x1000000000030) /Users/bluemon/go/pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/zsyscall_darwin_amd64.go:746 +0x39 fp=0xc00029fd68 sp=0xc00029fd38 pc=0x43fe659 golang.org/x/sys/unix.IoctlGetTermios(...) /Users/bluemon/go/pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/ioctl.go:63 github.com/mattn/go-isatty.IsTerminal(0x464579d) /Users/bluemon/go/pkg/mod/github.com/mattn/go-isatty@v0.0.12/isatty_bsd.go:10 +0x50 fp=0xc00029fdd8 sp=0xc00029fd68 pc=0x43fea70 github.com/gin-gonic/gin.LoggerWithConfig({0x0, {0x0, 0x0}, {0x0, 0x0, 0x0}}) /Users/bluemon/go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/logger.go:220 +0x174 fp=0xc00029fe58 sp=0xc00029fdd8 pc=0x440ac94 github.com/gin-gonic/gin.Logger(...) /Users/bluemon/go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/logger.go:184 github.com/gin-gonic/gin.Default() /Users/bluemon/go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/gin.go:198 +0x3d fp=0xc00029feb8 sp=0xc00029fe58 pc=0x4406cdd main.main() /Users/bluemon/go/src/shokuhi/main.go:23 +0xaa fp=0xc00029ff80 sp=0xc00029feb8 pc=0x44473ca runtime.main() /usr/local/Cellar/go/1.17.2/libexec/src/runtime/proc.go:255 +0x227 fp=0xc00029ffe0 sp=0xc00029ff80 pc=0x4037f47 runtime.goexit() /usr/local/Cellar/go/1.17.2/libexec/src/runtime/asm_amd64.s:1581 +0x1 fp=0xc00029ffe8 sp=0xc00029ffe0 pc=0x40659e1 goroutine 18 [select]: database/sql.(*DB).connectionOpener(0xc00009e270, {0x4703ed8, 0xc00009c200}) /usr/local/Cellar/go/1.17.2/libexec/src/database/sql/sql.go:1196 +0x93 created by database/sql.OpenDB /usr/local/Cellar/go/1.17.2/libexec/src/database/sql/sql.go:794 +0x188
以下のサイトでgo 1.16にdown gradeして解消したという記事を見つけました。
importするパッケージの前にアンダースコアをつけるとunexpected signal during runtime executionが起こる
go 1.18がすでにリリースされているので、バージョンによる問題であれば、
最新バージョンで解消するかもしれないと考えgo 1.18にupgradeしてみました。
update後にビルドしたところ以下のエラーが発生するようになりました。
# golang.org/x/sys/unix ../../pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/syscall_darwin.1_13.go:25:3: //go:linkname must refer to declared function or variable ../../pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/zsyscall_darwin_amd64.1_13.go:27:3: //go:linkname must refer to declared function or variable ../../pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/zsyscall_darwin_amd64.1_13.go:40:3: //go:linkname must refer to declared function or variable ../../pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/zsyscall_darwin_amd64.go:28:3: //go:linkname must refer to declared function or variable ../../pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/zsyscall_darwin_amd64.go:43:3: //go:linkname must refer to declared function or variable ../../pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/zsyscall_darwin_amd64.go:59:3: //go:linkname must refer to declared function or variable ../../pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/zsyscall_darwin_amd64.go:75:3: //go:linkname must refer to declared function or variable ../../pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/zsyscall_darwin_amd64.go:90:3: //go:linkname must refer to declared function or variable ../../pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/zsyscall_darwin_amd64.go:105:3: //go:linkname must refer to declared function or variable ../../pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/zsyscall_darwin_amd64.go:121:3: //go:linkname must refer to declared function or variable ../../pkg/mod/golang.org/x/sys@v0.0.0-20200116001909-b77594299b42/unix/zsyscall_darwin_amd64.go:121:3: too many errors
このエラーについては以下のサイトに解決策が紹介されていたので、この手順を試しました。
go get -u golang.org/x/sys
私の環境ではこの手順で最初に発生していた「SIGSEGVが発生する現象」は解消しました。