Для чего нужны общедоступные серверы символов Microsoft? - PullRequest
4 голосов
/ 06 мая 2009

До сих пор я всегда использовал исходный код ASP.NET MVC для отладки ASP.NET MVC. На моем ноутбуке я только что попробовал другой подход, а именно: вызвать окно «Модули» в VS, пока я отлаживаю и щелкаю правой кнопкой мыши System.Web.Mvc, затем выбираю «Загрузить символы из»> «Серверы Microsoft Symbol».

VS, похоже, действительно что-то загружает, так как файл символов для сборки System.Web.Mvc был зарегистрирован как загруженный. Кроме того, все строки, принадлежащие System.Web.Mvc в моем стеке вызовов, изменили цвет с серого на черный. Тем не менее, я все еще получаю сообщение об ошибке «Исходный код недоступен» при попытке войти в код, принадлежащий System.Web.Mvc.

Итак, я загрузил символы, но до сих пор нет исходного кода. Не большая проблема, так как я все еще могу отладить его по-старому. Но мне интересно, для чего нужны серверы Microsoft Symbol?

Ответы [ 3 ]

4 голосов
/ 06 мая 2009

Они заставляют трассировки стека работать должным образом для собственных DLL - без символов, ваши трассировки стека часто доходят до ближайшей Windows DLL и затем останавливаются. С символами они продолжаются через библиотеки Winodws. Вы можете видеть имена функций, но не исходный код (очевидно).

Отладка нативной программы Windows, вы часто получаете трассировки стека, как это:

  mydll.dll
  mydll.dll
  some_windows_dll.dll
  some_windows_dll.dll
  some_other_windows_dll.dll
  some_other_windows_dll.dll
  myexe.exe
  myexe.exe

Без символов для DLL-библиотек Windows вы обнаружите, что стек только достигает этого:

  mydll.dll
  mydll.dll
  some_windows_dll.dll

и вы не видите весь путь назад к началу.

2 голосов
/ 06 мая 2009

По моему опыту серверы символов полезны для как управляемой, так и неуправляемой отладки, поскольку они предоставляют столь необходимые детали. Другие уже рассказывали, почему это важно для нативного кода, поэтому я остановлюсь на управляемом коде.

Я довольно много отлаживаю управляемый код с помощью WinDbg + Sos, и мне нужно регулярно копаться в нативной части. Помните, что для ОС управляемое приложение ничем не отличается от неуправляемого приложения. В конце концов, управляемое приложение собирается вызывать библиотеки Win32. Чтобы осмотреть тех, кому нужны правильные символы.

например. если вам нужно узнать подробности о конкретном управляемом вызове, вам действительно нужно взглянуть на нативный код. Одним из примеров может быть случай, когда вы видите Monitor.Enter в вашем управляемом стеке. На самом деле вы не можете определить, просматривая вызов самостоятельно, был ли вызов только что выполнен или поток действительно ожидает (*). Выгрузив собственный стек вызовов, вы можете узнать, был ли выполнен вызов WaitForMultipleObjects.

(*) Флаги состояния команды !threads помогут вам в этом, но если вам нужны подробности, дамп собственного стека все еще очень полезен.

1 голос
/ 06 мая 2009

Я не нашел сервер символов полезным для управляемых библиотек DLL - вы по-прежнему получаете трассировки управляемого стека без них. Я думаю, что основным значением в управляемых символах является информация о номере строки, но что вы собираетесь с этим делать?

Однако я не мог жить без символов для отладки нативного кода. И исходный сервер действительно очень полезен.

...