Все мы знаем, что встроенные функции могут усложнить отладку, поскольку они могут быть исключены из трассировки стека и т. Д. Но предположим, что я хочу вызвать встроенную функцию изнутри GDB, и я знаю ее имя и аргументы. Я думаю, что я должен быть в состоянии сделать это, но я получаю это:
Cannot evaluate function -- may be inlined
я использовал nm
перечислить символы в общей библиотеке, которую я использую, и обнаружил, что функций, которые я хочу вызвать, там нет. Не большой сюрприз. То, что я хотел бы, это способ генерировать видимые определения этих встроенных функций. У меня есть доступ к файлам заголовков, которые в настоящее время содержат встроенные определения, но я не могу изменить эти заголовки. Возможно, есть какой-то способ сказать компилятору выдавать определения всех встроенных функций, которые он видит в модуле перевода? Или какой-то другой прием, который может облегчить вызов и проверку результатов встроенных функций в GDB?
Я использую GCC 4.7.2 и GDB 7.5.1 в Linux. И я не могу действительно переключиться на неоптимизированную сборку, потому что я отлаживаю дампы ядра с производства (в процессе разработки я бы просто отключил оптимизацию, тогда все стало бы проще).
Один из способов заставить компилятор сгенерировать вызываемую версию встроенной функции — включить код, который принимает адрес функции. Существует также вариант, который вы можете дать gcc
, От документация gcc по встроенным функциям :
Когда функция является как встроенной, так и статической, если все вызовы этой функции
встроенный в вызывающую систему, и адрес функции никогда не используется, тогда
На собственный ассемблерный код функции никогда не ссылаются. В этом случае GCC не
фактически выводит код ассемблера для функции, если вы не укажете опцию
-fkeep-рядные функции.
Сборка вашего проекта с опцией GCC -gdwarf-2
может быть полезным в этой ситуации.
В соответствии с 11.1 Встроенные функции в документации GDB:
Чтобы gdb поддерживал встроенные функции, компилятор должен записывать информацию о встраивании в отладочную информацию — это делает gcc с использованием формата dwarf 2, а также некоторые другие компиляторы. gdb поддерживает только встроенные функции при использовании dwarf 2. Версии gcc до 4.1 не генерируют два обязательных атрибута (‘DW_AT_call_file’ и ‘DW_AT_call_line’); GDB не отображает встроенные вызовы функций с более ранними версиями GCC. Вместо этого он отображает аргументы и локальные переменные встроенных функций как локальные переменные в вызывающей стороне.