Если вы не уверены, является ли ваш двоичный файл статически связанным, вы можете проверить его с помощью 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, чтобы исправить проблему.