问题标签 [jpda]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
676 浏览

java - Java中Heisenbugs的可能和不太可能的原因?

我有一个典型的 Heisenbug 示例,它是由我以前从未见过的条件触发的。我的旧应用程序(大约 100K sloc 的旧代码)在特定实例中无法正常工作,仅启用 JPDA 远程调试就足以改变行为,导致应用程序正常工作:除了添加“-Xdebug -Xnoagent -Xrunjdwp:什么都不做: transport=dt_socket,server=y,suspend=n,address=6666" 到虚拟机的命令行隐藏错误(有或没有实际连接)。鉴于我有一个完全可重复的测试用例,我讨厌通过代码更改来扰乱它,以防它再次隐藏起来。当然,这仅在生产中发生。

通常,我会立即假设存在线程问题,但是 a) 行为是 100% 失败 vs 100% 正常工作,并且 b) 在有问题的代码路径中没有明确使用线程。然后我们的团队试图列出导致这种行为的其他原因,所以我认为 Stack Overflow 的团队思维可能会增加一些。

Java中的海森虫:

  • 线程:错误的同步、竞争条件、隐式排序假设。
  • 显式调试/记录代码:代码路径的更改导致/防止问题。不太常见的是,日志级别的更改可能会导致时间更改(再次线程化)和 I/O 资源使用的差异。
  • 本机代码库可以拖入非 java Heisenbug 问题。
  • 期望终结器以可预测的方式运行。
  • 关于弱引用的不正确假设。
  • 假设固定大小的缓存永远不会填满。
  • 期望哈希码的唯一性。
  • 假设 == 适用于字符串(或不适用于在某些情况下可能被实习的字符串)。
  • VM错误(不,这永远不会发生;)。
  • 测试方法错误。尤其是当存在依赖于测试成功的隐藏变量时。(这看起来是我们的实际问题。一个测试成功导致客户运行下一个测试,由于策略问题而失败。失败导致根据策略在调试模式下运行,结果成功。sigh)

还有其他值得探讨的案例吗?

编辑

  • 是的,JPDA 启用代码使用旧语法。我还没有测试过使用现代语法是否也会改变行为。
  • 这台特定的机器使用 1.8.0_45-b14 作为 JRE,以及 HotSpot 64 位服务器 VM(内部版本 25.45-b02)
  • 虽然这个问题的目的是笼统的,但煽动性的问题是真实的和当前的。由于问题出现在已部署的系统中,我在想要让它与 -Xdebug 一起运行作为一种解决方法以使其保持运行和想要追踪底层错误并杀死它之间感到左​​右为难。
  • 有问题的故障程序是多步骤数据处理管道的一部分——细节无关紧要,但最好将其理解为一个独立的应用程序,它从数据库中获取一些信息,然后使用它来修改一些文件。系统中出现问题的部分似乎是来自数据库的信息没有被正确解释——来自损坏的对象 ORM 或缓存​​的任何信息。当它“损坏”时,确定它是否有工作要做的应用程序逻辑(基于数据库的内容)对所有迭代(包括程序的多次调用在内的数千次迭代)做出错误的选择。当它“工作”时(唯一的区别是 vm 是否使用 -Xdebug 运行),应用程序会为所有迭代做出正确的选择。在这个配置中是完全一致的。针对不同数据库运行的相同代码不会失败。有一些证据(在我参与此代码之前)表明过去曾出现过类似的行为,在看似微小的代码更改后神秘地开始工作......请参阅“Heisenbug”
0 投票
8 回答
25467 浏览

debugging - 在 Docker 容器中调试 Tomcat

我有一个在 Vagrant 中运行的 CoreOS。Vagrant 私网 IP 为 192.168.111.1。CoreOS 内部是一个带有 Tomcat 8.0.32 的 docker 容器。几乎一切正常(应用程序部署等)只是调试不行。Tomcat 映射到 8080 端口,JPDA 端口应该是 8000。

事实

Tomcat JPDA 配置有:

它从catalina.sh jpda start命令开始。运行时控制台的输出docker-compose为:

从容器信息中,我假设端口已按应有的方式映射:

我的 docker 映像基于此Dockerfile

问题

尝试运行远程调试配置(下面的屏幕截图)时出现错误Error running Debug: Unable to open debugger port (192.168.111.1:8000): java.net.ConnectException "Connection refused"。我已经尝试了一切,从改变各种配置,但没有运气。我错过了什么吗?

在此处输入图像描述

0 投票
1 回答
249 浏览

debugging - 调用 JDI invokeMethod() 时发生 TimeoutException

