|
|
<chapter id="debugger">
|
|
|
<title>Интерфейс отладчика</title>
|
|
|
<indexterm zone="debugger"><primary>отладчик</primary></indexterm>
|
|
|
|
|
|
<para>Для C и C++ &tdevelop; содержит встроенный отладчик, интегрированный с редактором. Технически это реализовано как внешний интерфейс для отладчика &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>, так что для полного понимания всех возможностей отладки &tdevelop; необходимо базовое представление о принципе работы <ulink url="http://www.gnu.org/software/gdb">GDB</ulink>. </para>
|
|
|
|
|
|
<para>Исходный код, содержащий определение точек останова, находится в файле <filename>tdevelop/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>). Возможность установки точек останова в библиотеках предоставляет &tdevelop;. Таким образом, точки останова ставятся в своеобразную очередь и передаются <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 -->
|