Справка Windbg -> как я могу прочитать код в этом стеке вызовов?
Вопрос
У меня есть дамп созданной мной службы Windows.Исключением является то, что мой код не может переместить файл (по какой-то причине).Теперь, в моем коде есть несколько мест, где я перемещаю файлы по файловой системе.Итак, используя Windbg, я пытаюсь увидеть код, в котором возникает исключение.
вот моя !clrstack-дамп..
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-
Итак, я разобрался с файлом, который не удалось переместить.кьюл.Но я просто хочу увидеть код в этом методе MyClass.Foo.DoSomeStuffInHere(System.String), который вызывает File.Move(..).Этот метод содержит много файлов.Переместить ..таким образом, я мог бы поместить информацию try / catches / debug / trace ..но я надеюсь быть более эффективным, используя Windbg, чтобы помочь найти эту проблему.
Есть какие-нибудь мысли?
Решение
Вы не можете получить точную строку кода, если приложение не было развернуто в режиме отладки. И если бы это было так, я думаю, это было бы показано в вызове! Clrstack.
Другие советы
Это сложная проблема, и может потребоваться выйти за пределы зоны комфорта, когда отладка осуществляется только под управлением пользователя.
То, что вы хотите сделать, это сопоставить IL для функции MyClass.Foo.Dosместо здесь к разборке этой функции.Мой приведенный ниже пример - x86, однако x64 может выполнить те же действия.
Ссылка на это приведена далеко внизу по следующей ссылке.Отладка Неожиданного завершения процесса
Пример текста из технического документа:В управляемом стеке, Отладка.Неожиданно.btnSTA_Click ...Посмотрите на код в разделе Отладки.Неожиданное событие.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:результат.
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, а затем запустить !дампил изучить IL-код, если это проще.
Вы могли бы посчитать количество звонков в System.IO.File.Переместить в !u выходной сигнал а затем отсчитайте то же самое число в IL.Затем вы можете использовать .NET Reflector, чтобы разобрать метод, сопоставить C # с IL и сравнить результат.
Много шагов, но это приведет вас к тому же результату :-)
Спасибо, Аарон