Как сопоставить имя функции и номер строки по адресу памяти на языке Си? - PullRequest
2 голосов
/ 13 февраля 2011

как вы можете отобразить обратно имя функции и номер строки с адресом памяти в GCC?

, т. Е. При условии прототипа на языке C:

void func() {
  // Get the address of caller , maybe this could be avoided
  MemoryAddress = get_call_address();

  // Which line from source code is executing , which calls func()
  LineNumber = get_lineno_from_symbol ( &MemoryAddress );

  // Grab the name who calls func()
  FunctionName = get_func_from_symbol ( &MemoryAddress );
}

Итак, есть ли уже существующие API-интерфейсы?GCC или что-то еще, что может удовлетворить мои требования?

Большое спасибо за любой ответ; -P

Ответы [ 2 ]

5 голосов
/ 13 февраля 2011

Если вы включите заголовок

#include <execinfo.h>

, тогда вы можете использовать функцию backtrace() для определения адреса вызывающей линии и backtrace_symbols() чтобы получить имена функций.Однако это не даст вам номера строк (хотя может дать достаточно информации, чтобы помочь с отладкой, если это то, что вам нужно).

Если вам абсолютно нужны номера строк, то вам нужно:

  • Убедитесь, что ваша программа (и все ее библиотеки) скомпилированы с включенной отладкой (-g flag to gcc)
  • Используйте программу addr2line для перевода адресов (полученных из backtrace()) в ссылки на номера файлов / строк.Вы можете вызвать это из вашей программы, например, используя system().Он отправит вывод в stdout, но вы можете использовать перенаправление или канал для захвата вывода, если требуется.
0 голосов
/ 13 февраля 2011

С помощью gcc вы можете сделать это, используя функциональность backtrace .

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