В моей карьере разработчика .net было несколько случаев, когда я хотел отладить чужой код. Код, к которому у меня нет исходников, только DLL. К счастью, Visual Studio позволяет дебажить код без исходинков.
Эта статья основана на вопросе на StackOverflow, где я пытался объяснить поведение Unity-контейнера.
Мое решение использует фичи Resharper.
Давайте начнем с небольшого куска кода:
var cage2 = container.Resolve<ICage>("cage2");
Я хочу отладить метод Resolve
объекта container
. Если у вас есть доступ к исходникам, то вы можете просто найти реализацию метода, поставить там точку остановки:
Но стандартное поведение Visual Studio не дает найти реализацию метода:
Шаг 1
Идем в настройки Resharper и меняем поведение доступа к внешним источника:
Теперь мы можем получить исходники Unity и даже поставить точку остановки:
Выглядит так, будто бы все работает! Но…
Уже второй раз мы видим сообщение о неких Symbol files
. Эти файлы имею различные форматы, но мы будем говорить о PDB
формате как о самом новом. По умолчанию, они генерируются для проектов, которые компилируются в Visual Studio, но в нашем случае у нас есть только DLL
без PDB
.
Без этих файлов Visual Studio не может соотнести исполняемые инструкции и исходный код.
Шаг 2
Давайте сгенерируем PDB-файлы по существующей сборке DLL.
- Открываем Assmbly Explorer от Resharper
- Добавляем
Unity.dll
- Генерируем PDB
Теперь у нас есть PDB-файл для нашей DLL.
Шаг 3
Конфигурируем Visual Studio для отладки внешних источников.
Две опции:
- Отключаем
Enable just my code
что бы дебаггер мог взаимодействовать с внешними исходниками. - Включаем
Suppress JIT optimization on module load (Managed only)
. Это важная опция, без нее вы получите непредсказуемые прыжки по исходному коду.
Это все! 3 простых шага, и мы можем отладить стороннюю DLL сборку без доступа к исходникам:
Точки остановки работают, Step into
, Step over
так же. Полный стек вызова.