Переход в Emacs GDB

У меня возникли проблемы с переходом в GDB. Я создал пример программы из библиотеки ffmpeg с включенными и удаленными символами отладки. Хотя я настроил библиотеку ffmpeg на статическую и явно отключил общий доступ, похоже, что программа, которую я отлаживаю, компонуется динамически, поскольку размер ее файла составляет всего 99 КБ. Я не знаю, что это проблема, но подумал упомянуть об этом.

После того, как я установил и нажал точку останова в av_seek_frame, я использую команду «Далее», чтобы перейти. Однако это входит в первую функцию в av_seek_frame(), как вы можете видеть ниже. Кроме того, если сделать второй «далее», обратная трассировка теряет отслеживание того, где она находится. Я неправильно настроил? Как я могу перешагнуть? Я должен отметить, что я дважды проверил, что «установить пошаговый режим выключен» по умолчанию (поскольку я полагаю, что это сломается на первом фрагменте кода без отладочной информации.)

Breakpoint 1, av_seek_frame (s=0x16429000, stream_index=0, timestamp=29727438, flags=0) at l
(gdb) list
1648
1649        return 0;
1650    }
1651
1652    int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags
1653    {
1654        int ret;
1655        AVStream *st;
1656
1657        ff_read_frame_flush(s);
(gdb) next
ff_read_frame_flush (s=0x16429000) at libavformat/utils.c:1248
(gdb) list
1243
1244    /**
1245     * Flush the frame reader.
1246     **/
1247    void ff_read_frame_flush(AVFormatContext *s)
1248    {
1249        AVStream *st;
1250        int i, j;
1251
1252        flush_packet_queue(s);
(gdb) next
ff_read_frame_flush (s=0x16429000) at libavformat/utils.c:1252
(gdb) where
#0  ff_read_frame_flush (s=0x16429000) at libavformat/utils.c:1252
#1  0x00000000 in ?? ()

person Michael Chinen    schedule 18.05.2010    source источник
comment
Вы строили с -fomit-frame-pointer?   -  person Nikolai Fetissov    schedule 18.05.2010
comment
Я так не думаю, но это возможно, поскольку мне не очень удобно работать с настройками в стиле Unix. Мои параметры конфигурации (которые создают как библиотеки ffmpeg, так и образец ffplay, который я отлаживаю:) ./configure --enable-libmp3lame --enable-static --enable-pthreads --enable-ffplay --disable-shared -- отключить-оптимизации --disable-mmx --disable-stripping --enable-debug   -  person Michael Chinen    schedule 18.05.2010
comment
Попробуйте проверить show step-mode — я не использую emacs, поэтому не уверен, какие у него настройки по умолчанию.   -  person Nikolai Fetissov    schedule 18.05.2010
comment
Спасибо за предложение, но я проверил, что он уже выключен, а также попытался отключить пошаговый режим. Я запустил show step-mode, и он говорит (gdb) show step-mode Режим пошаговой операции выключен. Насколько я понимаю, это должно быть выключено для того, что я хочу сделать.   -  person Michael Chinen    schedule 18.05.2010
comment
Вы уверены, что ваш двоичный файл и исходный код синхронизированы?   -  person Nikolai Fetissov    schedule 19.05.2010
comment
это было так, спасибо. Я перестраивал, используя только «make». выполнение «сделать чистым», а затем «сделать» снова все исправило. Если вы хотите опубликовать ответ, я приму его.   -  person Michael Chinen    schedule 19.05.2010


Ответы (1)


Если вы не уверены, является ли ваш двоичный файл статическим или нет, вы можете проверить это с помощью ldd и увидеть сообщение, подобное этому:

% ldd ffmpeg
        not a dynamic executable

Затем убедитесь, что вы указали gdb полный путь к исполняемому файлу, чтобы вы случайно не подобрали двоичный файл, установленный в другом месте в системе, который оказался в вашем PATH.

Скорее всего вы загружаете не тот бинарник. Даже без использования --disable-stripping и --disable-optimizations я могу нормально использовать gdb, используя команды step и next. Вам не нужно использовать --disable-stripping, потому что внутри gdb вы можете использовать двоичный файл ffmpeg_g (или, если вам случится запустить двоичный файл ffmpeg, вы можете загрузить символы из него, используя file ffmpeg_g).

В целях отладки хорошо использовать --disable-optimizations, чтобы вы не получали value optimized out при проверке переменных, но, строго говоря, вам не нужно использовать параметр, чтобы заставить emacs/gdb вести себя... У меня есть никаких проблем с пошаговым выполнением кода при использовании оптимизаций.

Однако при установке точек останова с помощью gud/gdb внутри Emacs следует помнить одну вещь, которая может привести к путанице: команда gud-break использует только базовую часть имени файла для установки точек останова, а не абсолютный путь к нему, который в случае ffmpeg означает, что если, например, вы установите точку останова в utils.c, она может работать неправильно в зависимости от значения путей поиска исходного кода, которые вы установили в gdb, потому что ffmpeg имеет несколько файлов с именами utils.c по разным путям (на самом деле всего 5 файлов utils.c, по одному в каждом из подкаталогов lib*). По умолчанию путь поиска установлен в $cdir:$cwd, но если вы установили что-то вроде /path/to/ffmpeg:$cdir:$cwd и пытаетесь установить точку останова в utils.c libavformat, он может найти его в libavutil - и в этом случае, если вам повезет, он будет жаловаться, что строка, в которой вы хотите установить точку останова, не существует (потому что строка в libavutil короче), или может установить точку останова на строку, которую вы хотите, но не в том utils.c.

Эту проблему с gud/gdb следует считать ошибкой. Когда у меня будет минутка, я отправлю патч для gud-break/gud-format-command, чтобы исправить проблему.

person aculich    schedule 30.09.2010