2014-01-27 8 views
3

Я пытаюсь отлаживать приложение с управляемым кодом .NET для образовательных целей с WinDbg и SOS.Отладка в режиме освобождения

Module Module1 

    Sub Main() 

    Console.Read() 
    throwExceptionMethod() 

    End Sub 

    Private Sub throwExceptionMethod() 

    Dim localString As String = "bad string" 
    If localString = "bad string" Then 
     Throw New System.NotSupportedException("Can't process the string.") 
    End If 

    End Sub 

End Module 

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

Вывод команды CLRStack:

0:000> !CLRStack 
OS Thread Id: 0x1148 (0) 
DBGHELP: mscorwks - public symbols 
     C:\Program Files\Debugging Tools for Windows (x64)\sym\mscorwks.pdb\EC7B2AF3D7A74E1FB2A04CB8AF5F867A1\mscorwks.pdb 
DBGHELP: ntdll - public symbols 
     C:\Program Files\Debugging Tools for Windows (x64)\sym\ntdll.pdb\9D04EB0AA387494FBD81ED062072B99C2\ntdll.pdb 
DBGHELP: mscoreei - public symbols 
     C:\Program Files\Debugging Tools for Windows (x64)\sym\mscoreei.pdb\F2445BD7B5494942A39C87ED630879A92\mscoreei.pdb 
DBGHELP: MSCOREE - public symbols 
     C:\Program Files\Debugging Tools for Windows (x64)\sym\mscoree.pdb\FB53EF9DD104439E9903F0B34128E0392\mscoree.pdb 
DBGHELP: KERNEL32 - public symbols 
     C:\Program Files\Debugging Tools for Windows (x64)\sym\kernel32.pdb\C4D1D9065632419699A8B2F25B62381D2\kernel32.pdb 
Child-SP   RetAddr   Call Site 
000000000020ec70 000007ff0019014a Prototipos.Module1.throwExceptionMethod() 
000000000020ecc0 000007fef881d432 Prototipos.Module1.Main() 

И локальная строка, метод не может обработать. !!

Выход DSO и сделать 00000000027002c0:

0:000> !dso 
OS Thread Id: 0x1148 (0) 
RSP/REG   Object   Name 
000000000020ea80 00000000026ff4c8 System.Text.DecoderNLS 
000000000020eaa8 0000000002700340 System.NotSupportedException 
000000000020eac0 0000000002700340 System.NotSupportedException 
000000000020eae0 0000000002700340 System.NotSupportedException 
000000000020ebb0 0000000002700340 System.NotSupportedException 
000000000020ebc0 00000000027002f0 System.String 
000000000020ec60 00000000027002f0 System.String 
000000000020ec90 00000000027002c0 System.String 
000000000020eca8 0000000002700340 System.NotSupportedException 
000000000020ecc0 00000000026ff828 System.IO.TextReader+SyncTextReader 

0:000> !do 00000000027002c0 
Name: System.String 
MethodTable: 000007fef7ab7d90 
EEClass: 000007fef76be560 
Size: 46(0x2e) bytes 
(C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll) 
String: bad string 
Fields: 
       MT Field Offset     Type VT  Attr   Value Name 
000007fef7abf000 4000096  8   System.Int32 1 instance    11 m_arrayLength 
000007fef7abf000 4000097  c   System.Int32 1 instance    10 m_stringLength 
000007fef7ab97d8 4000098  10   System.Char 1 instance    62 m_firstChar 
000007fef7ab7d90 4000099  20  System.String 0 shared   static Empty 
           >> Domain:Value 00000000000bac20:00000000026f1308 << 
000007fef7ab9688 400009a  28  System.Char[] 0 shared   static WhitespaceChars 
           >> Domain:Value 00000000000bac20:00000000026f1ba0 << 

Но в режиме выпуска, даже при загрузке PDB, я не могу увидеть полезную информацию с WinDbg.

Информация о модуле. Символы загружаются:

