Как отладчики отслеживают соответствие между кодом C и инструкциями по сборке? - PullRequest
5 голосов
/ 14 мая 2019

Мне было интересно, как отладчики могут шаг за шагом проходить через исходный код.

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

Например, если я установил точку останова на одной строке в моем исходном файле, как он узнает, на какой инструкции уровня машины остановиться?

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

Посмотрите на вывод asm из gcc -g -S, и вы увидите .line директивы debug-info и т. Д. Для блока asm, соответствующего исходной строке C.

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

https://godbolt.org/ использует ту же отладочную информацию, что и отладчики, но использует ее для выделения цвета, чтобы сопоставить исходные строки с asm.


Когда ассемблер собирает эти директивы .line, он создает отладочную информацию в объектном файле .o, который в конечном итоге связывается с исполняемым файлом или библиотекой. Или разделить на отдельный файл символов отладки. Или раздели.

Именно эту информацию отладки читают отладчики.

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

2 голосов
/ 14 мая 2019

Компилятор и компоновщик могут создавать так называемые символы отладки, которые содержат эту информацию.Отладочная информация содержит исходный файл / отображение строки на адрес, адреса глобальных переменных и начальные адреса всех функций и смещения их локальных переменных в стеке.В случае gcc это делает опция компилятора -g.Информация об отладочных символах может быть встроена в исполняемую программу, как обычно в случае с gcc или в отдельных файлов символов (файлы .pdb с msvc).

...