blob: 348b7ff930d5e0da07c83f5ae601b72da949c46b [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Отладка многопоточных приложений в IDE NetBeans</title>
<link rel="stylesheet" href="../../../netbeans.css">
<meta name="description" content="An guide to using the debugger in NetBeans IDE to debug a multi-threaded application."/>
<meta HTTP-EQUIV="Content-Type" Content="text/html; charset=UTF-8"></head>
<body>
<h1>Отладка многопоточных приложений в IDE NetBeans</h1>
<p>В этом документе описывается использование окна 'Отладка' в IDE NetBeans для отладки многопоточных приложений. В данном руководстве также представлены способы использования среды IDE для обнаружения взаимоблокировок в приложении.</p>
<p>Процесс отладки значительно упрощен, поскольку вся информация о сеансах отладки, потоках выполнения и стеках вызовов потоков выполнения представлена в одном окне &quot;Debugging&quot;. В окне &quot;Debugging&quot; удобно просматривать состояние потоков выполнения, а также приостанавливать и возобновлять выполнение любого потока в сеансе.
</p>
<p>С целью демонстрации работы с окном &quot;Debugging&quot; в данном руководстве используются два примера проектов. В соответствии с указаниями в этом руководстве сначала загрузите, а затем откройте проекты &quot;Gallery&quot; и &quot;Deadlock&quot;.
</p>
<p class="tips">Просмотрите видео <a href="debug-multithreaded-screencast.html">Отладка многопоточных приложений в IDE NetBeans</a>.</p>
<p><b>Содержание</b></p>
<img alt="Содержимое на этой странице применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="Содержимое этой страницы применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0">
<ul>
<li><a href="#Exercise_00">Загрузка примеров проектов</a>
<li><a href="#Exercise_10">Открытие примеров проектов</a>
<ul>
<li><a href="#Exercise_11">Запуск проекта &quot;Gallery&quot;</a></li>
<li><a href="#Exercise_12">Запуск проекта &quot;Deadlock&quot;</a></li>
</ul>
</li>
<li><a href="#Exercise_20">Отладка примеров проектов</a>
<ul>
<li><a href="#Exercise_21">Приостановка потоков выполнения</a></li>
<li><a href="#Exercise_22">Переключение потоков выполнения</a></li>
<li><a href="#Exercise_23">Обнаружение взаимоблокировок</a></li>
</ul>
</li>
</ul>
<p><b>Для работы с этим учебным курсом требуется следующее программное обеспечение и ресурсы.</b></p>
<table>
<tr>
<th class="tblheader" scope="col">Программное обеспечение или материал</th>
<th class="tblheader" scope="col">Требуемая версия</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">IDE NetBeans</a></td>
<td class="tbltd1">7.2, 7.3, 7.4, 8.0</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Комплект для разработчика на языке Java (JDK)</a></td>
<td class="tbltd1">версия 7 или 8</td>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/projects/samples/downloads/download/Samples/Java/debugging-samples.zip">Проекты &quot;Gallery&quot; и &quot;Deadlock&quot;</a></td>
<td class="tbltd1">&nbsp;</td>
</tr>
</table>
<a name="Exercise_00"></a>
<h2>Загрузка примеров проектов</h2>
<p>Простые проекты, используемые в этом руководстве, можно загрузить следующими способами.</p>
<ul>
<li>Загрузите <a href="https://netbeans.org/projects/samples/downloads/download/Samples/Java/debugging-samples.zip">архив завершенного проекта в формате zip</a>.</li>
<li>Выполните проверку исходных файлов проекта на выходе из примеров NetBeans, выполнив перечисленные ниже действия.
<ol>
<li>Выберите в главном меню &quot;Группа &gt; Subversion &gt; Проверить&quot;.</li>
<li>В диалоговом окне &quot;Проверка&quot; введите следующий URL-адрес репозитория:<br /> <tt>https://svn.netbeans.org/svn/samples~samples-source-code</tt><br /> Нажмите кнопку &quot;Далее&quot;.</li>
<li>Нажмите кнопку Browse (&quot;Обзор&quot;) для открытия диалогового окна Browse Repository Folders (&quot;Обзор папок репозитория&quot;).</li>
<li>Разверните корневой узел и выберите <strong>samples/java/debugging-samples</strong>. Нажмите кнопку &quot;ОК&quot;.</li>
<li>Укажите локальную папку для исходных файлов (папка должна быть пустой).</li>
<li>Нажмите кнопку 'Готово'.
<p>После нажатия кнопки &quot;Готово&quot; среда IDE инициализирует локальную папку в качестве репозитория Subversion и выполняет проверку исходных файлов проекта на выходе.</p>
</li>
<li>Щелкните команду &quot;Открыть проект&quot; в диалоговом окне, которое появится после завершения проверки.</li>
</ol>
<p class="notes"><strong>Примечание.</strong> Дополнительные сведения об изъятии для использования источников с помощью Subversion см. в разделе <a href="../ide/subversion.html#settingUp">Настройка Subversion</a> в <a href="../ide/subversion.html">Руководстве по Subversion в IDE NetBeans</a>.</p>
</li>
</ul>
<!-- ===================================================================================== -->
<a name="Exercise_10"></a>
<h2>Открытие проектов</h2>
<p>Для демонстрации отладки многопоточных приложений в среде IDE в данном руководстве используются два приложения. В этом упражнении необходимо открыть и затем запустить два проекта в среде IDE. После запуска проектов можно перейти к отладке каждого из них.</p>
<div class="indent">
<a name="Exercise_11"></a>
<h3>Запуск проекта &quot;Gallery&quot;</h3>
<p>Приложение &quot;Gallery&quot; представляет собой простое приложение Java Swing для воспроизведения анимированных изображений. В приложении имеются две кнопки, позволяющие добавлять и удалять анимированные изображения. В этом упражнении будет выполнен запуск приложения &quot;Gallery&quot;.</p>
<ol>
<li>Загрузите и распакуйте архив <a href="https://netbeans.org/projects/samples/downloads/download/Samples/Java/debugging-samples.zip"><tt>debugging-samples.zip</tt></a> в локальной системе.</li>
<li>В главном меню выберите &quot;File &gt; Open&quot;.</li>
<li>В каталоге примеров приложений для отладки найдите и выберите проект &quot;Gallery&quot;. Нажмите кнопку Open (&quot;Открыть&quot;).
<p>При выборе &quot;Open&quot; в среде IDE проект будет открыт и выведен на экран в окне &quot;Projects&quot;. После развертывания узла проекта в окне &quot;Projects&quot; видно, что он представляет собой простое приложение на Java для Swing.</p></li>
<li>Для запуска приложения &quot;Gallery&quot; щелкните правой кнопкой мыши узел проекта и выберите &quot;Run&quot;.</li>
<li>В приложении &quot;Gallery&quot; нажмите кнопку &quot;More&quot; для добавления изображений и &quot;Less&quot; для удаления изображений.<br /> <img alt="снимок приложения &amp;quot;Gallery&amp;quot;." class="margin-around b-all" src="../../../images_www/articles/72/java/debug-multithread/debugging-gallery-app.png" title="Приложение &amp;quot;Gallery&amp;quot;." />
</li>
<li>Закройте окно приложения &quot;Gallery&quot;.</li>
</ol>
<p>Проект Gallery представляет собой простое многопоточное приложение, процесс отладки которого описывается в данном руководстве.</p>
<a name="Exercise_12"></a>
<h3>Запуск проекта &quot;Deadlock&quot;</h3>
<p>Приложение &quot;Deadlock&quot; содержит метод запуска потока выполнения <tt>main</tt>, который выполняется в течение 500 000 миллисекунд. Этот метод <tt>main</tt> запускает два потока выполнения, результаты которых отображаются в окне &quot;Output&quot;.</p>
<ol>
<li>В главном меню выберите &quot;File &gt; Open&quot;.</li>
<li>В каталоге примеров приложений для отладки найдите и выберите проект &quot;Deadlock&quot;. Нажмите кнопку Open (&quot;Открыть&quot;).
<p>При выборе &quot;Open&quot; в среде IDE проект будет открыт и выведен на экран в окне &quot;Projects&quot;. После развертывания узла проекта в окне &quot;Projects&quot; видно, что он представляет собой простое приложение Java.</p></li>
<li>Для запуска приложения &quot;Deadlock&quot; щелкните правой кнопкой мыши узел проекта и выберите &quot;Run&quot;.
<p>При нажатии кнопки &quot;Run&quot; откроется окно &quot;Output&quot;, в котором отображается следующая выходная информация.</p>
<pre class="examplecode">run:
Application started
MyThread2 successfully finished.
MyThread1 successfully finished</pre></li>
<li>Пусть приложение нормально завершит работу (пять минут).
<p>По завершении работы приложения &quot;Deadlock&quot; в окне &quot;Output&quot; должна отображаться следующая информация.</p>
<pre class="examplecode">Main thread finished</pre>
</li>
</ol>
<p>Проект &quot;Deadlock&quot; является простым приложением Java с двумя потоками выполнения. После отладки приложения будет создана взаимоблокировка с целью демонстрации возможностей среды IDE по обнаружению взаимоблокировок.</p>
</div>
<!-- ===================================================================================== -->
<a name="Exercise_20"></a>
<h2>Отладка примеров проектов</h2>
<p>Проект &quot;Gallery&quot; представляет собой простое приложение Java Swing для воспроизведения анимированных изображений. Добавление и удаление изображений в приложении осуществляется путем нажатия соответствующих кнопок. При нажатии кнопки &quot;More&quot; запускается новый поток выполнения, который выводит на экран и анимирует изображение. При нажатии кнопки &quot;Less&quot; останавливается самый новый поток выполнения, в результате чего анимация останавливается и изображение удаляется.
</p>
<div class="indent">
<a name="Exercise_21"></a>
<h3>Приостановка потоков выполнения</h3>
<p>В этом упражнении выполняется запуск отладки приложения &quot;Gallery&quot; и добавляются несколько изображений для запуска нескольких потоков приложения. После запуска сеанса отладки в левой области окна IDE открывается окно &quot;Debugging&quot;. В окне &quot;Debugging&quot; отображается список потоков выполнения данного сеанса.</p>
<ol>
<li>Щелкните правой кнопкой мыши проект &quot;Gallery&quot; в окне &quot;Projects&quot; и выберите &quot;Debug&quot;.
<p>После нажатия кнопки &quot;Debug&quot; в среде IDE запускается приложение &quot;Gallery&quot;, и открываются окна отладки по умолчанию. Окно &quot;Debugging&quot; автоматически открывается в левой области главного окна, а окно &quot;Debugger Console&quot; &ndash; в окне &quot;Output&quot;.</p></li>
<li>Трижды нажмите кнопку &quot;More&quot; в приложении &quot;Gallery&quot; для запуска трех потоков выполнения для воспроизведения анимированных изображений.
<p>В окне &quot;Debugging&quot; отобразится процесс запуска новых потоков выполнения для каждой анимации.</p>
<img alt="Снимок окна &apos;Отладка&apos;" class="margin-around b-all" height="151" src="../../../images_www/articles/72/java/debug-multithread/debugging-start.png" title="Окно отладки" width="375" />
</li>
<li>Приостановите два потока выполнения путем нажатия кнопки &quot;Suspend thread&quot; справа от каждого потока в окне &quot;Debugging&quot;.
<p>
Если поток выполнения приостановлен, соответствующий значок изменится, отражая его новое состояние. Для просмотра стека вызовов потока выполнения можно развернуть узел этого потока. Щелкните правой кнопкой мыши элементы в окне 'Отладка', чтобы открыть всплывающее меню с командами отладки.</p>
<img alt="снимок окна отладки с двумя отложенными потоками" class="margin-around b-all" height="151" src="../../../images_www/articles/72/java/debug-multithread/debugging-start-suspend.png" title="Окно отладки с двумя отложенными потоками" width="375" />
<p>При просмотре приложения &quot;Gallery&quot; видно, что после приостановки потоков выполнения анимация для этих потоков прервалась. </p></li>
</ol>
<p>Окно &quot;Debugging&quot; позволяет быстро просматривать и изменять состояние потоков выполнения в сеансе. По умолчанию в окне &quot;Debugging&quot; кнопки &quot;Resume&quot; и &quot;Suspend&quot; располагаются в правой области окна. Эти кнопки можно скрыть, после чего настроить вид окна &quot;Debugging&quot; с помощью панели инструментов в нижней области этого окна. При выполнении нескольких сеансов отладки для выбора сеанса, который должен отображаться в окне, можно использовать раскрывающийся список в верхней области окна &quot;Debugging&quot;.</p>
<img alt="Снимок панели инструментов окна отладки" class="margin-around b-all" height="60" src="../../../images_www/articles/72/java/debug-multithread/debugging-window-toolbar.png" title="Панель инструментов окна отладки" width="378" /> <a name="Exercise_22"></a>
<h3>Переключение потоков выполнения</h3>
<p>В данном упражнении демонстрируются результаты последовательного выполнения приложения, если при этом другой поток приложения достигает точки останова. В этом упражнении описывается установка точки останова для метода и последовательное выполнение приложения. В процессе последовательного выполнения приложения будет запущен новый поток выполнения, который также достигнет точки останова. Когда это произойдет, на экран будет выведено уведомление в окне &quot;Debugging&quot;. После этого следует выполнить переключение между потоками выполнения.</p>
<ol>
<li>В окне приложения 'Галерея' нажимайте 'Больше' или 'Меньше' до тех пор, пока на экране не будут отображаться две или три анимации.</li>
<li>В окне 'Проекты' IDE разверните пакет <tt>галереи</tt> и дважды щелкните <tt>Gallery.java</tt>, чтобы открыть файл в редакторе.</li>
<li>В файле <tt>Gallery.java</tt> вставьте точку останова в начало метода <tt>run</tt> путем щелчка в левой части строки 175.</li>
<li>Нажмите кнопку &quot;More&quot; в приложении &quot;Gallery&quot; для запуска нового потока выполнения, который должен достичь точки останова.</li>
<li>Нажмите Step Over (&quot;По оператору с обходом процедур&quot;) (F8) и исполняйте метод по оператору, пока счетчик строк кода не достигнет строки 191.
<p>В счетчике строк кода в поле редактора отображается текущее положение в коде при пошаговом выполнении метода.</p></li>
<li>Нажмите кнопку &quot;More&quot; в приложении &quot;Gallery&quot; для запуска нового потока выполнения, который должен достичь точки останова.
<p>Когда новый поток выполнения достигнет точки останова, установленной в методе, в окне &quot;Debugging&quot; появится уведомление &quot;New Breakpoint Hit&quot;, информирующее о том, что еще один поток выполнения достиг точки останова в процессе последовательного выполнения метода.</p>
<img alt="снимок уведомления &apos;Достижение новой точки останова&apos;" class="margin-around b-all" height="90" src="../../../images_www/articles/72/java/debug-multithread/debugging-newbreakpointhit.png" title="Уведомление &apos;Достижение новой точки останова&apos;" width="585" />
<p>Когда в процессе последовательного выполнения потока другой поток выполнения достигает точки останова, в среде IDE предлагается возможность выбора: переключение на другой поток выполнения или продолжение пооператорного выполнения текущего потока. Для переключения на поток выполнения, достигший точки останова, в уведомлении &quot;New Breakpoint Hit&quot; можно нажать кнопку со стрелкой. На новый поток выполнения можно переключиться в любой момент путем выбора потока в окне уведомления. При выборе пооператорного выполнения текущего потока, достигшего точки останова, возобновляется текущий поток выполнения, однако состояние других потоков приложения остается неизменным.</p>
<p class="notes"><strong>Примечание.</strong> В окне &quot;Debugging&quot; отобразится текущий поток (Thread_Jirka), который указывается с помощью зеленой полосы на границы. Поток выполнения, инициировавший уведомление при достижении точки останова (Thread_Roman), отмечен желтой полосой, а значок этого потока указывает на то, что данный поток выполнения приостановлен, поскольку достигнута точка останова.</p>
<img alt="снимок уведомления &apos;Достижение новой точки останова&apos;" class="margin-around b-all" height="200" src="../../../images_www/articles/72/java/debug-multithread/debugging-current-suspended.png" title="Уведомление &apos;Достижение новой точки останова&apos;" width="375" />
</li>
<li>Для переключения между текущим потоком выполнения и новым потоком (Thread_Roman) в уведомлении &quot;New Breakpoint Hit&quot; нажмите кнопку со стрелкой.
<p>После переключения на новый поток выполнения на экране можно увидеть следующее:</p>
<ul>
<li>Счетчик команд переместился в позицию, соответствующую строке 175 в новом текущем потоке выполнения (Thread_Roman).</li>
<li>В поле строки 191 появилась аннотация приостановки потока, указывающая на то, что поток выполнения (Thread_Jirka) приостановлен на этой строке.</li>
</ul>
<img alt="снимок редактора, в котором отображаются аннотации отладки" class="margin-around b-all" height="402" src="../../../images_www/articles/72/java/debug-multithread/debugging-editor-suspendedannot.png" title="Редактор, в котором отображаются аннотации отладки" width="436" />
</li>
<li>Для пошагового выполнения нового текущего потока (Thread_Roman) несколько раз нажмите &quot;Обход процедур&quot;.</li>
<li>Щелкните правой кнопкой мыши аннотацию приостановки потока в поле редактора и выберите &quot;Set as Current Thread &gt; Thread_Jirka&quot; для обратного переключения на приостановленный поток.<br /> <img alt="снимок редактора, в котором отображается всплывающее окно &apos;Задан как текущий поток&apos;" class="margin-around b-all" height="291" src="../../../images_www/articles/72/java/debug-multithread/debugging-editor-setcurrent.png" title="Редактор, в котором отображается всплывающее окно &apos;Задан как текущий поток&apos;" width="436" />
<p class="tips">Также можно вызвать окно 'Средство выбора текущего потока' (Alt+Shift+T; Ctrl+Shift+T на Mac) и переключиться на любой из потоков приложения.</p>
<img alt="снимок приложения &amp;quot;Gallery&amp;quot;." class="margin-around b-all" height="122" src="../../../images_www/articles/72/java/debug-multithread/debugging-thread-chooser.png" title="Приложение &amp;quot;Gallery&amp;quot;." width="355" /></li>
</ol>
<p>При обратном переключении на поток Thread_Jirka напротив строки, на которой был приостановлен поток Thread_Roman, появится аннотация приостановки потока. Возобновить поток Thread_Roman можно путем нажатия кнопки &quot;Resume&quot; в окне &quot;Debugging&quot;.</p>
<img alt="снимок редактора, в котором отображаются аннотации отладки" class="margin-around b-all" height="300" src="../../../images_www/articles/72/java/debug-multithread/debugging-editor-suspendedannot2.png" title="Редактор, в котором отображаются аннотации отладки" width="436" />
<p>Окно &quot;Debugging&quot; обеспечивает точное представление и контроль состояний потоков выполнения. Отладчик управляет потоками приложения, что упрощает процесс отладки и предотвращает возникновение взаимоблокировок. В этом упражнении были рассмотрены следующие принципы отладки приложения в среде IDE.</p>
<ul>
<li>Когда поток выполнения достигает точки останова, приостанавливается только этот поток.</li>
<li>Если в процессе пооператорного выполнения приложения точки останова достигают другие потоки приложения, это не влияет на текущий поток выполнения.</li>
<li>При пооператорном выполнении приложения возобновляется только текущий поток выполнения. После выполнения оператора приостанавливается только текущий поток выполнения.</li>
</ul>
<p>Теперь можно выйти из приложения &quot;Gallery&quot;. В следующем упражнении будет выполнена отладка приложения &quot;Deadlock&quot; и продемонстрировано использование среды IDE для обнаружения взаимоблокировки.</p>
<a name="Exercise_23"></a>
<h3>Обнаружение взаимоблокировок</h3>
<p>Среда IDE может использоваться для идентификации потенциальных ситуаций взаимоблокировки путем автоматического поиска взаимоблокировок по всем приостановленным потокам выполнения. При обнаружении взаимоблокировки в среде IDE на экран выводится соответствующее уведомление в окне &quot;Debugging&quot;, в котором указаны задействованные потоки выполнения.</p>
<p>Для изучения процесса обнаружения взаимоблокировки в среде IDE необходимо запустить в отладчике демонстрационный проект &quot;Deadlock&quot; и создать ситуацию взаимоблокировки.</p>
<ol>
<li>Разверните пакет <tt>myapplication</tt> и откройте файлы <tt>Thread1.java</tt> и <tt>Thread2.java</tt> в редакторе исходного кода.</li>
<li>Установите точку останова для <tt>Thread1.java</tt> в строке 20 и для <tt>Thread2.java</tt> в строке 20.
<p>Для установки точки останова в поле редактора исходного кода щелкните поле напротив строки, в которой требуется установить точку останова. В левом поле напротив этой строки появится аннотация точки останова. Если открыть окно 'Точки останова' (Alt-Shift-5; Ctrl+Shift+5 на Mac), можно увидеть две установленные и активированные точки останова.</p>
<img alt="снимок редактора, в котором отображаются точки останова, заданные в строке 20" class="margin-around b-all" height="373" src="../../../images_www/articles/72/java/debug-multithread/debug-deadlock-setbkpt.png" title="В редакторе отображаются точки останова, заданные в строке 20" width="589" />
</li>
<li>Щелкните правой кнопкой мыши проект &quot;Deadlock&quot; в окне &quot;Projects&quot; и выберите &quot;Debug&quot;.
<p>При вызове метода <tt>main</tt> будут запущены эти два потока выполнения, при этом оба потока будут приостановлены в одной из точек останова. Потоки, приостановленные в точках останова, можно просмотреть в окне &quot;Debugging&quot;.</p></li>
<li>В окне &quot;Debugging&quot; возобновите приостановленные потоки выполнения (<tt>MyThread1</tt> и <tt>MyThread2</tt>) путем нажатия кнопки &quot;Resume&quot; справа от приостановленных потоков.<br /> <img alt="Снимок восстановления приостановленных потоков в окне &amp;quot;Отладка&amp;quot;." class="margin-around b-all" height="283" src="../../../images_www/articles/72/java/debug-multithread/debug-deadlock-resume.png" title="Восстановление приостановленных потоков в окне &amp;quot;Отладка&amp;quot;." width="585" />
<p>Возобновление потоков выполнения <tt>MyThread1</tt> и <tt>MyThread2</tt> приведет к возникновению ситуации взаимоблокировки.</p>
<li>Выберите в главном меню команду &quot;Debug\Check for Deadlock&quot; для проверки приостановленных потоков выполнения на наличие взаимоблокировок.<br /> <img alt="Снимок восстановления приостановленных потоков в окне &amp;quot;Отладка&amp;quot;." class="margin-around b-all" height="308" src="../../../images_www/articles/72/java/debug-multithread/debug-deadlock-detected.png" title="Восстановление приостановленных потоков в окне &amp;quot;Отладка&amp;quot;." width="372" />
<p>Если в ходе проверки приложения обнаружена взаимоблокировка, в окне &quot;Debugging&quot; появится сообщение, информирующее об этой ситуации. Потоки выполнения, находящиеся во взаимоблокировке, отмечаются красной полосой в левом поле окна &quot;Debugging&quot;.</p>
</li>
</ol>
</div>
<!-- ===================================================================================== -->
<p>Настоящий учебный курс является общим введением в некоторые из функций отладки в среде IDE. Окно &quot;Debugging&quot; позволяет без труда приостанавливать и возобновлять потоки выполнения при отладке приложений. Это очень удобно при отладке многопоточных приложений.
</p>
<!-- End Content Area -->
<br>
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Debugging%20Multithreaded%20Applications">Отправить отзыв по этому учебному курсу</a></div>
<br style="clear:both;" />
<!-- ======================================================================================= -->
<h2><a name="nextsteps"></a>Дополнительные сведения</h2>
<p>Дополнительные сведения о разработке и тестировании приложений в IDE NetBeans см. следующие ресурсы:</p>
<ul>
<li>Демонстрация: <a href="debug-multithreaded-screencast.html">Отладка многопоточного приложения в IDE NetBeans</a></li>
<li>Демонстрация: <a href="debug-stepinto-screencast.html"> визуальная операция Step Into в отладчике NetBeans</a></li>
<li>Демонстрация: <a href="debug-deadlock-screencast.html">обнаружение взаимоблокировки с помощью отладчика NetBeans</a></li>
<li>Демонстрация: <a href="debug-evaluator-screencast.html">использование блока оценки фрагмента кода в отладчике NetBeans</a></li>
<li><a href="../../trails/java-se.html">Учебная карта по основам среды IDE и программирования на языке Java</a></li>
<li><a href="junit-intro.html">Написание тестов JUnit</a></li>
<li><a href="profiler-intro.html">Введение в профилирование приложений, написанных на Java</a></li>
</ul>
</body>
</html>