IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    java服务器调试指南

    JoeKerouac发表于 2022-07-27 01:49:25
    love 0
    java服务器调试指南 在实际开发中,总会遇到程序启动不起来或者运行结果不符合期望的情况,如果是在本地,直接debug就行了,几乎人人都会,但是如果到了远程,大多数情况下我们可以看日志,通过日志排查定位到问题,但是如果你的日志不多,或者日志中看不出问题,此时情况就比较难以处理了,而实际上我们仍然可以通过debug的形式来解决,只不过由原来的本地在ide中通过GUI来debug变为通过命令行来debug; 开启服务debug端口 如果想要对我们远程部署的服务进行debug,那么首先我们要开启debug端口,开启方式如下: 开始debug 当我们的服务启动后,我们就可以开始debug了,此时有两种情况: 我们本地可以直接连接到服务所在的机器; 我们本地无法直接连接到服务所在的机器;(可能时服务在容器中、堡垒机后等); 如果我们本地可以直接连接到服务所在的机器,那么可以在ide中直接选择远程debug,填写好IP和端口号即可连接上进行远程debug,与本地debug的体验基本是一致的,没什么好讲的,我们这里主要说说本地无法连接到服务所在的机器时如何进行debug; 当我们无法连接到远程服务所在的机器时,此时可以使用jdk中为我们提供的jdb来调试,熟悉C语言的可能会想到gdb,这个和C语言的gdb是一个作用,都是用来让我们调试程序的;下面我们来介绍jdb的详细用法: jdb详细用法 在远程服务的主机上使用jdb命令连接到服务,命令如下(如果jdb所在的机器与服务所在机器不一致,需要将127.0.0.1替换为服务所在机器的IP,但是注意需要保证jdb所在的机器可以通过这个ip+端口直连到服务): 如果有源码,可以使用-sourcepath指定源码,用法与Java指定classpath一致 使用上述命令进入调试控制台后(命令行),我们就可以使用下面这些命令(常用命令)来调试我们的应用了: 可以在调试控制台使用help查看jdb支持的完整命令列表及其说明; 简单示例 1、编写一个Test.java用来测试 2、编译 使用如下命令编译我们的程序: 3、运行我们的程序 使用如下命令运行我们的程序: 运行后提示如下: 4、debug连接 再开一个shell窗口,在这个窗口执行如下命令进行连接: 运行结果如下: 5、开始debug 设置一个断点 使用如下命令设置一个断点: 结果如下: 开始执行 使用cont指令开始执行,结果如下: 查看源码 使用list查看当前源码,结果如下: 可以清晰的看到当前执行到了我们定义的断点处停止了; 使用step进入方法调用 使用step命令进入add这个方法调用的内部,执行结果如下: 当我们使用list查看当前断点上下的源码时,结果如下: 可以看到,当前已经进入方法了(还未执行任何行); 使用locals查看本地变量 此时我们可以使用locals来查看本地变量,因为还未执行任何一行,所以本地变量中只有三个方法参数,结果如下: 使用step up来结束方法执行 使用step up前我们的调用栈处于这个状态: 使用step up后会直接结束add方法的执行,跳回到方法调用处,结果如下: 此时使用list来查看,我们回到了主方法中,add方法执行完毕,但是还未赋值给d 使用next来执行当前行 此时我们执行next,然后执行list,会发现我们已经来到了第8行,而此时如果使用step的话,我们仍会进入add方法中,而此时我们不想再看add方法的调用了,可以使用next来直接跳过add方法,来到下一行,结果如下 可以看到,当我们再第8行执行next的时候,并没有进入add方法内部,而是直接将其执行完毕来到了第9行; 此时再使用locals命令查看变量,此时会打印处args这个main方法的入参和a、b、c、d、e这5个本地变量,结果如下 使用set命令修改e的值 此时我们可以使用set命令来修改e的值,运行结果如下: 可以发现此时e已经是12了 打印当前线程栈 […]


沪ICP备19023445号-2号
友情链接