Это сложная проблема, и может потребоваться выход за пределы комфортной зоны управляемой только отладки.
Что вы хотите сделать, это сопоставить 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 и сравнения результата.
Много шагов, но вы получите тот же результат: -)
Спасибо,
Аарон