golang,空指针上执行方法,整个程序 hang 住了,怎么定位问题出在哪一行代码?

2019-11-26 19:06:07 +08:00
 lsk569937453
类似代码如下:
================================
var srcDbresult *sql.Rows
srcDbresult, err = db.Query(sql);
if err != nil {
err = errors.Wrap(err, "db.Query error")
print(srcDbresult.Next())
panic(err)
}
=================================
整个程序会卡在 print(srcDbresult.Next())这一行代码,
现在就是线上有机器卡住了,我想定位问题代码。求大佬解答,小弟在此谢谢了。
pprof 试过了不行,整个程序 hang 住后,telnet 端口都不通了
2319 次点击
所在节点    问与答
9 条回复
lsk569937453
2019-11-26 19:07:31 +08:00
线上问题比例子代码复杂的多的多,所以从源码入手猜哪一行代码出错,很难。
Maboroshii
2019-11-26 19:56:56 +08:00
盲猜 recover 的地方有问题
Reficul
2019-11-26 20:18:21 +08:00
空指针上执行方法不会 Hang 住,对指针解引用会 Panic 也不会 Hang 住。说卡在 print 的,是看到的还是猜的,建议 dlv 上去看堆栈信息。
lsk569937453
2019-11-26 20:46:32 +08:00
@Reficul 是本地调试的,走到 srcDbresult.Next()这个就走不下去了,panic 没走到都。说 hang 住是因为进程还在,端口也在占用,telnet 端口无返回,无法处理请求也
iamfirst
2019-11-26 20:53:11 +08:00
srcDbresult.Next(), 是指读取记录下一条?如果查询时 err != nil,还强行读不存在的记录,然后报错?
TheCure
2019-11-26 20:58:44 +08:00
...正确的方法是 runtime stack trace, 看到底看看卡在那里
winterssy
2019-11-26 20:58:44 +08:00
弱弱的问一句,调用空指针的方法不会 panic 吗,随后就 recover 了吧,还有 print 什么事?
winterssy
2019-11-26 21:06:47 +08:00
@winterssy #7 错了,要看具体的业务逻辑
blless
2019-11-26 22:40:35 +08:00
……为啥要打印 Next 不是直接 return 或者 panic 就好?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/623375

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX