Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.90.131] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Оказывается, что Visual Studio 2005/2008 (на остальных не проверял) может сама качать символы (необоходимые для текущего дебага) с сайта MS.
Для этого в переменной окружения _NT_SYMBOL_PATH должно стоять: srv*c:\symbols*http://msdl.microsoft.com/download/symbols у меня стоит эта строка, скачивает символы в папку C:\symbols |
Сообщ.
#2
,
|
|
|
Подводные камни:
1) Сначала надо бы скачать с мелкософта бесплатный пакет "Debugging tools for windows" (там порядка 5мб) и установить его. Может работать и без этого, но старые версии, поставляемые с виндами, довольно кривые. 2) После этого вам может показаться, что студия перестала дебажить вообще.Вы нажимаете F5, и... студия зависает. Вы будете в панике переустанавливать студию, но это не поможет, а потом и винду вообще. На самом деле в этот момент она качает символы от библиотек, загружаемых в приложение. В первый раз может занять весьма немало времени, плюс смотри пункт 3. Всегда можно удалить переменную _NT_SYMBOL_PATH и все станет работать как раньше. 3) Студия в силу своей внутренней непонятной мне корявости некоторые символы скачивает КАЖДЫЙ раз когда вы запускаете приложение на дебаг, а потом их почему-то сразу удаляет и сообщает "символы не найдены". Workaround: написать батничек Цитата "C:\Program Files\Debugging Tools for Windows\symchk.exe" /if %1 /s SRV*c:\Symbols*http://msdl.microsoft.com/download/symbols /od И бросать на него по одному файлы, для которых студия не смогла найти символы ("No symbols loaded"). Это загрузит символы "вручную", и в следующий раз студия сразу найдет их и не будет качать. Еще можно написать простенький парсер, который ест то что выдала студия (это можно руками скопипастить в файл) и для всех "плохих" строк вызывает батник. |
Сообщ.
#3
,
|
|
|
Кстати, формат строки
Цитата srv*<папка для хранения символов>*<если надо, сервер откуда их качать> или Цитата symsrv*<длл, делающая всю работу>*<папка для хранения символов>*<если надо, сервер откуда их качать> Как папку можно указать любую пустую папку, которая вам удобна. Как ДЛЛ пока что можно указать только symsrv.dll, причем пути в этом пареметре не принимаются. Как сервер пока что можно указать только http://msdl.microsoft.com/download/symbols Примеры: Цитата srv*c:\symbols*http://msdl.microsoft.com/download/symbols symsrv*symsrv.dll*c:\symbols*http://msdl.microsoft.com/download/symbols symsrv*symsrv.dll*c:\symbols* Последний пример никогда ничего не качает, только берет символы если они уже есть в папке. Я использую именно такой вариант в силу подводных камней 2 и 3 |
Сообщ.
#4
,
|
|
|
а что дают эти символы и для чего они??
|
Сообщ.
#5
,
|
|
|
http://en.wikipedia.org/wiki/Debug_symbol
|
Сообщ.
#6
,
|
|
|
в подавляющем числе случаев они не нужны. помогают только в особо запущенных случаях.
Цитата Символы (symbols) — жаргонное название файлов с отладочной информацией (.pdb и .dbg). Microsoft предоставляет в открытом доступе символы к своим операционным системам и некоторым другим продуктам. Это так называемые public symbols, которые включают информацию об именах и местонахождении в коде глобальных объектов (функций и переменных), а также информацию о структуре стековых фреймов функций (FPO, frame pointer omission). Информации о локальных переменных, устройстве составных типов данных и привязок к исходному коду в public symbols нет. Цитата Во-первых, символы помогают отладчику более корректно раскручивать стек вызовов. Без символов стек часто обрывается вскоре после входа в системный код. С символами почти всегда можно видеть полный стек вплоть до функции WinMain и даже чуть дальше. Полный стек, например, может помочь понять, кто послал сообщение, в обработчике которого всё сломалось. Во-вторых, при наличии символов отладчик показывает настоящие имена функций и глобальных переменных в стеке и в результатах дизассемблирования. Эти имена зачастую осмыслены и помогают понять, где мы находимся и что происходит. В-третьих, некоторые полезные утилиты для своей работы требуют наличиия символов (например, umdh из Debugging Tools for Windows). Бывают и другие применения. |
Сообщ.
#7
,
|
|
|
Цитата Оказывается, что Visual Studio 2005/2008 2003 вроде бы тоже такое умеет, хотя не точно сейчас не проверю |
Сообщ.
#8
,
|
|
|
Отображают имена функций, глобальных переменных и т.п. в системных длл. Нередко при отладке существенно помогает понять что же происходит - особенно когда все падает глубоко внутри системной длл.
|
Сообщ.
#9
,
|
|
|
Цитата в подавляющем числе случаев они не нужны. помогают только в особо запущенных случаях. Ничего себе не нужны) Отладить что-либо windbg без нормальных символов ntoskrnl,hal и т.п. вообще помоему невозможно |
Сообщ.
#10
,
|
|
|
При использовании этой фишки следует помнить, что сама студия будет качать символы исключительно для тех версий dll/exe, которые прямо сейчас стоят на компьютере.
И ежели вам пришлют dump от другой версии винды, с другими сервис-паками, или еще чего, то они вам не только не помогут, но и повредят, ибо дебагер будет ерунду показывать. Решение - делать сервер символов. Для этого используются утилиты из Debugging Tools For Windows (качается нахяляву с microsoft.com). Подробности - у в книжке "Отладка приложений для Windows". |
Сообщ.
#11
,
|
|
|
Где искать эту переменную _NT_SYMBOL_PATH? Команда set в консоли выдает некий список, но в нем _NT_SYMBOL_PATH отсутствует. Я не там смотрю?
|
Сообщ.
#12
,
|
|
|
Спасибо, полезная информация. Немного дополню._NT_SYMBOL_PATH сидит в реестре.
Вот оригинал параметра: [HKEY_CURRENT_USER\Environment] "_NT_SYMBOL_PATH"="srv*c:\\Symbols*http://msdl.microsoft.com/download/symbols" А это измененный параметр, чтобы студия не лезла в инет: [HKEY_CURRENT_USER\Environment] "_NT_SYMBOL_PATH"="srv*symsrv.dll*c:\\Windows\\Symbols*" После замены параметра нужно перезайти в сиситему, чтобы изменения всупили в силу. Допускаю, что параметр вообще можно удалить. |
Сообщ.
#13
,
|
|
|
conalex
вообще-то переменные окружения меняются через Control Panel > System > Advanced tab > Environment Variables. И чтобы их изменения "подхватились" - достаточно перезапустить приложение. |
Сообщ.
#14
,
|
|
|
Да, верно. Насчет простого перезапуска - не уверен.
|
Сообщ.
#15
,
|
|
|
Не уверен - не обгоняй
|