// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Видеоролик о визуальной операции Step Into в отладчике NetBeans
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Видеоролик о визуальной операции Step Into в отладчике NetBeans - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Видеоролик о визуальной операции Step Into в отладчике NetBeans

|===
|Роман Ондруска (Roman Ondruska) демонстрирует операцию Step Into с помощью визуального селектора вызова метода в отладчике NetBeans.

Автор: Роман Ондруска (Roman Ondruska)
Продолжительность: 3:24

link:http://bits.netbeans.org/media/stepinto-debugger.mp4[+Смотреть полностью+] (Чтобы загрузить видео, нажмите клавишу Ctrl; размер – 4 МБ)


link:/about/contact_form.html?to=3&subject=Feedback:%20Visual%20Step%20Into%20Action%20in%20NetBeans%20Debugger[+Отправить отзыв по этому учебному курсу+]
 |         
|===


== Связанные ссылки

* Демонстрация: link:debug-deadlock-screencast.html[+обнаружение взаимоблокировки с помощью отладчика NetBeans+]
* Демонстрация: link:debug-evaluator-screencast.html[+использование блока оценки фрагмента кода в отладчике NetBeans+]
* Демонстрация: link:debug-multithreaded-screencast.html[+Многопотоковая отладка с помощью IDE NetBeans+]
* link:debug-multithreaded.html[+Отладка многопотоковых приложений в IDE NetBeans+]
