记一次因类未加载导致DEBUG断点执行不了的“诡异”

记一次DEBUG断点执行不了的“诡异”

  • 前提:

    1. 这是一个二次开发的项目
    2. windows本地执行无误
    3. 打包后在linux下工程结构会不同(主要是lib目录会不同)
    4. 本人亲自部署,远程debug时代码行数对的上
  • 工具:

    idea2019.2

  • 方式:

    远程debug
    记一次因类未加载导致DEBUG断点执行不了的“诡异”

错误描述

记一次因类未加载导致DEBUG断点执行不了的“诡异”
单步调试时,点了一下,不会到for这一行,且断点就像消失了一样。没有抛出任何异常。

思路

  1. 工具问题:怀疑没把断点打到远程服务器上,这个问题遇到过,通过断开连接,重新打断点,重启idea等等方法无果。
  2. 类没加载:但是这个jar包中已经有其他类都已经被加载了!怀疑在getInstance()方法中,有依赖的jar(bsh*.jar)没有被加载进来。(PS:类找不到不应该抛出异常java.lang.ClassNotFoundException吗???)

步骤

按照思路2来走,首先要知道到底在程序启动时加载了哪些类,根据以前解决类冲突时的经验,在启动参数中加入 -verbose:class 观察启动时加载什么类。
记一次因类未加载导致DEBUG断点执行不了的“诡异”
将输出重定向再查找该类:
记一次因类未加载导致DEBUG断点执行不了的“诡异”
发现真的没有加载到这个类,那么再看依赖到的jar包的情况:
记一次因类未加载导致DEBUG断点执行不了的“诡异”
观察到有一个异常类被加载。

那么问题就来了:为什么其他jar包都被加载,以及这个二次开发包中的其他类都能被加载呢?

探索的方式就是更改类的包名,将其放入其他可以被加载的类的包下!
记一次因类未加载导致DEBUG断点执行不了的“诡异”
结果就是它真的被加载到了,又可以愉快的DEBUG了!!

吐槽: 二次开发的坑点吧,一手遮遮掩掩,类加载时估计对包名还有限制,又咩有写入文档,坑人不浅。。