如何在Java代码中用工具设置断点?

问题描述 投票:0回答:1

所以,opcode 202 (1100 1010)为断点事件保留 根据Java规范,我尝试在Java方法中插入一个断点操作码。我试着在ASM库的帮助下,在一个Java方法中插入一个断点操作码。

targetWriter.visitInsn(202);

但是JVM崩溃了,出现了错误信息。no original bytecode found in ... at bci 0. 在Hotspot实现中搜索后,我发现这个错误是在哪里抛出的。

Bytecodes::Code Method::orig_bytecode_at(int bci) const {
  BreakpointInfo* bp = method_holder()->breakpoints();
  for (; bp != NULL; bp = bp->next()) {
    if (bp->match(this, bci)) {
      return bp->orig_bytecode();
    }
  }
  {
    ResourceMark rm;
    fatal(err_msg("no original bytecode found in %s at bci %d", name_and_sig_as_C_string(), bci));
  }
  return Bytecodes::_shouldnotreachhere;
}

所以根据这一点,这个方法需要知道断点(它把所有的断点都存储在一个列表中),但如果它是通过代码工具直接设置的,它就不知道了。

有没有一种变通的方法(不用JVMTI),可以用代码仪表设置断点事件?

java debugging jvm breakpoints jdi
1个回答
3
投票

作为一个 矜持 根据 JVMS §6.2, 断点操作码是专门为JVM内部使用的,它不应该出现在用户生成的类文件中。它不应该出现在用户生成的类文件中。

当你手动注入断点指令时,JVM不知道该如何处理它,也不知道原来的字节码被替换了。

断点的设置是通过JVM TI SetBreakpoint 事件,并通过 断点 事件回调。如果你不想直接使用JVM TI,那么可以选择使用 JDWP. 大多数Java IDE使用JDWP进行调试。

© www.soinside.com 2019 - 2024. All rights reserved.