Можно ли вызывать встроенные функции в GDB и / или генерировать их с помощью GCC?

Все мы знаем, что встроенные функции могут усложнить отладку, поскольку они могут быть исключены из трассировки стека и т. Д. Но предположим, что я хочу вызвать встроенную функцию изнутри GDB, и я знаю ее имя и аргументы. Я думаю, что я должен быть в состоянии сделать это, но я получаю это:

Cannot evaluate function -- may be inlined

я использовал nm перечислить символы в общей библиотеке, которую я использую, и обнаружил, что функций, которые я хочу вызвать, там нет. Не большой сюрприз. То, что я хотел бы, это способ генерировать видимые определения этих встроенных функций. У меня есть доступ к файлам заголовков, которые в настоящее время содержат встроенные определения, но я не могу изменить эти заголовки. Возможно, есть какой-то способ сказать компилятору выдавать определения всех встроенных функций, которые он видит в модуле перевода? Или какой-то другой прием, который может облегчить вызов и проверку результатов встроенных функций в GDB?

Я использую GCC 4.7.2 и GDB 7.5.1 в Linux. И я не могу действительно переключиться на неоптимизированную сборку, потому что я отлаживаю дампы ядра с производства (в процессе разработки я бы просто отключил оптимизацию, тогда все стало бы проще).

4

Решение

Один из способов заставить компилятор сгенерировать вызываемую версию встроенной функции — включить код, который принимает адрес функции. Существует также вариант, который вы можете дать gcc, От документация gcc по встроенным функциям :

Когда функция является как встроенной, так и статической, если все вызовы этой функции
встроенный в вызывающую систему, и адрес функции никогда не используется, тогда
На собственный ассемблерный код функции никогда не ссылаются. В этом случае GCC не
фактически выводит код ассемблера для функции, если вы не укажете опцию
-fkeep-рядные функции.

5

Другие решения

Сборка вашего проекта с опцией 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. Вместо этого он отображает аргументы и локальные переменные встроенных функций как локальные переменные в вызывающей стороне.

Также см 3.9. Варианты отладки вашей программы или GCC

1

По вопросам рекламы [email protected]