Go �Υ饤�ȥХꥢ�˴ؤ���Х�����������
Go�Υ�󥿥���ΥХ���Ƨ��Dz�褷�ޤ��������ޤǤβ����òµ»ï¿½ï¿½Ë¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½
Ʊ���褦�ʥ�󥿥���ΥХ���Ƨ��ǡ��������Ƹ������ɤ���ʤ����λ��ͤˤ��Ƥ���������
��ʬ�Υץ������򵿤�
����Slack�����ͥ�� Go �ǽñ¤«¤ì¤¿ï¿½ï¿½ï¿½ï¿½ï¿½Ð¡ï¿½ï¿½Î¥ï¿½ï¿½ï¿½Ã¥ï¿½ï¿½å¤¬ï¿½ï¿½ï¿½ï¿½Ë¤Ê¤Ã¤Æ¤ï¿½ï¿½ï¿½Î¤ò¸«¤Ä¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î»ï¿½ï¿½Ë¶ï¿½Í���Ƥ��ä��ȥ졼���Хå��Ǥ���
runtime: pointer 0xc007b8af97 to unused region of span span.base()=0xc004000000 span.limit=0xc004002000 span.state=1 fatal error: found bad pointer in Go heap (incorrect use of unsafe or cgo?) runtime stack: runtime.throw(0xc046ca, 0x3e) /usr/local/Cellar/go/1.11.2/libexec/src/runtime/panic.go:608 +0x72 fp=0xc0001dff00 sp=0xc0001dfed0 pc=0x42bf02 runtime.findObject(0xc007b8af97, 0x0, 0x0, 0xc005eb4780, 0x7f3d1915b7b8, 0x5) /usr/local/Cellar/go/1.11.2/libexec/src/runtime/mbitmap.go:399 +0x3b6 fp=0xc0001dff50 sp=0xc0001dff00 pc=0x413bf6 runtime.wbBufFlush1(0xc000047900)
(Ĺ���С������)
���顼��å������� "incorrect use of unsafe or cgo?" �äƸ����Ƥ�Τǡ��ޤ��Ϥ���򵿤��ޤ���
cgo�ϻȤäƤ��ޤ���Ǥ����� unsafe �ϻȤ�ʤ��褦�˥ӥ�ɤ���Τ����ѤʤΤǡ������ɤ�����å������Ȥ��Ʋ������Ȥ�����õ���ޤ��� �ץ��������ȤΥ����ɤˤϸ�������ޤ���vendoring���Ƥ��륳���ɤˤϤ������󤢤�ޤ��������Υץ������Ǽºݤ����Ѥ���Ƥ�������ʬ�Dz�������ΤϤ���ޤ���Ǥ�����
�ޤ��� race �Ϥ��Ǥ˵��äƤ��ơ� -race ���ץ�����դ��Ǹ��Ĥ����졼������ǥ������������٤������Ȥ��ä��褦�Ǥ���
����ǥ�󥿥���Х��β�ǽ�����⤯�ʤäƤ��ޤ�����
�����ѤߥХ��β�ǽ���ȡ��Ƕ�Υꥰ��å����β�ǽ����Ĵ�٤뤿�ᡢGo 1.11.4 �� Go 1.10.5 �ǻ�Ƥ�餤�ޤ����� 1.11.4 �Ǥ����˺Ƹ����� 1.10.5 �ǤϺƸ����ʤ��ä������Ǥ��� �������Ƹ���Ψ���㤦�����β�ǽ����ĤäƤ�Τǡ��ꥰ��å������ȳ��ꤷ���櫓�ǤϤ���ޤ���
Go�ΥǥХå���ǽ�����Ѥ��Ƹ���������ߤ�
������Ū�ˤϾ��Ʊ���ˤʤ�ޤ�����Go��ɸ��ǻ��äƤ���ǥХå���ǽ��Ĥ��äƸ�������Ǥ��ʤ�����Ժ����򤷤ޤ���
�ޤ�����ʤΤϡ������å��ȥ졼���ȥ����ɤ��ɤߥ���å��夷�����������򤹤뤳�ȤǤ���
����Υ������ϡ��饤�ȥХꥢ�μ�������ǡ���ǽ�Τ���ˡ˰�ö�Хåե���󥰤��Ƥ����ݥ��󥿤������������Í���ʡʥҡ������ؤ��Ƥ���˥ݥ��󥿤��ɤ��������å����Ƥ���ս�ǡ�̵���ʥݥ��󥿤ò¸«¤Ä¤ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½ï¿½Î¤Ç¤ï¿½ï¿½ï¿½
�����ݥ��󥿤��Хåե����椫�鸫�Ĥ��äƤ��뤿��ˡ����Υݥ��󥿤��ɤ��ѿ��˽񤫤�Ƥ����Τ��Ȥ����ɤΥ����ɤˤ�äƽ񤫤줿�Τ����狼��ޤ��󡣤����ǻ�Ƥ��ä��Τ��� GODEBUG �Ķ��ѿ��Τ��� invalidptr=0
�� GODEBUG=gcstoptheworld=1
�Ǥ���
invalidptr=0
��Ȥ��ȡ����Υݥ��󥿤Υ����å����ʤ��ʤ�ޤ�������ǥ���å��夷�ʤ��ʤ�С�������˻��֤������ä��Ȥ��Υ�����饦��ɤˤʤ�ޤ�������å��夹��С����٤Ϥ��ΰ����ݥ��󥿤����äƤ����ѿ������ꤹ��ҥ�Ȥ��������ǽ�����⤤�Ǥ���
gcstoptheworld=1
�ϥ��󥫥���GC���Τ�̵���ˤ����Τǡ��饤�ȥХꥢ���Ȥ��ʤ��ʤ�Τ�Ʊ���������ݥ��󥿤����Ѥ��Ƥ���ս�ζ᤯�ǥ���å��夹�뤳�Ȥ����ԤǤ��ޤ���
��̤Ȥ��ơ��ɤ���Υ��ץ�����ȤäƤ⥯��å��夷�ʤ��ʤ�ޤ����������ޤǤξ���������������ǡ���ö�Х���𤷤Ƥ����ޤ�����
https://github.com/golang/go/issues/29362
��������ǤκƸ��Ǥ���褦�ˤ���
����������ͤޤ괶���ФƤ��ޤ�������������失�ơ���ʬ�Ǽ�ͳ�˻Ȥ���Ƹ��Ķ�����ޤ���
docker-compose ��Ȥä���ȯ�Ķ����ۼ��򶵤��Ƥ�餤�����ݤ�Ƹ��Ǥ���褦�ˤʤ�ޤǻ�Ķ��Ȥκ��ۤ�Ĵ�٤Ƹ��餷�Ƥ����ޤ����������̤�Ʊ���ˤ����Ȥ����ǡ������˿��󥯥�å���򤵤�����褦�ˤʤ�ޤ�����
ȿ�����Ȥ��ơ�����ϼ�ͤޤ�ˤʤ����ˤ��ä��Ȥ�äƤ����٤��Ǥ�����
print & throw �ǥХå�
runtime.wbBufFlush1
�ϥ饤�ȥХꥢ���Хåե�����Υݥ��󥿤��������ؿ��ʤΤǡ��饤�ȥХꥢ���Хåե��˥ݥ��󥿤�ñ¤¹ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ãµï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ runtime/mwbbuf.go
�Ϥ��ä�311�Ԥξ����������ɤʤΤǡ������� (*wbBuf).putFast()
�Ȥ����ؿ������Ĥ���ޤ����������ˡ� fatal error �θ����ˤʤäƤ�������å��� throw ��Ź���Ǥߤޤ���
runtime: bad pinter: 0xc007435e93 fatal error: XXXXXX runtime stack: runtime.throw(0xbeaeb3, 0x6) /home/ubuntu/local/go/src/runtime/panic.go:608 +0x72 runtime.(*wbBuf).putFast(0xc00003b290, 0xc007435e93, 0xc007435e93, 0x7f4b766b6d88) /home/ubuntu/local/go/src/runtime/mwbbuf.go:143 +0x1f8 runtime.bulkBarrierBitmap(0xc0038a6fd8, 0xc0038a6fd8, 0x8, 0x0, 0xc19258) /home/ubuntu/local/go/src/runtime/mbitmap.go:682 +0x12d runtime.newproc1(0xc194f0, 0xc0002c8708, 0x8, 0xc00222e780, 0x7f1edd) /home/ubuntu/local/go/src/runtime/proc.go:3373 +0x441 runtime.newproc.func1() /home/ubuntu/local/go/src/runtime/proc.go:3309 +0x4f runtime.systemstack(0x0) /home/ubuntu/local/go/src/runtime/asm_amd64.s:351 +0x66 runtime.mstart() /home/ubuntu/local/go/src/runtime/proc.go:1229 goroutine 66219 [running]: runtime.systemstack_switch() /home/ubuntu/local/go/src/runtime/asm_amd64.s:311 fp=0xc0002c86b0 sp=0xc0002c86a8 pc=0x45bb70 runtime.newproc(0xc000000008, 0xc194f0) /home/ubuntu/local/go/src/runtime/proc.go:3308 +0x6e fp=0xc0002c86f8 sp=0xc0002c86b0 pc=0x43750e XXX/game/connection.Keep(0x7435e93)
����ǡ��ץ��������Ȥ� connection.Keep
�ؿ����� runtime.newproc
���ƤӽФ��졢�������� bad pointer ���饤�ȥХꥢ���Хåե��˽ñ¤¹ï¿½ï¿½Þ¤ï¿½Æ¤ï¿½ï¿½ë¤³ï¿½È¤ï¿½ï¿½ï¤«ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½
�ޤ����褯�ߤƤߤ�ȡ� bad pointer �β���Ƥ��벼�̥Х��Ȥ��� Keep �ؿ��ΰ����ȴ����˰��פ��Ƥ��ޤ��͡�
throw ��Ź������δ����ʥ����å�����סʥ���å��夷��goroutine�ʳ���������goroutine���������դ��ǽñ¤½Ð¤ï¿½ï¿½ï¿½ï¿½Ë¤ï¿½Ä¾ï¿½ï¿½ï¿½Æ¤ß¤ï¿½È¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ò¤¤»ï¿½ï¿½ï¿½ï¿½ï¤«ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½
runtime: pointer 0xc00659e432 to unused region of span span.base()=0xc004000000 span.limit=0xc004001f80 span.state=1 fatal error: found bad pointer in Go heap (incorrect use of unsafe or cgo?) runtime stack: runtime.throw(0xc0f417, 0x3e) /home/ubuntu/local/go/src/runtime/panic.go:608 +0x72 fp=0x7ff10e99fd98 sp=0x7ff10e99fd68 pc=0x42dec2 runtime.findObject(0xc00659e432, 0x0, 0x0, 0xc004ab0180, 0x7ff10d5f3e70, 0x1) ... goroutine 29115 [runnable]: XXX/game/connection.Keep.func1(0xc00659e432) XXX/game/connection/connection.go:22 fp=0xc0044a97d8 sp=0xc0044a97d0 pc=0x7f1ff0 runtime.goexit() /home/ubuntu/local/go/src/runtime/asm_amd64.s:1333 +0x1 fp=0xc0044a97e0 sp=0xc0044a97d8 pc=0x45dc51 created by XXX/game/connection.Keep XXX/game/connection/connection.go:22 +0x3d
bad pointer �Υ��ɥ쥹�� Keep.func1 �ΰ����������˰��פ��Ƥ��ޤ��� Keep �ؿ��Υ����ɤ򸫤Ƥߤޤ��礦��
func Keep(playerID int32) { go func() { // ����̵̾�ؿ��� Keep.func1 err := updateAliveTime(playerID) if err != nil { logger.Errorf("Failed to keep connection. err=[%v]", err) } }() }
�ʤ�Ȥʤ��������å��˻ĤäƤ����ݥ��� (64bit) ��� 32bit �� int32 ���ѿ��Ǿ�ñ¤¤ï¿½ï¿½ï¿½ bad pointer ����������Ƥ����ʤΤ��狼��ޤ����ȤϤ����� int32 ���ѿ����������ݥ��󥿤Ȥ��ư��äƤ���Τϥ���ѥ��餫��󥿥���Τɤ��餫�ΥХ��ΤϤ��Ǥ���
�����ޤ��ɤ��ͤ᤿�顢������ʬ�˾ܤ����ͤʤ餹���˲��ϤǤ���Ǥ��礦����ö�����ޤǤ�ޤȤ����𤷤Ƥ����ޤ���
�����ɥ꡼�ǥ��󥰡��Х�����
�����ޤǤ�����ԤäƤ��Ƥ�ï����ľ���Ƥ����Ȼפ��ޤ��������ꥹ�ޥ���᤮�Ƥ��ޤäƲ��Ƥγ�ȯ�Ԥ� holiday �����äƤ��ޤäƤ�����������������ڤ����Τǡ� newproc
... putFast
�ޤǤΥ����ɤ��ɤ�Ǥ����ޤ���
newproc1
�������� goroutine ����� G ���֥������Ȥ��Ѱդ����� goroutine �Υ����å����鿷���� goroutine �Υ����å��˺ǽ�δؿ��ΰ����ò¥³¥Ô¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¡ï¿½ï¿½é¥¤ï¿½È¥Ð¥ê¥¢ï¿½ï¿½Í���ʤ� bulkBarrierBitmap
��ƤӽФ��Ƥ��ޤ��� bulkBarrierBitmap
���Ϥ��줿�ӥåȥޥåפ�Ȥäƥ�����Υݥ��󥿤�饤�ȥХꥢ���Хåե��� putFast
���Ƥ����ޤ���
����ʤ顢 Keep.func1
�ΰ����ϡʥ����������ѿ��Ρ� playerID int32
��Ĥ����ʤΤǡ� putFast
���ƤӽФ����Ϥ�������ޤ��� bulkBarrierBitmap
�θƤӽФ������� print ��Ź���ǥӥåȥޥåפ����Ƥ�ɽ�����Ƥߤޤ�������ȡ� Keep.func1
�ϰ�����Ĺ��������ɤʤΤˡ������Υӥåȥޥåפ�Ĺ���� 0 �ˤʤäƤ��ޤ�����
���Υ����å��ѤΥӥåȥޥåפ˴�Ϣ���륳���ɤ��ɤ�Ǥߤ�ȡ��������륹���å�����˥ݥ��󥿤����Ĥ�ʤ����϶��Υӥåȥޥåפ��Ȥ���褦�Ǥ������ʤΤǡ� bulkBarrierBitmap
�ϥ����С���󤷤��̤Υǡ�����¿ʬ�¹ԥХ��ʥ����٤����֤��줿�̤Υӥåȥޥåסˤ򻲾Ȥ��Ƥ��ޤ���int32 ���ѿ������äƤ���ս��ְ㤨�ƽ������Ƥ���褦�Ǥ���
bulkBarrierBitmap
��ƤӽФ����˥ӥåȥޥåפ�Ĺ���� 0 �Ǥʤ����ƥ��Ȥ���������꤬��ä��뤳�Ȥ��ǧ������𤷤ޤ�����
https://github.com/golang/go/issues/29362#issuecomment-449964832
�ѥå��������Ƹ������ɺ���
runtime ��¾�ξ��ǻ������Ȥ򤷤Ƥ������õ������ʬ�ν񤤤� if ʸ��¾�ξ���(> 0
�� != 0
���Υ�������ޤ�)Ʊ��Ǥ��뤳�Ȥ��ǧ������ǡ� Gerrit �˥ѥå����������ޤ���
https://go-review.googlesource.com/c/go/+/155779
�ޤ�����ӥ塼��������ǧ�Ǥ���褦�ˡ�����å���ξ������Ƹ������ɤ��äƤߤޤ����饤�ȥХꥢ�����Í���ˤʤ�褦�ˡ��ҡ��׾�˥ݥ����ѿ��ò¤¿¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¤ï¿½ï¿½ï¿½ï¿½ runtime.GC()
��롼�פǸƤӽФ��ޤ����ޤ��������å���˻ĤäƤ������ߥݥ��󥿤� int32 ���ͤι��ΤǶ��� bad pointer ����ΤǤʤ����տ�Ū�� bad pointer ���ä���ǡ�������������ΰ����Ȥ��ƴؿ���ƤӽФ��ޤ���
�Ĥ�Ƹ����ϡ�Ĺ��0�Υӥåȥޥåפ򥪡��С���󤷤��Ȥ��ˤ��ޤ��ޤ��ξ��ΥӥåȤ�1�ˤʤäƤ��뤳�ȤʤΤǤ��������ξ��� Go �ץ������ǰտ�Ū�˺��Ф����Ȥ��񤷤�����Ψ��夲�뤿��ˤȤꤢ���������򣱤ĤǤϤʤ����Ĥˤ��Ƥߤ��顢���ä���Ƹ��Ǥ��ޤ�����
https://gist.github.com/methane/b61dcfb504d54de5bced1c6e3209a91d
����Ū�ˤϤ��κƸ������ɤ�ꥰ��å���󡦥ƥ��Ȥ���Ȥ�����ʤꡢ newproc1
���Ф����˥åȥƥ��Ȥ��񤱤�д����ʤΤǤ����������դ� Go �Υץ�����फ��ľ�ܸƤӽФ����ΤǤϤʤ� Go ����ѥ��餬�ƤӽФ������ɤ�����������ʬ�ǥƥ��Ȥ��񤷤��ΤǺ����ӥ塼���������̤��ޤ���
@methane