【问题标题】:DebugBreak equivalent in Java?Java中的DebugBreak等价物?
【发布时间】:2011-08-01 11:14:55
【问题描述】:

我正在寻找一种从 Java 代码中进入调试器的方法,而无需在 IDE 中设置断点。

在 Win32 中有 DebugBreak(),在 C# 中有 DebugBreak() Equivalent in C#,但我在 Java 中找不到任何东西。

我正在尝试做的事情:假设我有一个 30 秒超时的等待,但在正常情况下,等待应该始终小于 1 秒。我想使用ByteMan 或类似的东西先等待1s超时,如果等待超时则进入调试器。

【问题讨论】:

    标签: java debugging breakpoints


    【解决方案1】:

    不是直接回答您的问题,但在大多数 IDE 中,您可以设置 conditional breakpoints。

    这需要您在超时前在代码中设置时间戳变量,并在超时后在断点中测试其值。如果增量大于您的阈值,您将触发条件断点。

    【讨论】:

    • 我正在尝试使其“可重用”,这样我就不必一直修改代码。如果时间戳变量是通过字节码操作注入的,我怀疑 IDEA 会让我在断点条件下使用它。好建议,我会试试的。
    【解决方案2】:

    这个问题的发帖人完全符合我的要求:Secure Debugging for Production JVMs

    它再现了DebugBreak 的最佳特性,即只有在“断点”被命中后,您才能将 IDE 附加到您的程序中。

    【讨论】:

      【解决方案3】:

      我创建了这个类

      import com.sun.jna.Library;
      
      public interface Kernel32 extends Library {
      
          public void OutputDebugStringA(String Text);
          public void DebugBreak();    
      }
      

      然后像这样使用它:

      Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
      lib.OutputDebugStringA("just before DebugBreak\n");
      lib.DebugBreak();
      

      就是这样。它调用本机函数 void WINAPI DebugBreak(void); 里面Kernel32.dll

      你还需要jar文件jna-4.4.0.jar

      【讨论】:

        【解决方案4】:

        目前(截至 2021 年)您无法在 Java 中以像 DebugBreak 在 C# 中那样方便的方式完成此操作。

        在 Java 中你能做的最好的事情就是抛出一个自定义运行时异常(例如,class DebugBreakException extends RuntimeException),并祈祷你还记得添加一个“异常断点”,只要抛出这个异常就会中断,即使异常是处理。

        在您的代码抛出此异常后,它会立即捕获并转储一条消息,说明发生了此特定异常。

        如果此消息曾出现在日志中,但您的调试器没有中断,那么您就知道您忘记添加必要的“异常断点”。 (换句话说,你必须祈祷如果这条消息被记录下来,它会被某人注意到。)

        您还可以对此更加聪明,并添加一些代码来检查从抛出异常到捕获异常所经过的毫秒数;如果超过 10 毫秒,那么很可能调试器出现中断,因此可以跳过消息的日志记录。如果在 10 毫秒内捕获到异常,则调试器可能没有中断,因此您可以继续记录消息。

        不用说,除了简单地记录一条消息之外,您还可以尝试采取尽可能多的其他措施,例如发出哔哔声、打开灯、给自己发送电子邮件、敲锣、炸主板、不惜一切代价。

        【讨论】:

          【解决方案5】:

          为了在 IDE 中更简单的情况,也可以使用这个示例,在正文中设置断点,条件差...(对不起 c# 格式)

                  if (lineNumber==6502)
                  {
                      System.out.println("BREAK"); //breakpoint here
                  }
          

          【讨论】:

          • 这实际上是我现在正在做的。当我问这个问题时,我的主要要求是我不必先附加调试器(例如,如果我需要连续运行 10 次测试套件以重现测试失败)。同时 IntelliJ 为远程调试“监听”配置添加了“自动重启”功能,所以我只需启动一次调试配置,配置测试 JVM 连接到监听调试器,并等待它在断点处停止.
          猜你喜欢
          • 2019-11-03
          • 2016-07-16
          • 2011-10-06
          • 2010-09-08
          • 2012-05-09
          • 2023-03-04
          • 1970-01-01
          • 2012-06-03
          • 2013-01-15
          相关资源
          最近更新 更多