panic: runtime error: invalid memory address or nil pointer dereference [recovered]
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0xe9 pc=0x1193006]
goroutine 7 [running]:
testing.tRunner.func1.2({0x127da60, 0x1754b90})
D:/tools/.go/current/src/testing/testing.go:1209 +0x24e
testing.tRunner.func1()
D:/tools/.go/current/src/testing/testing.go:1212 +0x218
panic({0x127da60, 0x1754b90})
D:/tools/.go/current/src/runtime/panic.go:1038 +0x215
gitee.com/runner.mei/dm.dm_build_253(0xc0000b6ea0, 0xc0000bb040, {0xc000004090, 0x1, 0x1})
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/zq.go:941 +0x46
gitee.com/runner.mei/dm.(*dm_build_1312).Dm_build_1419(0xc0000b6ea0, 0xc0000bb040, {0xc000048000, 0xc00007e500, 0x1}, 0x0)
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/a.go:453 +0x425
gitee.com/runner.mei/dm.(*DmStatement).executeInner(0xc0000bb040, {0xc0000a4ee0, 0xc00017f180, 0x1}, 0xa6e0)
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/u.go:882 +0x99
gitee.com/runner.mei/dm.(*DmStatement).query(0xc0000bb040, {0xc0000a4ee0, 0xc0000d1a00, 0x0})
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/u.go:418 +0x30
gitee.com/runner.mei/dm.(*DmStatement).queryContext(0xc0000bb040, {0x13ab458, 0xc0000d1a00}, {0xc0000a67b0, 0x0, 0x0})
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/u.go:437 +0x92
gitee.com/runner.mei/dm.(*DmConnection).queryContext(0xc00017f180, {0x13ab458, 0xc0000d1a00}, {0xc000130000, 0x17e}, {0xc0000a67b0, 0x1, 0x1})
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/m.go:639 +0x188
gitee.com/runner.mei/dm.(*DmConnection).QueryContext(0xf34dc0, {0x13ab458, 0xc0000d1a00}, {0xc000130000, 0x0}, {0xc0000a67b0, 0x0, 0x0})
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/m.go:303 +0x3e
database/sql.ctxDriverQuery({0x13ab458, 0xc0000d1a00}, {0x23ae463ddd8, 0xc00017f180}, {0x0, 0x0}, {0xc000130000, 0x0}, {0xc0000a67b0, 0x1, ...})
D:/tools/.go/current/src/database/sql/ctxutil.go:48 +0x17d
database/sql.(*DB).queryDC.func1()
D:/tools/.go/current/src/database/sql/sql.go:1722 +0x175
database/sql.withLock({0x13a5ae8, 0xc00015e510}, 0xc00008f108)
D:/tools/.go/current/src/database/sql/sql.go:3396 +0x8c
database/sql.(*DB).queryDC(0xc00008f201, {0x13ab458, 0xc0000d1a00}, {0x0, 0x0}, 0xc00015e510, 0xc0000a4ed0, {0xc000130000, 0x17e}, {0xc00008f4d0, ...})
D:/tools/.go/current/src/database/sql/sql.go:1717 +0x211
database/sql.(*DB).query(0xc000130000, {0x13ab458, 0xc0000d1a00}, {0xc000130000, 0x17e}, {0xc00008f4d0, 0x1, 0x1}, 0xc0)
D:/tools/.go/current/src/database/sql/sql.go:1700 +0xfd
database/sql.(*DB).QueryContext(0xc0000b5015, {0x13ab458, 0xc0000d1a00}, {0xc000130000, 0x17e}, {0xc00008f4d0, 0x1, 0x1})
D:/tools/.go/current/src/database/sql/sql.go:1674 +0xdf
github.com/runner-mei/kinglink/core.(*pgBackend).fetchOracle(0xc0000021e0, {0x13ab458, 0xc0000d1a00}, {0xc0000b5015, 0x9}, {0x0, 0x0, 0x0})
d:/developing/go/meijing/tpt_vendor/src/www.github.com/runner-mei/kinglink/core/db_backend.go:835 +0x10b5
原因是 下面 dm_build_254.dm_build_1316 为 nil
···
func dm_build_253(dm_build_254 *dm_build_1312, dm_build_255 *DmStatement, dm_build_256 [][]interface{}) *dm_build_244 {
dm_build_257 := new(dm_build_244)
if dm_build_254.dm_build_1316.Execute2 {
dm_build_257.dm_build_153(dm_build_254, Dm_build_18, dm_build_255)
} else {
dm_build_257.dm_build_153(dm_build_254, Dm_build_14, dm_build_255)
}
dm_build_254.dm_build_1316 为 nil, 是因为
···
oroutine 7 [running]:
runtime/debug.Stack()
D:/tools/.go/current/src/runtime/debug/stack.go:24 +0x65
runtime/debug.PrintStack()
D:/tools/.go/current/src/runtime/debug/stack.go:16 +0x19
gitee.com/runner.mei/dm.(*dm_build_1312).Close(0xc0000b6ea0)
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/a.go:542 +0xba
gitee.com/runner.mei/dm.(*DmConnection).close(0xc00017f180)
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/m.go:505 +0x11c
gitee.com/runner.mei/dm.(*DmConnection).cleanup(...)
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/m.go:479
gitee.com/runner.mei/dm.(*DmConnection).watchCancel(0xc0000bb040, {0x13ab458, 0xc0000d1a00})
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/m.go:805 +0xdf
gitee.com/runner.mei/dm.(*DmStatement).queryContext(0xc0000bb040, {0x13ab458, 0xc0000d1a00}, {0xc0000a67b0, 0x0, 0x0})
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/u.go:433 +0x70
gitee.com/runner.mei/dm.(*DmConnection).queryContext(0xc00017f180, {0x13ab458, 0xc0000d1a00}, {0xc000130000, 0x17e}, {0xc0000a67b0, 0x1, 0x1})
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/m.go:639 +0x188
gitee.com/runner.mei/dm.(*DmConnection).QueryContext(0xf34dc0, {0x13ab458, 0xc0000d1a00}, {0xc000130000, 0x0}, {0xc0000a67b0, 0x0, 0x0})
d:/developing/go/meijing/tpt_vendor/src/gitee.com/runner.mei/dm/m.go:303 +0x3e
database/sql.ctxDriverQuery({0x13ab458, 0xc0000d1a00}, {0x23ae463ddd8, 0xc00017f180}, {0x0, 0x0}, {0xc000130000, 0x0}, {0xc0000a67b0, 0x1, ...})
D:/tools/.go/current/src/database/sql/ctxutil.go:48 +0x17d
database/sql.(*DB).queryDC.func1()
D:/tools/.go/current/src/database/sql/sql.go:1722 +0x175
database/sql.withLock({0x13a5ae8, 0xc00015e510}, 0xc00008f108)
D:/tools/.go/current/src/database/sql/sql.go:3396 +0x8c
database/sql.(*DB).queryDC(0xc00008f201, {0x13ab458, 0xc0000d1a00}, {0x0, 0x0}, 0xc00015e510, 0xc0000a4ed0, {0xc000130000, 0x17e}, {0xc00008f4d0, ...})
D:/tools/.go/current/src/database/sql/sql.go:1717 +0x211
database/sql.(*DB).query(0xc000130000, {0x13ab458, 0xc0000d1a00}, {0xc000130000, 0x17e}, {0xc00008f4d0, 0x1, 0x1}, 0xc0)
D:/tools/.go/current/src/database/sql/sql.go:1700 +0xfd
database/sql.(*DB).QueryContext(0xc0000b5015, {0x13ab458, 0xc0000d1a00}, {0xc000130000, 0x17e}, {0xc00008f4d0, 0x1, 0x1})
D:/tools/.go/current/src/database/sql/sql.go:1674 +0xdf
github.com/runner-mei/kinglink/core.(*pgBackend).fetchOracle(0xc0000021e0, {0x13ab458, 0xc0000d1a00}, {0xc0000b5015, 0x9}, {0x0, 0x0, 0x0})
d:/developing/go/meijing/tpt_vendor/src/www.github.com/runner-mei/kinglink/core/db_backend.go:835 +0x10b5
github.com/runner-mei/kinglink/core.(*pgBackend).Fetch(0xc0000a6720, {0x13ab458, 0xc0000d1a00}, {0xc0000b5015, 0xc0001416c0}, {0x0, 0xc00008f9a8, 0x11695d5})
d:/developing/go/meijing/tpt_vendor/src/www.github.com/runner-mei/kinglink/core/db_backend.go:785 +0x67
github.com/runner-mei/kinglink/core.(*Worker).reserveAndRunOneJob(0xc00015e5a0, {0x13ab458, 0xc0000d1a00}, {0x13b6968, 0xc0000d1880}, {0x13a70c0, 0xc0000a4ea0}, 0xc0000b5668)
d:/developing/go/meijing/tpt_vendor/src/www.github.com/runner-mei/kinglink/core/worker.go:248 +0x152
github.com/runner-mei/kinglink/core.(*Worker).workOff(0x13ab500, {0x13ab458, 0xc0000d1a00}, {0x13b6968, 0xc0000d1880}, {0x13a70c0, 0xc0000a4ea0}, 0x124d720, 0x1)
d:/developing/go/meijing/tpt_vendor/src/www.github.com/runner-mei/kinglink/core/worker.go:223 +0xb9
github.com/runner-mei/kinglink/core.(*Worker).WorkOff(0xc0006424e0, {0x13ab500, 0xc0000a6600}, {0x13b6968, 0xc0000d1880}, 0x13b4bc0, 0xc0000021e0)
d:/developing/go/meijing/tpt_vendor/src/www.github.com/runner-mei/kinglink/core/worker.go:208 +0xb9
github.com/runner-mei/kinglink/core.TestRunMaxLenErrorAndRescheduleIt.func2({0x13ab500, 0xc0000a6600}, {0x13b6968, 0xc0000d1880}, 0x12dcdc0, {0x13b4bc0, 0xc0000021e0}, 0xc0000b6de0, 0x30)
d:/developing/go/meijing/tpt_vendor/src/www.github.com/runner-mei/kinglink/core/worker_test.go:316 +0x219
github.com/runner-mei/kinglink/core.workTest.func1({0x13ab500, 0xc0000a65d0}, 0x127d5e0, 0x17d5508, {0x13b4bc0, 0xc0000021e0}, 0x0)
d:/developing/go/meijing/tpt_vendor/src/www.github.com/runner-mei/kinglink/core/worker_test.go:29 +0x279
github.com/runner-mei/kinglink/core.backendTest(0xc0006424e0, 0x12eedc7, 0x0, 0xc00005fef0)
d:/developing/go/meijing/tpt_vendor/src/www.github.com/runner-mei/kinglink/core/db_backend_test.go:56 +0x3d6
github.com/runner-mei/kinglink/core.workTest(0xc0000562d0, 0x12eedc7, 0x4, 0x13a1120, 0x131ffb0)
d:/developing/go/meijing/tpt_vendor/src/www.github.com/runner-mei/kinglink/core/worker_test.go:19 +0x45
github.com/runner-mei/kinglink/core.TestRunMaxLenErrorAndRescheduleIt(0xc0006424e0)
d:/developing/go/meijing/tpt_vendor/src/www.github.com/runner-mei/kinglink/core/worker_test.go:307 +0x78
testing.tRunner(0xc0006424e0, 0x131ffb8)
D:/tools/.go/current/src/testing/testing.go:1259 +0x102
created by testing.(*T).Run
D:/tools/.go/current/src/testing/testing.go:1306 +0x35a
···
发现和这个是一样的
https://eco.dameng.com/community/question/2703019dc6b23004189d0a1830418b25
问题在这里
func (dc *DmConnection) queryContext(ctx context.Context, query string, args []driver.NamedValue) (*DmRows, error) {
if err := dc.watchCancel(ctx); err != nil {
return nil, err
}
defer dc.finish()
err := dc.checkClosed()
if err != nil {
return nil, err
}
if args != nil && len(args) > 0 {
stmt, err := dc.prepare(query)
if err != nil {
stmt.close()
return nil, err
}
dc.lastExecInfo = stmt.execInfo
stmt.innerUsed = true
return stmt.queryContext(ctx, args)
} else {
这里的 queryContext 方法中先调用了watchCancel, 然后再调用了 stmt.queryContext, 然后在 stmt.queryContext, 又再次调用了 watchCancel
对了, 源码是公开的
github.com/runner-mei/kinglink
在 core 目录下运行
go test -v -kl_db_drv=dm -kl_db_url=xxxxxx -run=TestRunMaxLenErrorAndRescheduleIt