我对我正在进行的最新转储分析有疑问。在我使用命令时的几个转储文件中:
!analyze -v
我获得有关异常堆栈的信息。这是一个AccessViolationException。堆栈是这样的:
00000000 00000000 unknown.dll!MyComLib.MyCtl.set_ShowInfo+0x1
0028dc5c 00000000 unknown.dll!AxMyComLib.AxCtl.set_ShowInfo+0x1a
0028dc68 00000000 unknown.dll!Company.Client.Utility.set_Options+0x35
0028dc78 00000000 unknown.dll!Company.Client.Utility.SetAvailable+0x1a
0028dc84 00000000 unknown.dll!Company.Client.System.client_Available+0x1df
它从.NET调用COM ActiveX组件。两者都是由我们开发的。而这个短的callstack贯穿3个dll。 .NET-> Wrapper-> COM( - >错误)
我知道模块(它不叫未知;)) 我有所有符号,它们已正确设置和加载。
如果我自然地使用u unknown.dll!MyComLib.MyCtl.set_ShowInfo+0x1
则不起作用。但即使我用正确的模块名称替换未知,它也不起作用。
我想知道的是抛出异常的正确源代码行(+ 0x1)。
我的问题:
为什么它显示为未知?
如何找出出现问题的代码行?
我之前没有遇到过"未知"我分析了转储中的模块条目。
更新
更多信息: 线程0上的异常相关帧结果为~0kb1000:
ChildEBP RetAddr Args to Child
0028ea28 72ac90f7 e0434352 00000001 00000005 KERNELBASE!RaiseException+0x58
0028eacc 72c00b0c 00000000 73dc63b0 0028eaf0 clr!RaiseTheExceptionInternalOnly+0x276
0028eae4 72c00d3d 00000004 0028ee98 72ac957e clr!RaiseTheException+0x86
0028eb0c 72c00d6d 00000004 004e4790 00000000 clr!RaiseTheExceptionInternalOnly+0x30a
0028eb40 72d03512 00184270 004e4790 00000000 clr!RealCOMPlusThrow+0x2f
0028eb98 72d03a75 0028eda8 00184270 00184270 clr!ThrowInvokeMethodException+0xac
0028eea4 71c03781 00000000 027d25d4 71c0b790 clr!RuntimeMethodHandle::InvokeMethod+0xa64
0028eec8 71c38f9d 00000000 00000000 027d24a8 mscorlib_ni+0x2d3781
0028ef18 729e2952 004e4790 0028ef78 72a0318f mscorlib_ni+0x308f9d
0028ef24 72a0318f 0028efc4 0028ef68 72ac957e clr!CallDescrWorkerInternal+0x34
0028ef78 72a039d5 0028f0c0 00000001 00000000 clr!CallDescrWorkerWithHandler+0x6b
0028eff8 72aaef24 0028f0f4 11ce1352 001837d8 clr!MethodDescCallSite::CallTargetWorker+0x152
0028f124 72aaf048 00000000 00000001 11ce134e clr!RunMain+0x1aa
0028f398 72b0a484 00000000 11ce11de 013c0000 clr!Assembly::ExecuteMainMethod+0x124
0028f89c 72b0a527 11ce1a8e 00000000 00000000 clr!SystemDomain::ExecuteMainMethod+0x614
0028f8f8 72b0a63a 11ce1b4e 00000000 00000000 clr!ExecuteEXE+0x4c
0028f938 72b0c3c2 11ce1b02 00000000 00000000 clr!_CorExeMainInternal+0xdc
0028f974 7308f5a3 11cee72d 00000000 76371222 clr!_CorExeMain+0x4d
0028f9ac 73107efd 0028f9c4 73107f16 00000000 mscoreei!_CorExeMain+0x10a
0028f9c4 73104de3 00000000 7637337a fffde000 mscoree!ShellShim__CorExeMain+0x7d
0028f9cc 7637337a fffde000 0028fa18 77809882 mscoree!_CorExeMain_Exported+0x8
0028f9d8 77809882 fffde000 64decd1b 00000000 kernel32!BaseThreadInitThunk+0xe
0028fa18 77809855 73104ddb fffde000 00000000 ntdll!__RtlUserThreadStart+0x70
0028fa30 00000000 73104ddb fffde000 00000000 ntdll!_RtlUserThreadStart+0x1b
~*e!clrstack
在线程上没有任何与异常相关的信息。 !dumpstack
也没有。
!threads
显示:
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
0 1 21e8 004e4790 26020 Preemptive 73DF4F30:00000000 004dd3a0 0 STA System.Reflection.TargetInvocationException 73dc63b0
当我!pe
直到我得到内部异常时,它是问题开头的AccessViolationException堆栈。
更新2
~0e !clrstack
显示:
0028eb24 74f6c42d [GCFrame: 0028eb24]
0028eb5c 74f6c42d [GCFrame: 0028eb5c]
0028ebe0 74f6c42d [HelperMethodFrame_PROTECTOBJ: 0028ebe0] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean)
0028eeb4 71c03781 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[])
0028eed8 71c38f9d System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)
0028ef18 0033005f Program.Main() [d:\prg\Program.cs @ 20]
0028f0a4 729e2952 [GCFrame: 0028f0a4]
例外情况是( - sic!:()在测试电脑上重现相对较好。不幸的是,在开发机器上(连接或不连接调试器)。目前它已经消失了。我有大约6个转储都显示了相同的异常和几乎相同的堆栈跟踪。
更新3
!teb
显示有关线程0的以下信息:
TEB at fffdd000
ExceptionList: 0028eabc
StackBase: 00290000
StackLimit: 00283000
SubSystemTib: 00000000
FiberData: 00001e00
ArbitraryUserPointer: 00000000
Self: fffdd000
EnvironmentPointer: 00000000
ClientId: 000016e8 . 000021e8
RpcHandle: 00000000
Tls Storage: 0ca60888
PEB Address: fffde000
LastErrorValue: 6
LastStatusValue: c0000034
Count Owned Locks: 0
HardErrorMode: 0