jdb:在断点处执行预定义的操作

时间:2018-05-11 06:53:30

标签: java debugging jdb

在使用jdb调试java应用程序时,是否可以使用预定义的操作设置断点。例如,如果我有兴趣知道当流经过某个点时某个变量的值是什么,我可以用

设置一个断点。
Generate Database from Model

执行操作:

> stop at MyClass:10

让程序继续。

> print myVal

基本上我想将上述三个命令合并/自动化为一个。

我知道我可以使用expect实现这一点,但我想要内置到jdb中的东西。 我的用例是能够在本地调试客户问题,我无法连接常规IDE调试器,或者无法选择快速更改代码来添加日志。

1 个答案:

答案 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二进制文件的路径。