Отладка сторонней библиотеки DLL в Visual Studio?

Я использую стороннюю DLL. Для некоторых частных случаев функция в DLL бросает исключение. Можно ли отлаживать DLL в Visual Studio?

После ответа от Andrew Rollings, я могу просмотреть код, но есть ли простой способ отладки кода в Visual Studio?

8 ответов

Если DLL находится в .NET, вы можете декомпилировать ее с помощью инструмента, такого как .NET Reflector и затем отлаживать исходный код.

Или вы можете спросить поставщика, доступен ли исходный код. Это, наверное, самый простой способ.


На основе ответа Andrew вы просто рассматриваете декомпилированный исходный код как новую библиотеку в своем проекте и устанавливаете точки останова в источнике. Удалите все ссылки на стороннюю DLL, чтобы он выполнял декомпилированный код.

Другие вещи:

  • Вы можете нарушить закон, декомпилировав код или нарушив лицензионное соглашение с сторонним поставщиком. Обязательно просмотрите это с кем-то.
  • Вам нужно будет убедиться, что вы удалите ссылки на вашу декомпилированную версию, если вы отправляете другим разработчикам или проверяете большее дерево исходных кодов. Легко забыть об этом!


Что-то, что сработало для меня с отладкой нескольких сторонних библиотек, а также .NET - WinDbg. Это отвратительный отладчик от Microsoft, который я использовал для устранения некоторых проблемных проблем, которые происходят глубоко внутри фреймворка.

Вам нужно использовать расширения Son of Strike (SOS), если это управляемая DLL. Он также может отлаживать родной. Вам нужно будет немного узнать о вызовах и сборке /инструкции CIL, чтобы использовать его. Вы должны уметь определять исключение и причинять его. Мы использовали WinDbg/SOS, чтобы найти, например, что в HttpWebResponse, если вы используете сжатие Gzip для загрузки страницы, а сервер возвращает плохой заголовок Gzip,.NET запускает декомпрессию в threadpool, и авария выведет ваш процесс. Счастливая отладка.


Есть два метода, с которыми я столкнулся:

1) Доступ к проекту DLL из проекта. Это связано с созданием библиотеки DLL в отдельном экземпляре Visual Studio и последующим доступом к DLL через другой проект в Visual Studio (предполагается, что у вас есть исходный код). Существует несколько способов сделать это:

  • Вы можете добавить Trace.WriteLine заявления в DLL, которые будут показывать в окне "Выход" в Visual Studio.
  • Вы можете добавить операторы System.Diagnostics.Debugger.Break() в DLL-код. когда запуск вызывающего проекта в Visual Studio, выполнение программы прекратится. Отсюда вы можете добавить доступ к стек вызовов (включая все функции вызовы в самой DLL) и установить разрывы (хотя значок для точка останова будет отключена и текст наведения для разрыва точка будет читать "Точка останова будет в настоящее время не пострадали. Нет символов были загружены для этого документа ").
  • Если DLL выбрасывает исключение (что вы можете видеть из окно "Выход", если исключение попадает и обрабатывается DLL) вы можете сказать, что Visual Studio всегда прерывается, когда генерируется этот тип исключения. Нажмите Ctrl + Alt + E, найдите тип исключение выбрано, и нажмите столбец "Бросок" для этого исключение. Отсюда он точно как будто вы использовали System.Diagnostics.Debugger.Break() (см. выше).

2) Присоединение процесса использования к проекту DLL. Это связано с подключением отладчика Visual Studio к выполняемому процессу.

  • Откройте DLL-проект в Visual Studio.
  • Запустить приложение, использующее DLL (это приложение не может быть запущено из другой экземпляр Visual Studio, поскольку процесс уже будет иметь отладчик прилагается к нему).
  • Здесь вы можете добавить точки останова и пройти DLL-код, загруженный в Visual Studio (хотя точка останова будет отключена так же, как в методе 1).


Как сказал Цезарь Рейес в вопросе о переполнении стека Visual Studio - добавьте исходный код в ссылку, ReSharper 5 (и позже) имеет эту возможность.


Я думал, что .NET Reflector получил несколько отладочных плагинов. Это было бы гораздо лучше, потому что декомпиляция и повторная компиляция кода вообще не выполняются, и вам нужно сделать так много изменений в коде, чтобы исправить это.

Попробуйте отладчик .NET Reflector попробовать. Это может помочь вам.


Еще один вариант, который мы должны упомянуть здесь, - dotPeek 1.2 (бесплатный декомпилятор от создателей ReSharper). Вот хороший пост, описывающий, как настроить VS-сервер символов и dotPeek 1.2 для отладки декомпилированного кода из VisualStudio: http://blog.jetbrains.com/dotnet/2014/04/09/introducing-dotpeek-1-2-early-access-program


.NET Reflector 6 поставляется с добавлением Visual Studio, который позволяет использовать пошаговую отладку Visual Studio на сборках, для которых у вас нет исходного кода.

Взгляните на это сообщение в блоге:

http://www.simple-talk.com/community/blogs/alex/archive/2009/09/22/74919.aspx для более подробной информации.

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

Скачать здесь: http://www.red-gate.com/MessageBoard/viewforum.php?f=109

licensed under cc by-sa 3.0 with attribution.