IntelliJ调试Java程序(含自身)时,如何显示正在执行的字节码?
解决IntelliJ调试跨类加载器时无代码显示的问题
我之前调试IntelliJ插件的时候也遇到过一模一样的问题,折腾了好一会儿才搞定,给你分享几个有效的解决办法:
1. 先开启自动反编译开关
这是最基础的设置,确保IntelliJ会自动处理未知类的反编译:
- 打开设置(Windows/Linux点
File→Settings,Mac是IntelliJ IDEA→Settings) - 找到
Build, Execution, Deployment→Debugger→Data Views→Java - 一定要勾选**"Decompile classes automatically",同时建议把下面的"Show bytecode for decompiled classes"**也勾上——这样你之后可以在反编译代码和原始字节码之间切换查看
2. 让调试器识别PluginClassLoader
因为问题出在从UrlClassLoader跳到PluginClassLoader加载的类,调试器默认可能没识别这个类加载器:
- 在调试会话的
Debug窗口里,找到Frames面板里那个没有代码的栈帧 - 右键点击这个栈帧,选择**"Add Class Loader"**
- 在弹出的窗口里选中对应的
PluginClassLoader实例,确认添加后,调试器就会尝试为这个类加载器加载的类解析字节码/反编译内容了
3. 手动指定类文件路径(自动反编译失效时用)
如果上面的方法没起作用,就手动给调试器指认类文件的位置:
- 进入无代码的栈帧后,编辑器顶部会有个**"Choose Sources"**按钮,点它
- 在弹出的窗口里找到
PluginClassLoader对应的插件jar包(一般在IntelliJ的plugins目录,或者你自己插件项目的build/libs目录里) - 选中jar包确认后,IntelliJ就会从里面读取字节码并反编译显示出来
4. 检查调试器的类过滤规则
有时候调试器的过滤规则会把你要调试的类排除在外:
- 打开设置→
Build, Execution, Deployment→Debugger→Stepping - 看看**"Do not step into these classes"**列表里有没有包含你要调试的类的前缀,如果有,先临时移除这个规则再继续调试
另外补充个小技巧:如果你是调试自己开发的插件,最好把插件模块添加到host IntelliJ的项目依赖里,这样调试器能直接关联到源码,不用依赖反编译,体验会好很多。
内容的提问来源于stack exchange,提问作者Martin Geisse
相关产品推荐
相关产品推荐

