Отладка релизной версии DLL (с ​​файлом PDB) - PullRequest
21 голосов
/ 21 апреля 2009

Если у меня есть DLL (которая была построена в режиме выпуска) и соответствующий файл PDB, возможно ли отладить (пошагово) классы / методы, содержащиеся в этой DLL?

Если это так, каковы необходимые шаги / конфигурация (например, куда поместить файл PDB)?

Edit:

Если файл PDB находится в том же месте, что и DLL (в каталоге bin / debug простого консольного тестового приложения). Я вижу, что символы для DLL загружены (в окне «Вывод», а также в окне «Модули»), но все же я не могу войти в методы этой DLL.

Может ли это быть результатом оптимизации компилятора (как описано Майклом в его ответе)?

Ответы [ 4 ]

13 голосов
/ 21 апреля 2009

pdb обычно (по крайней мере для меня) определяется, если он находится рядом с dll (как в случае с файлами intellisense xml).

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

В точке останова откройте окно «Модули» (Ctrl + D, M- или Отладка-> Windows-> Модули). Щелкните правой кнопкой мыши на вашей dll «Загрузить символы из», «Путь символа» и т. Д.

5 голосов
/ 22 апреля 2009

Я наконец нашел причину отладки DLL, которая была встроена в конфигурацию релиза:

Прежде всего, это в основном работает как ожидалось. Это означает, что, если у меня есть встроенная DLL-библиотека конфигурации релиза и соответствующий файл PDB, я могу отлаживать классы / методы, содержащиеся в этой DLL.

Когда я впервые попробовал это, я, к сожалению, попытался войти в методы класса, который имеет DebuggerStepThroughAttribute , например:

[System.Diagnostics.DebuggerStepThrough]
public class MyClass {
    public void Test() { ... }
}

В этом случае, конечно, невозможно войти в метод из отладчика (как ожидалось / предполагалось).

Так что все работает как задумано. Большое спасибо за ваши ответы.

5 голосов
/ 21 апреля 2009

Да, вы можете отлаживать код выпуска с помощью PDB. Однако при отладке оптимизированного кода есть некоторые подводные камни: больше информации здесь и здесь .

Ваша PDB просто должна быть в таком месте, чтобы отладчик мог ее найти - для локальной отладки тот же каталог, что и dll, обычно проще всего. В противном случае, поместите его в какое-то место, чтобы отладчик мог его найти, и укажите отладчику на это место с символьным путем.

2 голосов
/ 21 апреля 2009

Отладка сборки выпуска обычно намного сложнее, чем отладка отладочной версии. В общем, вам понадобится некоторое понимание ассемблера x86, и вы, вероятно, потратите некоторое время на просмотр окна дизассемблирования. Это, как правило, единственный способ выяснить, на какой строке кода вы действительно находитесь, так как в сборке релиза с оптимизацией компилятора может произойти значительное встраивание и переупорядочение команд. Кроме того, я считаю, что отладчик часто не может правильно сообщить значения переменных. Если вам нужно знать значение переменной и вы не уверены, что отладчик верен, перейдите в окно разборки и найдите место в памяти или зарегистрируйте, в котором оно находится.

Файлы pdb могут храниться на сервере символов. Проверьте Настройка Symbol Server для хорошего учебника. Каждый продукт, который мы собираем на сборочной машине, публикует символы на нашем сервере символов, поэтому мы всегда можем отлаживать любые аварийные дампы, которые мы получаем от WinQual.

...