Не найдены символы отладки при использовании gdb
GNU gdb Fedora (6.8-37.el5)
Kernal 2.6.18-164.el5
Я пытаюсь отладить мое приложение. Однако каждый раз, когда я передаю двоичный файл в gdb, он говорит:
(no debugging symbols found)
Вот файл вывода двоичного файла, и, как вы можете видеть, он не лишен:
vid: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
Я компилирую со следующими CFLAGS:
CFLAGS = -Wall -Wextra -ggdb -O0 -Wunreachable-code
Может ли кто-нибудь сказать мне, если я пропустил простую здесь?
Большое спасибо заранее,
Ответы
Ответ 1
В некоторых дистрибутивах Linux не используются символы отладки стиля gdb
. (IIRC предпочитают dwarf2
.)
В общем случае gcc
и gdb
будут синхронизироваться относительно того, какие символы отладки они используют, а форсирование определенного стиля просто вызовет проблемы; если вы не знаете, что вам нужно что-то еще, используйте только -g
.
Ответ 2
Самая частая причина отсутствия "отладочных символов", когда присутствует -g
, состоит в том, что в строке ссылки есть какой-то "блуждающий" аргумент -s
или -s
.
От man ld
:
-s
--strip-all
Omit all symbol information from the output file.
-S
--strip-debug
Omit debugger symbol information (but not all symbols) from the output file.
Ответ 3
Приложение должно быть скомпилировано и связано с опцией -g
. То есть вам нужно поставить -g
в CPPFLAGS и LDFLAGS.
Ответ 4
Вы также должны попробовать -ggdb вместо -g, если вы компилируете для Android!
Ответ 5
Замените -ggdb на -g и убедитесь, что вы не разделяете двоичный файл с помощью команды strip.
Ответ 6
Я знаю, что на это был дан ответ давным-давно, но я недавно потратил часы, пытаясь решить подобную проблему. Настройка - это локальный ПК под управлением Debian 8 с использованием Eclipse CDT Neon.2, удаленной платы ARM7 (Olimex), работающей под управлением Debian 7. Цепь инструментов - Linaro 4.9 с использованием gdbserver на удаленной плате и Linaro GDB на локальном ПК. Моя проблема заключалась в том, что сеанс отладки начнется, и программа выполнит, но точки останова не сработают, и при ручном приостановлении "источник не может быть найден". Мои параметры линии компиляции (Linaro gcc) включали -ggdb -O0, как многие из них предлагали, но все же та же проблема. В конечном итоге я попробовал использовать gdb на удаленной плате, и он не жаловался на отсутствие символов. Любопытным было то, что "файл" сообщал об отладке, не лишенном целевого исполняемого файла.
В конечном итоге я решил проблему, добавив -g в параметры компоновщика. Я не буду настаивать на том, чтобы понять, почему это помогло, но я хотел передать это другим, на случай, если это поможет. В этом случае Linux действительно нуждался в -g в параметрах компоновщика.