Windbg帮助->;我如何在这个调用堆栈中读取代码
本文关键字:调用 堆栈 取代码 读取 帮助 gt Windbg | 更新日期: 2023-09-27 17:47:46
我有一个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-
所以我已经找到了无法移动的文件。kewl。但我只想看看这个方法MyClass.Foo.DSomeStuffInHere(System.String)中的代码,它调用File.Move(..)。那个方法有很多File.Move..,所以我可以放try/catches/debug/trace信息。。但我希望通过使用Windbg来帮助发现这个问题,从而提高效率。
有什么想法吗?
除非应用程序是在调试模式下部署的,否则无法获得确切的代码行。如果是这样的话,我相信它会在《!clrstack调用。
这是一个困难的问题,可能需要走出只管理调试的舒适区。
您要做的是将函数MyClass.Foo.DSomeStuffInHere的IL映射到该函数的disassembly。我下面的例子是x86,但是x64可以遵循相同的步骤。
这在下面的链接中有很深的参考。调试意外过程终止
白皮书中的示例文本:在托管堆栈中,调试。意外。btnSTA_Click。。。查看Debugging.Unspected.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)
还有,你可以跑步!ip2md03a00e06获取MethodDesc,然后运行!dumpil检查IL代码(如果更容易的话)。
您可以计算中对System.IO.File.Move的调用次数!u输出,然后在IL中倒数相同的数字。然后您可以使用.NET Reflector来分解该方法,并将C#映射到IL并比较结果。
有很多步骤,但它会让你得到同样的结果:-)
谢谢,Aaron