Есть ли способ получить доступ к символам отладки во время выполнения? - PullRequest
3 голосов
/ 22 сентября 2010

Вот пример кода, чтобы дать представление о том, что я хочу.

int regular_function(void)
{
     int x,y,z;
     /** do some stuff **/
     my_api_call();
     return x;
}
...
void my_api_call(void)
{
    char* caller = get_caller_file();
    int line = get_caller_line();
    printf("I was called from %s:%d\n", caller, line);
}

Есть ли способ реализовать get_caller_file() и get_caller_line()? Я видел / использовал трюки типа #define ing my_api_call как вызов функции, передаваемый в макросах __FILE__ и __LINE__. Мне было интересно, есть ли способ получить доступ к этой информации (при условии, что она присутствует) во время выполнения вместо компиляции? Разве что-то вроде Вальгринда не должно делать что-то подобное, чтобы получить возвращаемую информацию?

Ответы [ 3 ]

5 голосов
/ 22 сентября 2010

Если вы скомпилировали свой двоичный файл с символами отладки, вы можете получить к нему доступ с помощью специальных библиотек, например libdwarf для формата отладки DWARF.

1 голос
/ 22 сентября 2010

Это сильно зависит от окружающей среды. В большинстве реализаций Windows и Linux, где предоставляются символы отладки, поставщик инструмента предоставляет или документирует способ сделать это. Для лучшего ответа предоставьте особенности реализации.

0 голосов
/ 22 сентября 2010

Символы отладки, если они доступны, должны где-то храниться, чтобы отладчик мог их найти.Они могут храниться или не храниться в самом исполняемом файле.

Вы можете знать или не знать имя исполняемого файла (argv[0] не обязательно иметь полный путь к имени программы или действительно иметь любая полезная информация в нем - подробности см. здесь ).

Даже если бы вы могли найти символы отладки, вам пришлось бы декодировать их, чтобы попытаться выяснить, гдеВам позвонили.

И ваш код может быть оптимизирован до такой степени, что информация становится бесполезной.

Это длинный ответ.Краткий ответ: вы, вероятно, должны полагаться на передачу __FILE__ и __LINE__, как раньше.Это гораздо более портативный и надежный.

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