预发环境命令行debug代码

或许大家习惯了远程debug,但是如果哪一天你发现线下没有问题,但是线上就有问题了呢?有莫有想过线上debug一把? 淡定一下之后发现线上debug是不行的,最多预发环境上debug一把。好吧,开启预发环境debug之旅。

登陆预发环境

至于如何登陆预发环境应该不用我说的吧。

找到你的java启动脚本

不用的业务线java启动脚本位置可能不一样,以商学院为例,我们的启动脚本是这位大神

/home/admin/train/bin/base_env.sh

命令打开脚本

sudo vim base_env.sh

将带有debug参数的变量加入到启动参数中

比如,我们包含debug参数的变量是

JAVA_DEBUG_OPT=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=7009,server=y,suspend=n "

将该变量加入到启动参数列表中,

JAVA_OPTS="$JAVA_DEBUG_OPT  $JAVA_MEM_OPTS $DATABASE_OPTS $JAVA_OPTS_EXT $TIGER_JMX_OPT $URI_ENCODING"

至此,你已经完成了将debug命令加入到java启动参数中。

连接debug端口

$sudo -u admin /usr/alibaba/java/bin/jdb -attach 7009
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
>

出现这个,表明参数加入成功。否则debug参数加入失败。

设置断点

> stop at com.alibaba.tpolps.train.web.module.screen.Index:79
Set breakpoint com.alibaba.tpolps.train.web.module.screen.Index:79

访问页面进入断点

访问你设置断点的页面,保证能执行到打断点的代码行

> stop at com.alibaba.tpolps.train.web.module.screen.Index:79
Set breakpoint com.alibaba.tpolps.train.web.module.screen.Index:79
>
Breakpoint hit: "thread=qtp1025702422-123", com.alibaba.tpolps.train.web.module.screen.Index.execute(), line=79 bci=0

出现断点命中提示

显示变量值

现在你迫切的想要看一下变量是不是你预期的变量把,那就打印出变量值吧

> dump context
 context = {
    pullContext: instance of com.alibaba.citrus.service.pull.impl.PullServiceImpl$PullContextImpl(id=11056)
    com.alibaba.citrus.turbine.support.MappedContext.map: instance of java.util.HashMap(id=11057)
    com.alibaba.citrus.turbine.support.AbstractContext.parentContext: null
}

常用命令

next 是执行下一行 
dump 变量  可以打印堆栈信息
print 变量也可以
cont 相当于F8
locals 所有的变量
resume 继续执行

PS:过程中碰到的问题 1、debug参数加入到java启动参数中失败 仔细检查一下有没有将debug参数加入到启动启动参数中

2、不能触发打断点的行 预发环境要绑定的ip是这个110.75.98.154,不能直接绑定预发机器的ip,限网的缘故。还是不能访问到你的断点,那就在你的预发机器hosts文件中加上这样一行绑定

127.0.0.1 你的域名

最后,感谢慧灵跟蓝天的指导,膜拜两位大神!!!