2018ǯ12��27��

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
songofacandy at 17:09��Comments(0)��golang 

���ε����˥����Ȥ���

̾��:
URL:
  ����òµ­²ï¿½: ɾ��: ��    ��
 
 
 
Blog�⸡��
�ǿ�����
Archives
���Υ֥����ˤĤ���
DSAS�Ȥϡ�KLab �����ۤ����Ѥ��Ƥ��륳��ƥ�ĥ����ӥ��Ѥ�Linux�١����Υ���ե�Ǥ�������5����Υǡ������󥿤ˤƹ��ۤ������Ѥ��Ƥ��ޤ������桹��DSAS����Ȥ��䤹�����������ˡ������Ƥ����ϤDZ��ѤǤ��뤳�Ȥ��ܻؤ��ơ��������ɤ˶Ф���Ǥ��ޤ���
���Υ֥����Ǥϡ������ DSAS �ǻȤäƤ��뵻�ѤξҲ�䡢�¸����Ƥߤ���̤���𡢥ȥ�֥�˴������ޤ줿���ηи��̤ʤɡ���������������������򿥤�ޤ��ƾҲ𤷤Ƥ��������Ȼפ��ޤ���
�ǿ�������
<%==comments[n].author%>
<% } %>