在使用 jdb 调试 Java 应用程序时,是否可以使用预定义的操作设置断点。例如,如果我有兴趣知道当流通过某个点时某个变量的值是多少,我可以设置一个断点
> stop at MyClass:10
执行操作 :
> print myVal
并让程序继续。
> cont
基本上我想将上述三个命令合并/自动化为一个。
我知道我可以使用期望来实现这一点,但我想要一些内置到 jdb 中的东西。 我的用例是能够在本地调试客户问题,其中我无法附加常规 IDE 调试器,或者没有选项进行快速代码更改以添加日志。
添加我自己的期望解决方案,以防其他人可能正在寻找这样的东西:
#!/usr/bin/expect --
set timeout -1
set DBGPROMPT "\[1\] "
set OPENBRACE "\("
spawn ~/debug/jdk1.8.0_171/bin/jdb -attach 5005
# In case you had terminated on a suspended thread the last time
expect ">"
send -- "resumer"
# add a breakpoint
expect ">"
send -- "stop in com.example.auth.MyClass.doStuffr"
expect {
-regex "Breakpoint hit.*com.example.auth.MyClass.doStuff$OPENBRACE.*$DBGPROMPT"
{
send "print myValr"
exp_continue
}
-regex ".*tomcat-http.*$DBGPROMPT"
{
interact " 33[19~" return
send "contr"
exp_continue
}
}
interact
说明该脚本为类 MyClass 的方法 doStuff 添加了一个断点。期望部分定义了两个操作。一个用于断点,我们设置了:打印 myVal 的值,然后继续。第二个操作是您设置的任何断点的默认行为,您尚未为其指定任何操作(甚至不继续(。当调试器在此类断点处停止时,将向用户提供控件,以按照他想要的方式与其交互。完成后,他可以按 F8 让程序继续。
如果要添加新的断点,请复制粘贴注释"添加断点"后面的两行,并将路径更改为类/方法。
您可以通过类似的方式为行号添加断点。
我正在使用"tomcat-http"作为我的用例的正则表达式。如果需要,您可能需要更改此设置。
附言:相应地更改 jdb 二进制文件的路径。
我不知道在JDB中有任何方法可以做到这一点,但是,这个功能存在于IntelliJ IDEA中。在断点属性中,可以指定表达式,IDE 将计算该表达式并记录结果,还可以选择继续执行而不停止(如果取消选中"挂起"复选框(。
听起来你正在尝试使用调试器来处理它并不真正想要的东西。
如果你有源代码,你描述的概念是可以解决的。您只需放置LOG4j输出即可实现目标。
我从未使用过 JDB 调试器,但我使用过许多不同的调试器。但是,我做了一些研究,据我所知,我认为它不支持此类功能,这也是意料之中的。
我还没有看到一个调试器可以做这样的事情。从本质上讲,您希望拥有"监视功能",但使用类固醇。也就是说,您甚至不想单步执行程序流本身。您希望每当执行特定的 java 操作码行时执行一段代码。
要在机器级调试(不是JVM(上实现这样的事情,你必须使用codecaves/code injection和detouring。所以你会拦截执行。此后,您可以修改/检查要更改的任何注册表。完成后,您将返回到原始执行点。这是您通常出于恶意:)做的事情。
最接近您当前目标的是条件断点,并将其与某些 Java 调试器提供的监视功能一起使用 - jdb 没有。Eclipse 和 Intellij 都支持条件断点和变量监视。
因此,只有在发生特定于您感兴趣的事情时,您才能在代码中断点。