Translation(s): Русский - English


Как получить осмысленный бэктрейс

Эта страница попытается объяснить, как получить осмысленный бэктрейс отладки из воспроизводимой ошибки в программе. В этом примере, мы установим пакет "hello" с отладочными символами или в случае если пакет не доступен, пересоберем и установим его с сохранением отладочной информации.

Для справки, знак "#" в начале строки означает, что следующая команда будет выполнена от имени суперпользователя root (или с помощью sudo). "$" в начале строки означает, что следующая команда будет выполнена от имени обычного пользователя. "(gdb)" означает, что вы должны придерживаться набора текста в командной строке приглашения gdb (GNU Debugger).

Установка отладочных символов

Чтобы узнать, имеется ли у отлаживаемого вами пакета зависимость в виде пакета -dbg (например, пакет с исходным кодом hello и пакет hello-dbg) найдите его с помощью пакетного менеджера. Выполните следующую команду в командной строке.

 $ apt-cache search hello | grep dbg
 p   hello-dbg            - hello debug symbols

Если ничего не нашлось, вам придется пересобрать пакет, согласно описанию в следующем разделе (или особенно если вы сопровождающий пакета, модифицируйте пакет таким образом, чтобы пакет всегда собирался с отладочными символами). Если вы нашли соответствующий пакет, просто установите соответствующую зависимость -dbg, например с помощью

 # apt-get install hello-dbg

и пропустите процесс пересборки в следующей инструкции и перейдите к запуску gdb.

Пересборка пакета, необходимого для отладки

Вы можете пропустить этот раздел, если имеется возможность установить необходимые пакеты(ы) -dbg с предыдущего раздела.

 $ DEB_BUILD_OPTIONS="nostrip noopt" fakeroot apt-get -b source hello

* Установите свежесобранные пакеты. Здесь могут быть несколько собранных пакетов, поэтому удостоверьтесь, что вы устанавливаете только то, что вам нужно. В данном примере созданный пакет называется hello_2.1.1-4_i386.deb.

 # dpkg -i hello_2.1.1-4_i386.deb

Запуск gdb

Если проблема была обнаружена в системной библиотеке, такой как libc6, xlibs, или libgtk2.0-0, вам необходимо установить соответствующий пакет -dbg (т.е. libc6-dbg в случае с libc6), затем снова запустить проблемную программу из под gdb.

Чаще всего, вы можете получить бэктрейс, где первые несколько строк находятся в malloc() или g_malloc(). Это означает, что ваш бэктрейс не совсем полезен. Наилегкий путь состоит в том, чтобы найти какую-либо полезную информацию, изменив значение переменной MALLOC_CHECK_ на 2. Вы можете выполнить это во время запуска gdb с помощью:

 $ MALLOC_CHECK_=2 gdb hello

Дополнительные команды gdb

Отладка ошибок X (Xorg)

Если программа, написанная на GTK выдала ошибку; т. е. Вы увидели ошибку вида:

The program 'preview1' received an X Window System error.

в этом случае, вы можете попробовать запустить программу с аргументом --sync, и сломать функцию gdk_x_error для того, чтобы получить бэктрейс, вот так:

 (gdb) break gdk_x_error
 (gdb) run --sync

Прочие полезные ссылки

Авторы: Ari Pollak и Loic Minier

--AriPollak and ?LoicMinier

CategoryDebugging