gpt4 book ai didi

java - "Object Breakpoint"- 如何在具有复杂动态行为的大型代码库中调试对特定对象的访问?

转载 作者:搜寻专家 更新时间:2023-11-01 03:41:23 30 4
gpt4 key购买 nike

每隔一段时间我就会进入 Eclipse Debug模式,并希望我可以简单地选择我当前正在检查/观察的对象,在其上放置某种“对象断点”,然后进入下一行访问它的代码。

现在,我知道我可以在类上放置断点,但我通常在内存中有数百甚至数千个实例,其中大部分的生命周期很长。他们经常进出框架。它们被包装到 Collections 中,过滤并再次打开。简而言之:一个常规的大型应用程序。

通常我仍然通过寻找该对象的罕见特征、使用条件方法断点和大量有根据的猜测来找到问题。但是,我认为如果我有类似描述的功能,我有时会更快。

经过一番搜索,我发现了 Debug Proxy (scroll down to examples) .它是一个容器类,将使用 Javas 反射 API 使自己看起来像包含的对象,因此您可以在应用程序中使用它代替包含的对象。作为一个 InvocationHandler,DebugProxy 现在可以“拦截”所包含对象中的方法调用。

使用代理进行实际调试就像将此行添加到您的应用程序一样简单。

IMyObject = (IMyObject) DebugProxy.newInstance(new MyObject());

然后我可以在 DebugProxies 源代码中设置断点。

但是,这种方法至少存在两个问题。

  1. 它可以工作,但它仍然是一个 hack,并且缺少很多功能,例如过滤选项。
  2. 代理对象 cannot be down-cast to the implementing class .

2.问题比较严重。我能够将 DebugProxy 与 EMF 生成的类一起使用,并且在整个框架中遵循对象没有问题。但是,当我尝试调试未对所有有趣类使用接口(interface)的代码时,DebugProxy 将很快失败。

有人知道替代方案吗?也许 Eclipse JDT 调试器已经具有这样的功能,而我只是没有看到它!?

我知道有 Java instrumentation API ,以及 AspectJ 等框架。这些能否用于获得切实可行的解决方案?

最佳答案

我向 DebugProxy 添加了基本过滤并修改了输出,以便 Eclipse 控制台 View 显示指向调用代码行的链接: enter image description here

但是,第二个问题仍未解决。我放了 source code on GitHub .也许有人会想出一些办法。

解决这个问题的一种完全不同的方法是自动添加断点,条件是将当前 hashCode() 与相关对象的 HashCode 进行比较。对于更了解 JDT 内部结构的人来说,这可能并不难。

关于java - "Object Breakpoint"- 如何在具有复杂动态行为的大型代码库中调试对特定对象的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13519658/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com