0:000> !lmi Prototipos.exe 
Loaded Module Info: [prototipos.exe] 
     Module: Prototipos 
    Base Address: 0000000000940000 
    Image Name: C:\Users\joseluis.vaquero\Documents\Visual Studio 2008\Projects\Prototipos\Prototipos\bin\Release\Prototipos.exe 
    Machine Type: 332 (I386) 
    Time Stamp: 52e64b75 Mon Jan 27 13:05:09 2014 
      Size: a000 
     CheckSum: 0 
Characteristics: 102 
Debug Data Dirs: Type Size  VA Pointer 
      CODEVIEW 89, 401c, 1c1c RSDS - GUID: {ABB91DE1-4132-4D69-B9E7-2D48B4C9A548} 
       Age: 1, Pdb: C:\Users\joseluis.vaquero\Documents\Visual Studio 2008\Projects\Prototipos\Prototipos\obj\Release\Prototipos.pdb 
    Image Type: FILE  - Image read successfully from debugger. 
       C:\Users\joseluis.vaquero\Documents\Visual Studio 2008\Projects\Prototipos\Prototipos\bin\Release\Prototipos.exe 
    Symbol Type: PDB  - Symbols loaded successfully from image path. 
       C:\Users\joseluis.vaquero\Documents\Visual Studio 2008\Projects\Prototipos\Prototipos\bin\Release\Prototipos.pdb 
    Load Report: private symbols & lines, not source indexed 
       C:\Users\joseluis.vaquero\Documents\Visual Studio 2008\Projects\Prototipos\Prototipos\bin\Release\Prototipos.pdb 

Я не вижу ThrowExcetionMethod в стеке.

0:000> !CLRStack 
OS Thread Id: 0xae4 (0) 
Child-SP   RetAddr   Call Site 
00000000001fe920 000007fef881d432 Prototipos.Module1.Main() 

Я не вижу локальные объекты стека сбрасывания строк.

0:000> !dso 
OS Thread Id: 0xae4 (0) 
RSP/REG   Object   Name 
00000000001fe758 000000000268a840 System.NotImplementedException 
00000000001fe770 000000000268a840 System.NotImplementedException 
00000000001fe790 000000000268a840 System.NotImplementedException 
00000000001fe860 000000000268a840 System.NotImplementedException 
00000000001fe870 000000000268a840 System.NotImplementedException 
00000000001fe910 000000000268a840 System.NotImplementedException 
00000000001fe920 000000000268a840 System.NotImplementedException 
00000000001fe928 000000000268a8c8 System.String 

Я не могу обнаружить, что происходит в производственной среде с этой информацией.

Есть ли способ получить дополнительную информацию с помощью WinDbg в режиме выпуска?

+0

Вы остановились в той же точке в режиме деблокирования? В настоящий момент я предполагаю, что вы будете использовать 'sxe clr' для остановки в любом исключении .NET и затем запускать команды при вызове исключения. Правильно ли это предположение? –

+0

Да. Я присоединяюсь к процессу, нажимаю enter в окне консоли, чтобы передать «console.read», а отладка останавливается на исключении точно так же, как в режиме отладки. – jlvaquero

ответ

5

Это совершенно нормально, побочный эффект оптимизатора джиттера, который делает ваш код быстрым. Метод исчез из-за того, что он встал в очередь, переменные стека исчезли из-за того, что вместо этого они сохраняются в регистрах CPU. Вы найдете оптимизацию, выполняемую дрожанием в this answer.

Если вы решительно настроены на диагностику по скорости, тогда отключение оптимизатора является технически опцией. Выберите конфигурацию сборки релиза, Project + Properties, вкладку Compiled, кнопку Advanced, отключите опцию «Включить оптимизацию». Не то чтобы я действительно рекомендую вам делать это.

+0

Спасибо Хэнк. Имеет большой смысл. Позвольте мне задать еще один быстрый вопрос: какой должен быть курс действий, если я не могу воспроизвести ошибку в среде разработки? Перекомпилируйте без оптимизации, добавьте в рабочую среду, отлаживайте, исправляйте и перекомпилируйте с оптимизацией снова? – jlvaquero

+0

Существует не одна стратегия, которая последовательно обеспечивает результаты за пределами твердого QA. Не WinDbg тоже. Регистрация всегда хорошая идея. –

Смежные вопросы