猿问

调试卡住的 go 程序

现在,这适用于测试数据库,但在有数百万行的生产数据库中,它在获取 1,000 行后卡住并停止在屏幕上打印。我让它运行了一夜。


早上,我发送了QUIT信号并得到以下堆栈跟踪


SIGQUIT: quit

PC=0x5fecb m=0


goroutine 0 [idle]:

runtime.mach_semaphore_wait(0xe03, 0x0, 0x0, 0x0, 0x0, 0x407520, 0x52db9, 0xffffffffffffffff, 0x0, 0x7fff5fbff0fc, ...)

    /usr/local/Cellar/go/1.5/libexec/src/runtime/sys_darwin_amd64.s:407 +0xb

runtime.semasleep1(0xffffffffffffffff, 0x0)

    /usr/local/Cellar/go/1.5/libexec/src/runtime/os1_darwin.go:385 +0xe5

runtime.semasleep.func1()

    /usr/local/Cellar/go/1.5/libexec/src/runtime/os1_darwin.go:401 +0x29

runtime.systemstack(0x7fff5fbff100)

    /usr/local/Cellar/go/1.5/libexec/src/runtime/asm_amd64.s:278 +0xab

runtime.semasleep(0xffffffffffffffff, 0x0)

    /usr/local/Cellar/go/1.5/libexec/src/runtime/os1_darwin.go:402 +0x36

runtime.notesleep(0x407970)

    /usr/local/Cellar/go/1.5/libexec/src/runtime/lock_sema.go:169 +0x100

runtime.stopm()

    /usr/local/Cellar/go/1.5/libexec/src/runtime/proc1.go:1128 +0x112

runtime.findrunnable(0xc82001d500, 0x0)

    /usr/local/Cellar/go/1.5/libexec/src/runtime/proc1.go:1530 +0x69e

runtime.schedule()

    /usr/local/Cellar/go/1.5/libexec/src/runtime/proc1.go:1639 +0x267

runtime.park_m(0xc820000180)

    /usr/local/Cellar/go/1.5/libexec/src/runtime/proc1.go:1698 +0x18b

runtime.mcall(0x7fff5fbff280)

    /usr/local/Cellar/go/1.5/libexec/src/runtime/asm_amd64.s:204 +0x5b

问题:

  1. 为什么它在获取 1,000(appox) 行后立即卡住?

  2. 注释掉如何defer rows.Close()立即停止卡住和恐慌?

  3. 有没有更好的方法来编写这个程序?

最后,如果以上这些是愚蠢的问题或问题太长,我很抱歉。我是 Go 的新手,正在努力学习。


素胚勾勒不出你
浏览 289回答 1
1回答

一只萌萌小番薯

这是驱动程序的问题。通过删除延迟调用并检查数组边界来修复它。
随时随地看视频慕课网APP

相关分类

Go
我要回答