在使用jdb调试java应用程序时,是否可以使用预定义的操作设置断点。例如,如果我有兴趣知道当流经过某个点时某个变量的值是什么,我可以用
设置一个断点。Generate Database from Model
执行操作:
> stop at MyClass:10
让程序继续。
> print myVal
基本上我想将上述三个命令合并/自动化为一个。
我知道我可以使用expect实现这一点,但我想要内置到jdb中的东西。 我的用例是能够在本地调试客户问题,我无法连接常规IDE调试器,或者无法选择快速更改代码来添加日志。
答案 0 :(得分:0)
添加我自己的期望解决方案,以防其他人可能正在寻找这样的事情:
#!/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 -- "resume\r"
# add a breakpoint
expect ">"
send -- "stop in com.example.auth.MyClass.doStuff\r"
expect {
-regex "Breakpoint hit.*com.example.auth.MyClass.doStuff$OPENBRACE.*$DBGPROMPT"
{
send "print myVal\r"
exp_continue
}
-regex ".*tomcat-http.*$DBGPROMPT"
{
interact "\033\[19~" return
send "cont\r"
exp_continue
}
}
interact
<强>解释强> 该脚本为类MyClass的方法doStuff添加了一个断点。 expect部分定义了两个动作。我们设置了一个断点:打印myVal的值然后继续。第二个操作是您设置的任何断点的默认行为,您没有指定任何操作(甚至不继续)。当调试器在这样的断点处停止时,控件被给予用户以他想要的方式与其交互。当他完成后,他可以按F8让程序继续。
如果要添加新的断点,请在注释“添加断点”后复制粘贴两行,并将路径更改为类/方法。
您可以以类似的方式为行号添加断点。
我正在使用'tomcat-http'作为我的用例的注册表。如果需要,您可能需要更改它。
P.S。相应地更改jdb二进制文件的路径。