Получение номера строки из pdb в режиме релиза - PullRequest
7 голосов
/ 01 июня 2009

Возможно ли отладчику (или обработчику исключений CLR) показать строку, где произошло исключение в режиме Release с использованием pdb?

Код в режиме выпуска оптимизирован и не всегда соответствует порядку и логике «оригинального» кода.

Также удивительно, что отладчик может перемещаться по моему коду шаг за шагом, даже в режиме Release. Оптимизация должна сделать навигацию очень неудобной.

Не могли бы вы уточнить эти два момента для меня?

Ответы [ 4 ]

10 голосов
/ 01 июня 2009

Я не настолько знаком с тем, как это делается с CLR, но, вероятно, это очень похоже на то, как это делается с нативным кодом. Когда компилятор генерирует машинные инструкции, он добавляет записи в pdb, которые в основном говорят: «Инструкция по текущему адресу X пришла из строки 25 в foo.cpp».

Отладчик знает, какой адрес программы выполняется в данный момент. Поэтому он ищет какой-то адрес X в pdb и видит, что он пришел из строки 25 в foo.cpp. Используя это, он может «пошагово» пройти по вашему исходному коду.

Этот процесс одинаков независимо от режима отладки или выпуска (при условии, что pdb вообще генерируется в режиме выпуска). Вы правы, однако, что часто в режиме выпуска из-за оптимизаций отладчик не будет проходить «линейно» через код. Это может неожиданно перескочить на разные строки. Это происходит из-за того, что оптимизатор меняет порядок команд, но не меняет сопоставление адреса с исходной строкой, поэтому отладчик по-прежнему может следовать ему.

1 голос
/ 01 июня 2009

[@ Not Sure] это почти правильно. компилятор делает все возможное для определения подходящего номера строки, который точно соответствует текущей инструкции машинного кода.

PDB и отладчик ничего не знают об оптимизации; файл PDB, по существу, отображает адреса в машинном коде в номера строк исходного кода. В оптимизированном коде не всегда возможно точно сопоставить инструкцию по сборке с конкретной строкой исходного кода, поэтому компилятор запишет в PDB самую близкую вещь, которую он имеет под рукой. Это может быть «строка исходного кода раньше» или «строка исходного кода окружающего контекста (цикл и т. Д.)» Или что-то еще.

Несмотря на это, отладчик, по сути, находит запись в карте PDB, ближайшую (как в «до или равно») к текущему IP (указатель инструкции), и выделяет эту строку.

Иногда совпадение не очень хорошее, и именно тогда вы видите подсвеченную область, прыгающую повсюду.

0 голосов
/ 01 июня 2009
0 голосов
/ 01 июня 2009

Отладчик делает предположение о том, где возникла проблема. Он не гарантирует 100% точности, а с полностью оптимизированным кодом он часто будет неточным - я обнаружил, что неточности варьируются от нескольких строк до совершенно неправильного стека вызовов.

Насколько точен отладчик с оптимизированным кодом, действительно зависит от самого кода и того, какие оптимизации вы делаете.

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