JDB: выполнить заранее определенное действие в точке останова
При отладке Java-приложения с использованием jdb возможно ли установить точку останова с помощью заранее определенного действия. Например, если мне интересно узнать, каково значение определенной переменной, когда поток проходит через определенную точку, я могу установить точку останова с помощью
> stop at MyClass:10
Выполните действие:
> print myVal
и пусть программа продолжится.
> cont
В основном я хочу объединить / автоматизировать вышеупомянутые три команды в одну.
Я знаю, что могу добиться этого, используя функцию ожидаемого, но я хочу что-то встроенное в jdb. Мой вариант использования заключается в том, чтобы иметь возможность оперативно отлаживать проблемы клиентов, когда я не могу подключить обычный отладчик IDE или не могу быстро изменить код для добавления журналов.
3 ответа
Добавление моего собственного ожидаемого решения, на случай, если кто-то еще будет искать что-то вроде этого:
#!/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 для моего варианта использования. Возможно, вам придется изменить это при необходимости.
PS Измените путь к двоичному файлу jdb соответственно.
Я не знаю ни одного способа сделать это в JDB, однако эта функция существует в IntelliJ IDEA. В свойствах точки останова вы можете указать выражение, и среда IDE оценит его, запишет результат и при необходимости продолжит выполнение без остановки (если вы снимите флажок "Приостановить").
Похоже, вы пытаетесь использовать отладчик для чего-то, для чего он на самом деле не предназначен.
Концепцию, которую вы описываете, можно решить, если у вас есть исходный код. Вы можете просто поставить выход LOG4j для достижения вашей цели.
Я никогда не использовал отладчик JDB, но я использовал много разных отладчиков. Однако я провел некоторое исследование, из того, что я могу сказать, я думаю, что оно не поддерживает такую функциональность, которую также следует ожидать.
Я еще не видел отладчик, который делает что-то вроде этого. По сути, вы хотите иметь "функцию часов", но на стероидах. Т.е. вы даже не хотите пошагово проходить сам поток программ. Вы хотите, чтобы фрагмент кода выполнялся всякий раз, когда выполняется конкретная строка кода операции Java.
Чтобы добиться чего-то подобного в отладке на уровне машины (не JVM), вы должны использовать кодовые ячейки / внедрение кода и обход. Так что вы бы перехватили казнь. После этого вы можете изменять / проверять любые реестры, которые хотите изменить. После того, как вы закончите, вы вернетесь к исходной точке исполнения. Это то, что вы обычно делаете со злым умыслом:).
Наиболее близкой вещью к вашей текущей цели будет условная точка останова и использование ее вместе с функциональностью наблюдения, которую предлагают некоторые отладчики Java - jdb этого не делает. И Eclipse, и Intellij поддерживают условные контрольные точки и отслеживание переменных.
Таким образом, вы можете установить точку останова в своем коде только в том случае, если произойдет что-то конкретное для ваших интересов