瞎扯淡 请教一个问题,在远程服务器上如何调试?

wcp1231 · 2014年08月27日 · 最后由 cloudman 回复于 2020年05月18日 · 4884 次阅读

我在公司做的是 Java,这两天遇到一个非常奇怪的 BUG,一条简单的 SELECT 查询在我本地跑一点问题没有,但是到了测试服务器跑到查询语句就会卡着,一卡就卡 40 分钟而且没有数据库超时。查询语句简单到不能再简化:

SELECT * FROM A WHERE A.B = 1100

而且和 DBA 确认过数据库没有任何情况,所以可以确定是代码问题。

像 Java 这种需要编译的语言,我每次都要 Push 然后 Build 之后才能通过 Web 端跑,每次耗时都要快十分钟,而且测试服务器的权限很严格我都没法登陆。。真是蛋疼死了。。。

所以我很好奇,如何进行远程服务器的调试?不管是 Java 还是 Ruby。

==== 更新 ==== 前后弄了两天还是没有头绪,最后一个同事把那条数据的字段逐个删掉,发现只要把某个字段去掉就没问题。。。 因为赶着上线所以就在 SELECT 的时候不取这个字段就避过这个问题了,但是还是不知道为什么。。真是蛋疼。。。

看日志。

#1 楼 @billy 我当时在每一行代码之后都打了输出,才发现到 query 那行就卡了。。能单步调试就方便了。。。

Ruby 可以设断点单步调试,但在远程你也用不了啊。Rails 最新出来 web console,不过我还是习惯看日志。不懂 Java,用 Ruby 做网络里面暂时还没有遇到过调试不出来的情况。

#3 楼 @billy 对啊,所以远程服务器的问题好蛋疼。。又不能单步调试,Jdbc 的库里的代码我又不能加上输出。。。

很多年没调试了,都靠打 log

只有打 Log 一招其实。。我也一直想找到良好的方案,没有。。。

#5 楼 @huacnlee #6 楼 @iBachue 说多了都是泪。。。

是不是在 select 好几亿的数据

用 sql 的工具执行呢?如果真是这么慢,大部分是数据库服务的问题。

我也打 log

#8 楼 @dddd1919 那个 SELECT 的结果只有一条数据,本地和测试环境连接的是同一个测试数据库。这是最奇怪的地方。。。 #9 楼 @jimrokliu 不是数据库的问题,我和 DBA 确认过了,没有这么长时间的查询。

#10 楼 @sevk 这么看来 log 是最通用的方法啊。。。。

打开数据库管理界面,看看每条语句的查询耗时

Java 可以远程调式,首先你的 server 得以 debug 模式启动,然后你本地用 Eclipse 远程连接到 server debug 端口,然后在你本机上的代码打断点,就可以远程调试。

#13 楼 @sevk 正常耗时,都没有超过 1s 的 #14 楼 @boyishwei 还没尝试过远程调试,有机会得试试,学习学习。。现在我这是自动化部署的,改个配置文件还得找人。。。真实蛋疼。。。

建议你不要在服务器上调试,很危险的。为什么不把数据弄到本地呢?开发模式下随意折腾

建议不要在服务器调试...看描述最好和 dba 那边确认一下,看看你这个查询请求或者查询连接的确存在并且发起了请求。

还是服务器放一个 staging 的,然后直接在服务器上调试那一份吧。。

#16 楼 @colorfulberry 用的是同一个数据库,数据都一样。。代码执行的结果不一样。。。所以怀疑是环境的问题。。。 #17 楼 @advancedxy 都不建议在服务器调试啊。。。因为我不知道测试服务器的 IP 或域名,所以 DBA 不能确认到底请求了没。。。 #18 楼 @sanivbyfish staging 是啥。。?

非逼不得已不要在生产服务器上调试,太危险了。在 staging 环境上做还是比较靠谱的,目前公司是这么做的。

#20 楼 @tsl0922 staging 是啥啊?我那个情况是在 测试服务器。。还没到生产服务器。。。

#21 楼 @wcp1231 部署 production 前最后测试的地方,尽可能 mirror production 的一切

Ruby 的话如果只是读的操作,你可以跑一个 production 的 console,然后在里面敲你怀疑的代码

MYSQL 的话,可以尝试调整 SELECT 的优先级到最高,看看效果 如果有事务的话,可能是事务卡住了

#23 楼 @Yujing_Z Java 说多了都是泪啊。。 #24 楼 @hooooopo 这东西不错啊,我想的是能像用 IDE 调试本地程序一样调试远程服务器就好了 #25 楼 @jasl 查了两天没有找到线索。因为要上线,所以有个同事一个一个排除那条数据的字段,最后发现去掉某个字段就没问题了,莫名其妙的。。。

#26 楼 @wcp1231 恩...生产环境有不少问题到最后都是靠经验或者蒙来搞定的 - -

java 可通过 jpda 配合 ide 进行远程调试... jpda&&(eclipse || IntelljIdea)

其实你可以通过可以用免费的服务器运维面板(云帮手)实现的呢,可以实时查看到 CPU、内存、数据库、中间件、防火墙、磁盘、IO 等等的,可以去试试

需要 登录 后方可回复, 如果你还没有账号请 注册新账号