Отладка файлов .dmp из WinDbg в Visual Studio 2008 для управляемых приложений .Net - PullRequest
3 голосов
/ 15 ноября 2010

Я пытаюсь найти способ создания аварийного дампа управляемого исполняемого файла .Net, а затем открыть полученный файл .dmp в Visual Studio 2008. Я хочу увидеть, где в исходном коде генерируется исключение, стек вызовови значение переменных в функциях в стеке.

Чтобы упростить задачу, я написал мини-приложение, которое вылетает:

...

class Program
{
    static void Main(string[] args)
    {

        int a = 2;           //Variable I want to see value for when debugging

        if (!File.Exists(@"C:\Crasher\bin\Debug\file.txt")) //Doesn't exist
            throw new FileNotFoundException();     //Unhandled exception thrown
    }
}

...

Я сделал сборку DEBUG и запустил ее из-за пределов Visual Studio.В windbg я нажал «Присоединить к процессу» и выбрал свое приложение.Затем я набрал в окне команды windbg:

          .dump /ma C:\crasher\bin\debug\dump.dmp

Затем я открыл файл .dmp в Visual Studio.Я пошел в Инструменты-> Параметры-> Отладка-> Символы и добавил следующее:

          http://msdl.microsoft.com/download/symbols  (saved to local folder)

Это дает мне символы для всех библиотек DLL, перечисленных в окне модулей (например, Kernel32.dll, gdi32.dll).- Я думаю, что все они в списке являются родными) за исключением mscorlib.ni.dll.Microsoft Symbol Server дает мне сборки символов и .pdbs для mscorlib.dll, но НЕ mscorlib.ni.dll.

Когда я пытаюсь загрузить .pdb для самого .exe, он говорит, что он не совпадаетприложение.Я думаю, это потому, что .exe управляется, и у нас пока нет символов для всего нативного кода под ним - то есть, если бы я мог получить сборку символов и pdb для mscorlib.ni.dll, это сработало бы.

Правильно ли это рассуждение?Я что-то пропустил?

В любом случае, почему mscorlib.ni.dll недоступен на сервере Microsoft Symbol Server, где я могу получить информацию о символах и есть ли что-то еще, что я должен знать для отладки управляемого кода через сбой?дампы в Visual Studio.

Большое спасибо - любая помощь будет оценена.

Фил Уиттингтон

1 Ответ

2 голосов
/ 15 ноября 2010

Как говорит Джейсон Эванс в своем комментарии, это не поддерживается в VS2008, но вы можете сделать это в WinDbg.

Самый простой способ получить правильный дамп для сбоя, подобного этому, - это использовать adplus (который включен в Инструменты отладки для Windows).Существуют различные варианты, но чтобы получить аварийный дамп на основе имени процесса, вы можете сделать

>adplus -crash -o c:\dumpdirectory -pn app.exe

. Это даст вам два дампа.Один для первого случайного исключения и один для второго.В этом случае они будут практически идентичны, но для более реалистичного сценария дамп исключений первого шанса покажет вам состояние приложения, когда было сгенерировано исключение (т.е. до того, как произойдет любая обработка исключения).Дамп исключения второго шанса покажет вам состояние необработанного исключения.

Чтобы получить исключение, откройте аварийный дамп и загрузите SOS, набрав .loadby sos mscorwks.

Затем используйте команду !pe, чтобы напечатать исключение в текущем потоке (который будетнеисправная нить в этом случае).Это будет выглядеть примерно так:

0:000> !pe
Exception object: 024a5114
Exception type: System.IO.FileNotFoundException
Message: Unable to find the specified file.
InnerException: <none>
StackTrace (generated):
    SP       IP       Function
    0020F0F0 005100D6 TestBench!TestBench.Program.Main()+0x66

StackTraceString: <none>
HResult: 80070002

Чтобы перечислить локальную переменную a, используйте !clrstack -l, но имейте в виду, что локальные версии редко доступны в сборках режима выпуска из-за оптимизаций.

0:000> !clrstack -l
OS Thread Id: 0x1a50 (0)
ESP       EIP     
0020f04c 7571b727 [HelperMethodFrame: 0020f04c] 
0020f0f0 005100d6 TestBench.Program.Main()
    LOCALS:
        0x0020f0fc = 0x00000002  <--- the value of a
        0x0020f0f8 = 0x00000000

0020f328 51141b5c [GCFrame: 0020f328] 
...