Java 如何监测静态变量值的变化?

2022-04-06 14:52:51 +08:00
 rock123

维护一个老系统,有个 Config 类,其中有个静态变量 DEBUG ,默认值为 0 ,定义如下:

public static int DEBUG;

目前正式环境这个值在某些情况下会被修改成 1 ,搜了下系统中代码调用,没发现可疑的重新赋值代码,想请教下大家,如何在不修改现有代码,不增加 setter 方法的情况下监控这个变量值,当值变化时触发一个回调,打印代码执行路径?

3777 次点击
所在节点    Java
33 条回复
sky857412
2022-04-06 18:30:03 +08:00
fxxkgw
2022-04-06 18:35:26 +08:00
修改的地方估计被打成包了 所以单纯查关键词找不到 试试 grep 搜索下
likeunix
2022-04-06 19:50:17 +08:00
还是 C#香
v2lf
2022-04-06 22:28:22 +08:00
@cpstar 发射可以修改 final
"final fields can be changed via reflection and other implementation-dependent means."
但是要注意常量表达式赋值
“If a final field is initialized to a constant expression (§15.28) in the field declaration, changes to the final field may not be observed, since uses of that final field are replaced at compile time with the value of the constant expression.”

而且更改的话,会有线程安全问题
v2lf
2022-04-06 22:28:52 +08:00
@v2lf 可以看下 System 类
lower
2022-04-06 23:40:03 +08:00
@sky857412 这个好像不行,好像上还是在 setter 里面做记录……
debuggeeker
2022-04-07 10:21:25 +08:00
我排查诡异调用的一种方法,如果代码层面搜索不出来,那就打好包反编译找。先打个 release 的包,然后通过 jadx 或者其他反编译工具反编译一次,代码没混淆就好,反编译之后搜索这个类和熟悉的调用。如:const.debug 看看哪里使用了,又或者包名+类名全局搜索,看看哪里使用了这个类然后看属性的调用。
Unicorns96
2022-04-07 10:49:45 +08:00
将这个变量修饰为 final ,报异常查看堆栈就可以了
rock123
2022-04-07 11:44:46 +08:00
@ikas #7

@gitdoit #9

感谢大佬提示,JDI 的 ModificationWatchpointEvent 有用,非常符合我的需求
rock123
2022-04-07 11:57:32 +08:00
@nothingistrue #17
@cpstar #18
@zmal #19
@Unicorns96 #28

ide 的查看代码调用功能试过了,只有程序启动时赋值,其他都是读取值,bug 不知道哪里触发什么时候触发,bug 发生后,日志里变量值是不对的,当时又看了内存中的变量值,是正常的,估计是哪里有动态执行代码

线上环境,不想随便修改旧代码,导致一些其他 bug ,所以加 final 不合适

arthas 只能监控方法返回值,或者手动获取静态变量值,我这边需要监控静态变量值,有变化时程序主动发出通知。或许是我不会用,请指教
aguesuka
2022-04-07 13:04:00 +08:00
BiChengfei
2022-04-11 15:58:36 +08:00
github 就可以当 markdown
链接失效了,重新发发看看怎么用的,我没看懂文档
rock123
2022-04-11 18:45:03 +08:00
@BiChengfei #32
主题不能追加了。 github 地址在这: https://github.com/XMrgao/jdi-demo.git

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/845239

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX