Windbg help -> как я могу прочитать код в этом стеке вызовов? - PullRequest
8 голосов
/ 30 октября 2008

У меня есть дамп службы Windows, которую я сделал. Исключением является то, что мой код не может переместить файл (по некоторым причинам). Теперь в моем коде есть несколько мест, где я перемещаю файлы по файловой системе. Итак, используя Windbg, я пытаюсь увидеть код, где происходит исключение.

вот мой! Clrstack dump ..

0:016> !clrstack -p
OS Thread Id: 0xdf8 (16)
Child-SP         RetAddr          Call Site
0000000019edea70 0000064278a15e4f System.IO.__Error.WinIOError(Int32, System.String)
PARAMETERS:
    errorCode = <no data>
    maybeFullPath = <no data>

0000000019edead0 0000064280181ce5 System.IO.File.Move(System.String, System.String)
PARAMETERS:
    sourceFileName = <no data>
    destFileName = <no data>

0000000019edeb50 0000064280196532 MyClass.Foo.DoSomeStuffInHere(System.String)
PARAMETERS:
    this = 0x0000000000c30aa8
    filePathAndName = 0x0000000000d1aad0

Теперь это очень помогает ...

0:016> !do 0x0000000000d1aad0
Name: System.String
MethodTable: 00000642784365e8
EEClass: 000006427803e4f0
Size: 88(0x58) bytes
(C:\WINDOWS\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: C:\BlahBlahFolder\FooFolder\4469.jpg
Fields:
-snipped-

Итак, я выяснил файл, который не удалось переместить. Kewl. Но я просто хочу увидеть код в этом методе MyClass.Foo.DoSomeStuffInHere (System.String), который вызывает File.Move (..). В этом методе есть много File.Move ... так что я могу поместить информацию try / catches / debug / trace ... но я надеюсь быть более эффективным, используя Windbg, чтобы помочь найти эту проблему.

Есть мысли?

Ответы [ 2 ]

3 голосов
/ 22 февраля 2009

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

Что вы хотите сделать, это сопоставить IL для функции MyClass.Foo.DoSomeStuffInHere с разборкой этой функции. Мой пример ниже - x86, однако x64 может следовать тем же шагам.

Это ссылка глубоко в следующей ссылке. Отладка неожиданного завершения процесса

Пример текста из документа: В управляемом стеке Debugging.Unexpected.btnSTA_Click ... Посмотрите код в событии Debugging.Unexpected.btnSTA_Click.

private void btnSTA_Click(object sender, System.EventArgs e)
{
   DebuggingCOMLib.STAClass staobj =  new DebuggingCOMLib.STAClass();
   staobj.RaiseError(1,5);
   Label1.Text += "STA Call Completed sucessfully";
}

Если исходный код недоступен, вы можете проверить сборку, указав указатель инструкций для фрейма стека вызовов для команды ! U . Указатель на инструкцию можно получить из! Clrstack: output.

0096f970  03a00e06 [DEFAULT] [hasThis] Void
Debugging.Unexpected.btnSTA_Click(Object,Class System.EventArgs)

Чтобы разобрать эту функцию, введите ! U 03a00e06 .

    0:010> !u 03a00e06 
    Normal JIT generated code
    [DEFAULT] [hasThis] Void Debugging.Unexpected.btnSTA_Click(Object,Class 
    System.EventArgs)
    Begin 03a00de0, size 54
   <snip>
    03a00e18 8b15a89c1702     mov     edx,[02179ca8] ("STA Call Completed 
    sucessfully")
    03a00e1e e83d3590ff       call    03304360 (System.String.Concat)
    <snip>
    03a00e2f 5e               pop     esi
    03a00e30 5f               pop     edi
    03a00e31 c20400           ret     0x4

Хорошо, что теперь?
Отсканируйте свой вывод! U для строки, подобной

call    03304360 (System.IO.File.Move)

Кроме того, вы можете запустить! Ip2md 03a00e06 , чтобы получить MethodDesc, а затем запустить ! Dumpil , чтобы проверить код IL, если это проще.

Вы можете посчитать количество вызовов на System.IO.File.Move в выводе ! U , а затем отсчитать тот же номер в IL. Затем вы можете использовать .NET Reflector для дизассемблирования метода, сопоставления C # и IL и сравнения результата.

Много шагов, но вы получите тот же результат: -)

Спасибо, Аарон

3 голосов
/ 31 октября 2008

Вы не можете получить точную строку кода, если приложение не было развернуто в режиме отладки. И если бы это было так, я думаю, это было бы показано в вызове! Clrstack.

...