Прочитать информацию об отладке во время выполнения из приложения

У меня есть некоторые вопросы относительно отладки символов и что с ними можно сделать, кроме того, хорошо, отладка. Меня больше интересуют ответы на GCC, но я также был бы рад узнать, как это выглядит в отношении других компиляторов, включая MSVC.

Прежде всего:

  • Каковы общие форматы / типы отладочных символов?
  • Как они относятся к компиляторам и платформам? Всегда ли это один и тот же формат в GCC и MinGW среди платформ?
  • Могу ли я проверить время выполнения, есть ли у них assembly и в каком формате они находятся?

И еще некоторые практические вопросы … Как я могу :

  • Проверить текущий номер файла и номер строки?
  • Получить (квалифицированное) имя функции, выполняемой?
  • Получить полную текущую трассировку стека?

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

Может быть, есть библиотека, которая может разбирать отладочные символы и получать такую ​​информацию?

Являются ли отладочные символы стандартизованными настолько хорошо, что я могу ожидать некоторую степень мобильности для таких решений?

Каковы общие форматы / типы отладочных символов?

DWARF и STABS (встроенные внутри исполняемого файла, в специальных разделах), База данных программ (PDB; внешний файл, используемый MSVC).

Как они относятся к компиляторам и платформам? Всегда ли это один и тот же формат в GCC и MinGW среди платформ?

GCC использует DWARF / STABS (я думаю, что это опция времени компиляции GCC) как на Linux (ELF), так и на Windows (PE), не знаю о других. MSVC всегда использует PDB.

Могу ли я проверить время выполнения, есть ли у них assembly и в каком формате они находятся?

Вы можете проанализировать исполняемое изображение и посмотреть, есть ли разделы с информацией об отладке (см. Документацию STABS и спецификации DWARF ). Файлы PDB распространяются либо с исполняемыми файлами, либо через серверы символов (поэтому, если вы не хотите подключаться к сети, проверьте, есть ли X.pdb для X.exe / X.dll).

О том, как читать и использовать эти символы – я не знаю о DWARF / STABS (возможно, что-то вокруг GNU binutils может найти и извлечь их), но для PDB лучше всего использовать dbghelp – его использование довольно хорошо документировано и есть множество примеров, доступных в сети. Существует также DIA SDK, который можно использовать для запроса файлов PDB.

Являются ли отладочные символы стандартизованными настолько хорошо, что я могу ожидать некоторую степень мобильности для таких решений?

DWARF имеет официальную спецификацию, и это сложно, как черт. PDB AFAIK не документирован, но dbghelp / DIA являются и являются рекомендуемым способом.