Отладка Java-приложений из командной строки / Хабр

Debug – запуск отладчика ms dos / windows.

Debug.exe — программа-отладчик, разработанная для операционной системы MS DOS и используемая для отладки исполняемых файлов. Под более поздние версии операционных
систем (Windows NT и старше) работает через эмулятор MS-DOS и имеет ограниченные возможности. До Windows XP включительно, отладчик debug.exe являлся стандартным компонентом системы.

Формат командной строки:

DEBUG [[диск:][путь]имя_файла [параметры_программы]]

Параметры командной строки:

[диск:][путь]имя_файла – путь и имя отлаживаемой программы.

параметры_программы – параметры командной строки для отлаживаемой программы.

Примеры:

debug /? – отобразить краткую справку по использованию.

debug C:windowssystem32edit.com C:boot.ini – запустить отладку текстового редактора edit.com, передав ему в качестве параметра командной строки путь и имя редактируемого файла.

debug – при запуске без параметров, отладчик переходит в интерактивный режим, ожидая ввода команд. Подсказку по используемым командам можно получить, введя знак вопроса –?:

Краткая подсказка по использованию отладчика Debug:

assemble A [адрес]
compare C диапазон адрес
dump D [диапазон]
enter E адрес [список]
fill F диапазон список
go G [=адрес] [адреса]
hex H значение1 значение2
input I порт
load L [адрес] [диск] [превый_сектор] [число]
move M диапазон адрес
name N [путь] [список_аргументов]
output O порт байт
proceed P [=адрес] [число]
quit Q
register R [регистр]
search S диапазон список
trace T [=адрес] [значение]
unassemble U [диапазон]
write W [адрес] [диск] [первый_сектор] [число]
выделение памяти EMS XA [#число_страниц]
освобождение памяти EMS XD [дескриптор]
сопоставление страниц EMS XM [Lстраница] [Pстраница] [дескриптор]
вывод состояния памяти EMS XS

При небольших размерах исполняемого файла, отладчик обладал очень неплохими возможностями, позволяя не только выполнять отладку программ,
но и просматривать содержимое памяти, в том числе BIOS материнской платы и плат расширения,
выполнять операции ввода-вывода с доступом к регистрам устройств ( в среде MS DOS ), и например,
позволял легко сохранить в файл и дизасемблировать главную загрузочную запись MBR.

Для выхода из отладчика используется клавиша q.

Весь список команд CMD Windows

Команда jdb

Формат команды jdb:

jdb [options] [classname] [arguments]

options:    This represents the jdb command-line options (e.g. attach, launch).
classname:  This represents the name of the main class to debug.
arguments:  This represents the arguments that are passed to the main() method of the class.

Отладка java с помощью утилиты “jdb”

jdb расположена в каталоге jdk/bin. Она использует интерфейс отладки Java (JDI) для запуска и подключения к целевой JVM. Интерфейс отладки Java (JDI) предоставляет интерфейс языка программирования Java для отладки приложений на языке программирования Java.

:/>  Активатор Windows 10 x64 скачать торрент - KMSAuto Lite Portable 2018 на русском.

В этом разделе мы рассмотрим, как подключить jdb к java-приложению и начать отладку и мониторинг.

Подключение jdb к java-приложению

Приведенная ниже команда – это наиболее распространенный способ запуска приложения с отладчиком jdb. Здесь мы не передаем никаких параметров jdb, мы передали только имя класса, который не требует никаких аргументов:

jdb Test

Таким образом, мы запускаем выполнение основного класса «Test» аналогично тому, как мы запускаем выполнение основного класс в среде IDE. jdb останавливает JVM перед выполнением первой инструкции этого класса.

Другой способ использовать команду jdb для подключения ее к уже запущенной JVM. Синтаксис для запуска JVM с портом отладчика:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 Test

Чтобы подключить jdb к этому удаленному jvm, используйте синтаксис ниже:

jdb -attach 5005

В этой статье мы не будем подробно рассматривать удаленную отладку.

Отладка и мониторинг

Ниже приводится команда для присоединения jdb к Java-программе Test:

/jdk/bin/jdb Test 
Initializing jdb ...
>

Установите точку останова в строке 5, используя команду «stop», как показано ниже:

> stop at Test:5
Deferring breakpoint Test:5.
It will be set after the class is loaded.
>

Запустите выполнение основного класса приложения с помощью команды “run”:

> run
run  Test
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
>
VM Started: Set deferred breakpoint Test:5

Breakpoint hit: "thread=main", Test.main(), line=5 bci=0
5           System.out.println("First Line of main function");

Выполнить текущую строку с помощью команды «step»:

main[1] step
> First Line of main function
Step completed: "thread=main", Test.main(), line=6 bci=8
6            System.out.println("Second Line of main function");

Выполнить текущую строку с помощью команды «step»:

main[1] step
> Second Line of main function
Step completed: "thread=main", Test.main(), line=7 bci=16
7            System.out.println("Third Line of main function");

Печать локальной переменной i с помощью команды “print”:

main[1] print i
i = 0

Печать всех локальных переменных в текущем фрейме стека с использованием команды “locals”:

main[1] locals
Method arguments:
args = instance of java.lang.String[0] (id=841)
Local variables:
i = 0

Выгрузите стек потока, используя команду “where”:

main[1] where
[1] Test.main (Test.java:10)

Выдать список потоков в запущенном приложении, используя команду “threads”:

main[1] threads
Group system:
(java.lang.ref.Reference$ReferenceHandler)804 Reference Handler running
(java.lang.ref.Finalizer$FinalizerThread)805 Finalizer cond. waiting
(java.lang.Thread)806 Signal Dispatcher running
(java.lang.Thread)803 Notification Thread running
Group main:
(java.lang.Thread)1 main running
Group InnocuousThreadGroup:
(jdk.internal.misc.InnocuousThread)807 Common-Cleaner cond. waiting

Продолжить выполнение с точки останова, используя команду cont:

main[1] cont
> i: 0
i: 2

Все доступные команды jdb можно получить используя команду “help”:

connectors -- list available connectors and transports in this VM
run [class [args]] -- start execution of application's main class
threads [threadgroup] -- list threads
thread -- set default thread
suspend [thread id(s)] -- suspend threads (default: all)
resume [thread id(s)] -- resume threads (default: all)
where [ | all] -- dump a thread's stack
wherei [ | all]-- dump a thread's stack, with pc info
up [n frames] -- move up a thread's stack
down [n frames] -- move down a thread's stack
kill -- kill a thread with the given exception object
interrupt -- interrupt a thread
print -- print value of expression
dump -- print all object information
eval -- evaluate expression (same as print)
set = -- assign new value to field/variable/array element
locals -- print all local variables in current stack frame
classes -- list currently known classes
class -- show details of named class
methods -- list a class's methods
fields -- list a class's fields
threadgroups -- list threadgroups
threadgroup -- set current threadgroup
stop [go|thread] []
-- set a breakpoint
-- if no options are given, the current list of breakpoints is printed
-- if "go" is specified, immediately resume after stopping
-- if "thread" is specified, only suspend the thread we stop in
-- if neither "go" nor "thread" are specified, suspend all threads
-- if an integer is specified, only stop in the specified thread
-- "at" and "in" have the same meaning
-- can either be a line number or a method:
-- :
-- .[(argument_type,...)]
clear .[(argument_type,...)]
-- clear a breakpoint in a method
clear : -- clear a breakpoint at a line
clear -- list breakpoints
catch [uncaught|caught|all] |
-- break when specified exception occurs
ignore [uncaught|caught|all] |
-- cancel 'catch' for the specified exception
watch [access|all] .
-- watch access/modifications to a field
unwatch [access|all] .
-- discontinue watching access/modifications to a field
trace [go] methods [thread]
-- trace method entries and exits.
-- All threads are suspended unless 'go' is specified
trace [go] method exit | exits [thread]
-- trace the current method's exit, or all methods' exits
-- All threads are suspended unless 'go' is specified
untrace [methods] -- stop tracing method entrys and/or exits
step -- execute current line
step up -- execute until the current method returns to its caller
stepi -- execute current instruction
next -- step one line (step OVER calls)
cont -- continue execution from breakpoint
list [line number|method] -- print source code
use (or sourcepath) [source file path]
-- display or change the source path
exclude [, ... | "none"]
-- do not report step or method events for specified classes
classpath -- print classpath info from target VM
monitor -- execute command each time the program stops
monitor -- list monitors
unmonitor -- delete a monitor
read -- read and execute a command file
lock -- print lock info for an object
threadlocks [thread id] -- print lock info for a thread
pop -- pop the stack through and including the current frame
reenter -- same as pop, but current frame is reentered
redefine
-- redefine the code for a class
disablegc -- prevent garbage collection of an object
enablegc -- permit garbage collection of an object
!! -- repeat last command
-- repeat command n times
# -- discard (no-op)
help (or ?) -- list commands
dbgtrace [flag] -- same as dbgtrace command line option
version -- print version information
exit (or quit) -- exit debugger
: a full class name with package qualifiers
: a class name with a leading or trailing wildcard ('*')
: thread number as reported in the 'threads' command
: a Java(TM) Programming Language expression.

Поддерживается весьма стандартный синтаксис команд.

:/>  ТОП-8 Лучших Эмуляторов iOS на ПК под Windows

Пример java приложения для отладки

Ниже приведен пример Java класса, который мы собираемся отладить и попытаться понять различные доступные функции. Важно скомпилировать этот класс с параметром «-g» (javac -g Test.java), который генерирует всю отладочную информацию, включая локальные переменные. По умолчанию генерируется только информация о номере строки и исходном файле.

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("First Line of main function");
        System.out.println("Second Line of main function");
        System.out.println("Third Line of main function");

        int i=0;
        System.out.println("i: "   i);
        i = 2;
        System.out.println("i: "   i);

        while(true)
        {
        }
    }
}

Заключение

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

Чтобы помочь вам, автор статьи написал электронную книгу 5 steps to Best Java Jobs. Вы можете загрузить это пошаговое руководство бесплатно!

Оставьте комментарий

Adblock
detector