我正在开发我的自定义调试器作为 Eclipse 插件。为此,我正在使用 JPDA API。我想检索一些对象引用变量的值。因此,我尝试通过调用 toString() 方法来使用ObjectReference.invokeMethod 。我的代码如下:

但是,它有时不起作用。例如,给定以下代码:

它在第 4 行运行良好,我可以通过调用插入变量的 toString() 方法成功获得结果。但是,在第 5 行时,会报告 TimeOutException。但是,我已经设置了 10s 启动 JVM 时的超时选项,因此我认为这样的时间足够长,可以检索到 toString() 方法调用的结果。跟踪堆栈如下。你对这个问题有任何想法吗?谢谢!

org.eclipse.jdi.TimeoutException:在 org.eclipse.jdi.internal.connect.PacketReceiveManager 的 org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:186) 处等待数据包 586 时发生超时。 getReply(PacketReceiveManager.java:197) at org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191) at org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:226) at org.eclipse .jdi.internal.ObjectReferenceImpl.invokeMethod(ObjectReferenceImpl.java:428) 在 microbat.codeanalysis.runtime.variable.VariableValueExtractor.setMessageValue(VariableValueExtractor.java:518)

0 投票
0 回答
121 浏览

java - dt_socket 中的 dt 代表什么?

Java Platform Debugger Architecturedt_的上下文中,例如,前缀dt_socket代表什么dt_shmem

调试器传输?数据传输?

0 投票
0 回答
70 浏览

eclipse - 为什么 Eclipse 现在让我的 jpda 调试器端口脱机?

我已经使用过一千次 tomcat jpda 调试器,并且我知道我的 tomcat 设置正确。现在,当我将我的 eclipse 调试器附加到远程 tomcat jpda 时,它不会附加并且还会使端口脱机。

我可以使用 netstat -nlp | 确认调试器端口正在侦听 Linux 服务器。grep 8000。只要我尝试从 Eclipse 附加,端口就不再 lisening。有人见过这个吗?

更新:端口在我关闭 Eclipse 后又回来了,所以它必须部分工作,但我在调试透视图中没有看到任何输出,并且没有命中断点,所以还有其他事情。可能与VPN有关。

0 投票
1 回答
621 浏览

java - 如何调试由 JDI 中的自定义类加载器加载的类

使用参数 -Xdebug, -agentlib:jdwp=transport=dt_socket, server=y, suspend=n, address=4404 启动目标程序。

使用 com.sun.jdi 相关类调试目标程序。VirtualMachine 类的 classesByName 方法。自定义类加载器加载的类不可用。

在目标中,我可以通过

在 VirtualMachine 类中,只有方法:

我应该怎么做?

0 投票
1 回答
165 浏览

java - JDI 为多个类应用类过滤器

我正在创建一个MethodEntryRequest,并且我想将此请求仅应用于 ex:-"java.*"和的两个类模式的方法"sun.*"。为此,我编写了以下代码。

上面代码的问题是它禁用了所有方法事件。但是,如果我只应用一种类模式方法,它就可以正常工作。我尝试逃脱"|""\\\\|"但没有奏效。所以我想知道如何为多个类模式应用类过滤器?

0 投票
1 回答
679 浏览

java - What are the alternatives to Java Debug Interface

I was working with JDI api in JPDA. But due to its some limitation I am stuck at some point. What are the alternatives to JDI so that I can write custom debuggers for Java programs ? Preferably Java alternatives.

0 投票
0 回答
153 浏览

java - JPDA MethodEntryEvent 导致应用程序运行非常缓慢

我正在尝试捕获在任何 android 应用程序中进行的所有方法调用。为此,我使用 JDI 为应用程序的每个正在运行的线程注册 MethodEntryRequest。我成功地做到了这一点,但我面临的问题是应用程序变得非常非常慢。所以我想知道我在执行过程中是否做错了什么。我正在添加我的代码,我首先注册 ClassPreparedRequest 以捕获应用程序进程对每个类的加载,并在其中为导致类加载的线程注册 MethodEntryRequest 和线程过滤器。

注册 ClassPreparedRequest 的代码是

0 投票
0 回答
115 浏览

java - 局部变量上的 JDI 观察点

我需要在局部变量上设置观察点,但问题是 JDI 允许ModificationWatchpoint并且AccessWatchpoint只能在类/实例变量上设置。我能想到的唯一方法是在每行执行后监视堆栈帧,并将变量的当前值保存在HashTable. 因此,当执行一行后值发生变化时,我声明变量修改,并且当其他变量的值被修改并且它包含其他变量也包含的值时,我声明变量访问。但是在我查找变量访问的方法中存在一个问题是假设

在上述情况下,我的方法将找不到变量 x 的变量访问。

所以我的问题是 JDI 是否支持任何功能来完成上述任务?