-
-
[原创]有jar包无源码情况下使用IDEA远程调试jar包程序的方法
-
-
[原创]有jar包无源码情况下使用IDEA远程调试jar包程序的方法
可以接触Java程序的运行环境,可以得到jar包,但是不能得到源码,并且程序很复杂,依赖多,配置杂,不好构建本地调试环境。在这样的场景下,如何进行远程调试?
这是一个普通的java程序,功能是打印"Hello, World!",然后循环计数。
正常启动命令:
参数说明:
执行完上述操作之后,demo.jar被加到依赖库中。
触发了断点
为了展示动态调试能力,这里把i设置为111111并继续运行(在i上右键选择Set Value或者快捷键F2可修改变量的值)。
发现i已经被动态改变
(2024.11.11补充,IDEA 2024.2.4)
在没有符号的情况下,对业务代码函数体内的地方下断点失效。
对系统函数的代码下断点是可以的,但系统函数断点往往断的很频繁,离关键位置有点远,不方便。
在没有符号的情况下,对业务代码的add函数名称处下断点可以断下来,而对业务代码函数体内的地方下断点则断不下来。
1.javac编译时添加-g:none可以去掉调试符号,或者使用加壳混淆工具基本也可以去掉调试符号。
如果只是测试,可以把编译好的demo.class替换掉demo.jar里的对应class,会发现去掉调试符号后大小会变小。
2.没有符号的情况下,不清楚如何直接断在业务代码。有个比较繁琐的方法,感觉可行,但未实践。把想要分析的class拉出来反编译成java代码(无符号的demo.class->demo.java),然后把原jar包的资源当作依赖库,把java代码再重新编译成带符号的class(demo.java->有符号的demo.class),最后把带符号的class扔到jar包里。
java -jar demo.jar
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 -jar demo.jar
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2024-11-12 00:06
被Jtian编辑
,原因: