Эквивалент DebugBreak в Java?
Я ищу способ взломать отладчик из кода Java, не устанавливая точку останова в IDE.
В Win32 было DebugBreak()
в C# есть DebugBreak() эквивалент в C#, но я не могу найти ничего в Java.
Что я пытаюсь сделать: скажем, у меня есть ожидание с тайм-аутом 30 с, но в нормальных условиях это ожидание всегда должно быть <1 с. Я хотел бы использовать ByteMan или что-то подобное, чтобы сначала подождать с тайм-аутом в 1 с, и, если тайм-аут ожидания, перерыв в отладчике.
5 ответов
Постер этого вопроса сделал именно то, что я искал: Безопасная отладка для производственных JVM
Это воспроизводит лучшую особенность DebugBreak
То есть вы можете присоединить IDE к вашей программе только после того, как достигнута "точка останова".
Я создал этот класс
import com.sun.jna.Library;
public interface Kernel32 extends Library {
public void OutputDebugStringA(String Text);
public void DebugBreak();
}
затем использовал это так:
Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
lib.OutputDebugStringA("just before DebugBreak\n");
lib.DebugBreak();
и это все. Вызывает нативную функцию void WINAPI DebugBreak(void);
внутри Kernel32.dll
Вам также нужен файл JAR jna-4.4.0.jar
Не прямой ответ на ваш вопрос, но в большинстве IDE вы можете установить conditional breakpoints
,
Это потребует от вас установки переменной timestamp в вашем коде до истечения времени ожидания и проверки ее значения в точке останова после истечения времени ожидания. Вы бы активировали условную точку останова, если дельта больше вашего порога.
для упрощения ситуации внутри IDE используйте также этот пример с точкой останова в теле, условное обозначение бедного человека ... (извините за формат С #)
if (lineNumber==6502)
{
System.out.println("BREAK"); //breakpoint here
}
В настоящее время (по состоянию на 2021 год) вы не можете сделать это на Java таким же удобным способом, как
DebugBreak
находится на C#.
Лучшее, что вы можете сделать в Java, - это создать настраиваемое исключение времени выполнения (скажем,
class DebugBreakException extends RuntimeException
) и молитесь, чтобы вы также не забыли добавить «точку останова исключения», которая прерывается всякий раз, когда возникает это исключение, даже если исключение обработано.
Сразу после того, как ваш код генерирует это исключение, он перехватывает его и выводит сообщение о том, что это конкретное исключение произошло.
Если это сообщение когда-либо появляется в журнале, но ваш отладчик не сломался, значит, вы забыли добавить необходимую «точку останова по исключению». (Другими словами, вы должны молиться, чтобы, если это сообщение когда-нибудь будет зарегистрировано, его кто-нибудь заметит.)
Вы также можете проявить особую смекалку и добавить код, который проверяет, сколько миллисекунд прошло с момента возникновения исключения до момента его обнаружения; если прошло более, скажем, 10 миллисекунд, то, скорее всего, произошел сбой в работе отладчика, поэтому запись сообщения в журнал можно пропустить. Если исключение было обнаружено менее чем за 10 миллисекунд, значит, отладчик, вероятно, не сломался, поэтому вы можете продолжить регистрацию сообщения.
Само собой разумеется, что помимо простой записи сообщения вы можете попытаться принять как можно больше дополнительных мер, например, издать звуковой сигнал, включить лампу, отправить электронное письмо самому себе, стукнуть в гонг, поджарить материнскую плату и т. Д. .