<chapter id="debugger">
<title
>Интерфейс отладчика</title>
<indexterm zone="debugger"
><primary
>отладчик</primary
></indexterm>

<para
>Для C и C++ &kdevelop; содержит встроенный отладчик, интегрированный с редактором. Технически это реализовано как внешний интерфейс для отладчика &GNU; <application
>gdb</application
> через каналы (pipe). Отладчик можно запустить несколькими способами: </para>

<itemizedlist>
<listitem>
<para
>Через пункт меню <menuchoice
><guimenu
>Отладка</guimenu
><guimenuitem
>Запуск</guimenuitem
></menuchoice
>, после чего в отладчик загрузится главная программа вашего проекта. </para>
</listitem>

<listitem>
<para
>Через пункт меню <menuchoice
><guimenu
>Отладка</guimenu
> <guimenuitem
>Запуск другого</guimenuitem
> <guimenuitem
>Загрузить файл core</guimenuitem
></menuchoice
> загрузится core-файл, генерируемый ядром системы после сбоя программы (это может быть выключено в вашей системе, см. <application
>ulimit(1)</application
>). Эта отладка полезна для анализа сбоев программы. </para>
</listitem>

<listitem>
<para
>Через пункт меню <menuchoice
><guimenu
>Отладка</guimenu
> <guimenuitem
>Запуск другого</guimenuitem
> <guimenuitem
>Присоединить к процессу</guimenuitem
></menuchoice
> отладчик подстроится к уже запущенной программе. Вам нужно будет выбрать её из списка запущенных процессов. </para>
</listitem>

<listitem>
<para
>Помните, что отладка возможна только если программа была скомпилирована с информацией для отладки. Это можно установить в диалоге <guibutton
>Параметры компилятора</guibutton
>. Информация для отладки помогает найти соответствие между именами файлов, строчками и адресами в программе. </para>
</listitem>
</itemizedlist>

<para
>Отладчик предлагает несколько видов информации о процессе: </para>

<para
>При попытке запуска отладки проекта без отладочной информации вы получите сообщение <computeroutput
>Нет исходного кода...</computeroutput
> в строке состояния. При установке точки останова, она будет показана в панели точек останова как <computeroutput
>В ожидании (добавление)</computeroutput
> (см. ниже). </para>

<variablelist>
<varlistentry>
<term
>Переменные</term>
<listitem>
<indexterm zone="debugger"
><primary
>наблюдать переменные</primary
></indexterm>
<para
>Окно содержит список значений всех локальных переменных на текущей точке выполнения. </para>

<para
>Можно наблюдать как локальные, так и глобальные переменные. Добавить переменную можно либо нажатием кнопки <guibutton
>Добавить</guibutton
>, либо нажатием клавиши <keycap
>Enter</keycap
> на выбранном пункте <guilabel
>Наблюдение</guilabel
>. Удалить их можно через контекстное меню. </para>
</listitem>
</varlistentry>

<varlistentry>
<term
>Фреймовый стек</term>
<listitem>
<indexterm zone="debugger"
><primary
>фреймовый стек</primary
></indexterm>
<para
>(... в процессе написания ...) </para>
</listitem>
</varlistentry>

<varlistentry>
<term
>Точки останова</term>
<listitem>
<indexterm zone="debugger"
><primary
>точки останова</primary
></indexterm>
<para
>Данная панель позволяет просматривать и управлять точками останова. Для непосредственной отладки используется <application
>GDB</application
>, так что для полного понимания всех возможностей отладки &kdevelop; необходимо базовое представление о принципе работы <ulink url="http://www.gnu.org/software/gdb"
>GDB</ulink
>. </para>

<para
>Исходный код, содержащий определение точек останова, находится в файле <filename
>kdevelop/languages/cpp/debugger/breakpoint.h</filename
>. </para>

<para
>На левом краю панели имеются кнопки со следующими функциями:</para>

<itemizedlist>
<listitem
><para
>Добавление пустой точки останова</para
></listitem>
<listitem
><para
>Изменение выбранной точки останова</para
></listitem>
 <listitem
><para
>Удаление выбранной точки останова</para
></listitem>
<listitem
><para
>Удаление всех точек останова</para
></listitem>
</itemizedlist>

