Переход в Emacs GDB - PullRequest
       29

Переход в Emacs GDB

3 голосов
/ 18 мая 2010

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

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

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 ?? ()

1 Ответ

1 голос
/ 30 сентября 2010

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

% ldd ffmpeg
        not a dynamic executable

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

Скорее всего, вы загружаете не тот двоичный файл. Даже без с использованием --disable-stripping и --disable-optimizations я могу использовать gdb fine, используя команды 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, чтобы исправить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...