<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 -->