<para
>Основная часть панели - таблица с 7 столбцами. Каждой строке таблицы соответствует одна точка останова. Столбцы:</para>

<orderedlist>
<listitem
><para
>Переключатель для выбора точек</para
></listitem>
<listitem
><para
>Тип: Ошибка, Файл:строка, Точка наблюдения, Адрес или Метод</para
></listitem>
<listitem
><para
>Статус:</para>
<itemizedlist>
  <listitem
><para
>Разрешена</para
></listitem>
  <listitem
><para
>Запрещена: если точка останова запрещена, при отладке она пропускается.</para
></listitem>
  <listitem
><para
>В ожидании (добавление): показывается при отсутствии отладочной информации. Из info-страницы GDB: <blockquote
><para
>Если указанное расположение точки останова найти не удалось, это может быть из-за того, что библиотека, в которой оно находится, ещё не загружена. В этом случае можно создать особую точку останова (<quote
>pending breakpoint</quote
>), действие которой откладывается до хагрухки необходимой библиотеки.</para
> </blockquote
> </para
></listitem>
</itemizedlist>
</listitem>
<listitem
><para
>В ожидании (очистка)</para
></listitem>
<listitem
><para
>В ожидании (изменение)</para
></listitem>
<listitem
><para
>Расположение в формате файл:строка</para
></listitem>
<listitem
><para
>Условие</para
></listitem>
<listitem
><para
>Счётчик игнорирования: если число <varname
>N</varname
> больше нуля, то в первые <varname
>N</varname
> раз при достижении точки останова выполнение программы остановленр не будет.</para
></listitem>
<listitem
><para
>Попадания: количество достижений точки останова.</para
></listitem>
</orderedlist>


</listitem>
</varlistentry>

<varlistentry>
<term
>Дизассемблирование</term>
<listitem>
<indexterm zone="debugger"
><primary
>дизассемблирование</primary
></indexterm>
<para
>(... в процессе написания ...)</para>

</listitem>
</varlistentry>
</variablelist>


<sect1 id="settingbreakpoints">
<title
>Установка точек останова</title>

<para
>(... в процессе написания ...) </para>

</sect1
> <!-- settingbreakpoints -->

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->

<sect1 id ="debuggeroptions">
<title
>Параметры</title>

<variablelist>
<varlistentry>
<term
>Отобразить обработанные имена</term>
<listitem>
<indexterm zone="debugger"
><primary
>обработка имён</primary
></indexterm>
<indexterm zone="debugger"
><primary
>mangle</primary
><secondary
>имя</secondary
></indexterm>

<para
>В программе, написанной на C++, имена функций изменяются (<quote
>mangled</quote
>), то есть к начальному имени функции добавляется информация о типах аргументов, которые она принимает. Это необходимо для перегрузки (overload) функций. Алгоритм такой обработки не стандартизован и имеет различные реализации даже в разных версиях компилятора &GNU; C++. </para>

<para
>В окне дизассемблирования отображаются не изменённые имена, однако это можно изменить. </para>
</listitem>
</varlistentry>

<varlistentry>
<term
>Попробуйте установку точек останова по загрузке библиотеки</term>
<listitem>
<indexterm zone="debugger"
><primary
>"ленивые" точки останова</primary
></indexterm>
<indexterm zone="debugger"
><primary
>точки останова</primary
><secondary
>lazy</secondary
></indexterm>

<para
>Отладчик <application
>gdb</application
> не разрешает устанавливать точки останова в коде, не загруженном в данный момент. В приложении с модульной структурой, где код загружается только по требованию (через функцию libc <function
>dlopen(3)</function
>). Возможность установки точек останова в библиотеках предоставляет &kdevelop;. Таким образом, точки останова ставятся в своеобразную очередь и передаются <application
>gdb</application
> только после загрузки необходимой библиотеки. </para>
</listitem>
</varlistentry>

<varlistentry>
<term
>Включить плавающую панель</term>
<listitem>
<indexterm zone="debugger"
><primary
>панель инструментов отладчика</primary
></indexterm>
<indexterm zone="debugger"
><primary
>панель инструментов</primary
><secondary
>отладчик</secondary
></indexterm>

<para
>(... в процессе написания ...) </para>
</listitem>
</varlistentry>
</variablelist>

</sect1
> <!-- debuggeroptions -->

</chapter
> <!-- debugger -->
