JDB: выполнить заранее определенное действие в точке останова - PullRequest
0 голосов
/ 11 мая 2018

При отладке java-приложения с использованием jdb возможно ли установить точку останова с помощью заранее определенного действия.Например, если мне интересно узнать, каково значение определенной переменной, когда поток проходит через определенную точку, я могу установить точку останова с помощью

> stop at MyClass:10

Выполнить действие:

> print myVal

и программа продолжится.

> cont

По сути, я хочу объединить / автоматизировать вышеупомянутые три команды в одну.

Я знаю, что могу добиться этого, используя функцию ожидаемого, но я хочу что-то встроенное в jdb.Мой вариант использования заключается в том, чтобы иметь возможность оперативно отлаживать проблемы клиентов, когда я не могу подключить обычный отладчик IDE или не могу быстро изменить код для добавления журналов.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Я не знаю ни одного способа сделать это в JDB, однако эта функция существует в IntelliJ IDEA.В свойствах точки останова вы можете указать выражение, и среда IDE оценит его, запишет результат и при необходимости продолжит выполнение без остановки (если вы снимите флажок «Приостановить»).

0 голосов
/ 17 мая 2018

Добавление моего собственного ожидаемого решения на тот случай, если кто-то еще будет искать что-то вроде этого:

#!/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

Объяснение Скрипт добавляет точку останова для метода doStuff класса MyClass. Раздел ожидаемых определяет два действия. Один для точки останова, который мы установили: вывести значение myVal и затем продолжить. Второе действие - это поведение по умолчанию для любой точки останова, для которой вы не указали никакого действия (даже не продолжить). Когда отладчик останавливается на такой точке останова, пользователю дается управление, чтобы взаимодействовать с ним так, как он хочет. Когда он закончил, он может нажать F8, чтобы продолжить программу.

Если вы хотите добавить новую точку останова, скопируйте две строки после комментария «добавить точку останова» и измените путь к классу / методу.

Аналогичным образом можно добавить точки останова для номеров строк.

Я использую tomcat-http в качестве reg-ex для своего сценария использования. Возможно, вам придется изменить это при необходимости.

P.S. Измените путь к двоичному файлу jdb соответственно.

0 голосов
/ 11 мая 2018

Похоже, вы пытаетесь использовать отладчик для чего-то, для чего он на самом деле не предназначен.

Концепция, которую вы описываете, может быть решена, если у вас есть исходный код. Вы можете просто поставить выход LOG4j для достижения своей цели.

Я никогда не использовал отладчик JDB, но я использовал много разных отладчиков. Тем не менее, я провел некоторое исследование, из того, что я могу сказать, я думаю, что он не поддерживает такую ​​функциональность, которую также следует ожидать.

Мне еще предстоит увидеть отладчик, который делает что-то подобное. По сути, вы хотите иметь «функцию часов», но на стероидах. Т.е. вы даже не хотите пошагово проходить сам поток программы. Вы хотите, чтобы фрагмент кода выполнялся всякий раз, когда выполняется конкретная строка кода операции Java.

Чтобы добиться чего-то подобного в отладке на уровне машины (не JVM), вы должны использовать кодовые ячейки / внедрение кода и обход. Так что вы бы перехватили казнь. После этого вы можете изменять / проверять любые реестры, которые хотите изменить. После того, как вы закончите, вы вернетесь к исходной точке исполнения. Это то, что вы обычно делаете со злым умыслом:).

Наиболее близкой вещью к вашей текущей цели будет условная точка останова и использование ее вместе с функциональностью наблюдения, которую предлагают некоторые отладчики Java - jdb этого не делает. И Eclipse, и Intellij поддерживают условные контрольные точки и отслеживание переменных.

Таким образом, вы можете использовать точку останова в своем коде, только если произойдет что-то, что соответствует вашим интересам.

...