Asynchronous 如何在WinDBG中跟踪异步IO代码中的引用?

Asynchronous 如何在WinDBG中跟踪异步IO代码中的引用?,asynchronous,windbg,Asynchronous,Windbg,我有两个SqlConnection对象的地址,希望了解谁持有对它们的引用 对象1 0:042> !mroot 000000b97fd45868 AppDomain 000000bdeb50b7a0: GCHandle(Pinned) @ 000000bdebc61bf8 000000bd7796f6d8[System.Object[]] 000000b97fd46308[a8iDynamixV30.BL.GlobalSetting] 000000b97fd45b18[a8i.a8iData

我有两个SqlConnection对象的地址,希望了解谁持有对它们的引用

对象1

0:042> !mroot 000000b97fd45868
AppDomain 000000bdeb50b7a0: GCHandle(Pinned) @ 000000bdebc61bf8
000000bd7796f6d8[System.Object[]]
000000b97fd46308[a8iDynamixV30.BL.GlobalSetting]
000000b97fd45b18[a8i.a8iDatabaseConnection]
000000b97fd45868[System.Data.SqlClient.SqlConnection]
对象2

0:042> !mroot 000000b99a5b0cf0
CLR Thread 0x57 @ R14
000000bb92887ac8[System.Threading.Tasks.ContinuationTaskFromTask]
000000bb928d8048[System.Threading.Tasks.StandardTaskContinuation]
000000bb928d7ff8[System.Threading.Tasks.ContinuationTaskFromTask]
000000b9996a5ff0[System.Threading.Tasks.StandardTaskContinuation]
000000b9996a5fa0[System.Threading.Tasks.ContinuationTaskFromTask]
000000b9996a92a8[System.Threading.Tasks.StandardTaskContinuation]
000000b9996a9258[System.Threading.Tasks.ContinuationTaskFromTask]
000000bb928f0dc8[System.Threading.Tasks.StandardTaskContinuation]
000000bb928f0d78[System.Threading.Tasks.ContinuationTaskFromTask]
000000ba8ea86a18[System.Threading.Tasks.StandardTaskContinuation]
000000ba8ea869c8[System.Threading.Tasks.ContinuationTaskFromTask]
000000bb929084f8[System.Threading.Tasks.StandardTaskContinuation]
000000bb929084a8[System.Threading.Tasks.ContinuationTaskFromTask]
000000bb9291c4f8[System.Threading.Tasks.StandardTaskContinuation]
000000bb9291c4a8[System.Threading.Tasks.ContinuationTaskFromTask]
000000ba8eaa5dc8[System.Threading.Tasks.StandardTaskContinuation]
000000ba8eaa5c78[System.Threading.Tasks.ContinuationTaskFromTask]
000000bc99588ce8[System.Threading.Tasks.StandardTaskContinuation]
000000bc99588c98[System.Threading.Tasks.ContinuationTaskFromTask]
000000ba8eaddd60[System.Threading.Tasks.StandardTaskContinuation]
000000ba8eaddc10[System.Threading.Tasks.ContinuationTaskFromTask]
000000bc9c734110[System.Threading.Tasks.StandardTaskContinuation]
000000bc9c7340c0[System.Threading.Tasks.ContinuationTaskFromTask]
000000bc9c735330[System.Threading.Tasks.StandardTaskContinuation]
000000bc9c7351e0[System.Threading.Tasks.ContinuationTaskFromTask]
000000ba8eb1d158[System.Threading.Tasks.StandardTaskContinuation]
000000ba8eb1d108[System.Threading.Tasks.ContinuationTaskFromTask]
000000b999769f38[System.Threading.Tasks.StandardTaskContinuation]
000000b999769de8[System.Threading.Tasks.ContinuationTaskFromTask]
000000bb9298df28[System.Threading.Tasks.StandardTaskContinuation]
000000bb9298ded8[System.Threading.Tasks.ContinuationTaskFromTask]
000000b99a5c5980[System.Threading.Tasks.StandardTaskContinuation]
000000b99a5c5930[System.Threading.Tasks.ContinuationTaskFromTask]
000000b99a5c58f0[System.Action`1[[System.Threading.Tasks.Task, mscorlib]]]
000000b99a5c58d0[System.Web.Util.SynchronizationHelper+c__DisplayClass22_0]
000000b99a5c5890[System.Action]
000000b99a5c5870[System.Web.AspNetSynchronizationContext+c__DisplayClass22_0]
000000b99a5be490[System.Action]
000000b99a5be470[System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner]
000000b99a5bed30[SharpTop.Common.Utils.SqlUtil+d__1e`1[[System.Int32, mscorlib]]]
000000b99a5b0cf0[System.Data.SqlClient.SqlConnection]
我几乎可以理解对象1的情况,但我对对象2完全感到困惑。我知道对象2是异步I/O的一部分,但是否可以将其追溯到所有者


如果不是,那么代码的编写方式是否可以使其在异步的同时对后期调试也很友好?

您既不知道对象1,也不知道对象2是谁“拥有”了它。虚拟内存的所有者是一个进程。如果你想知道是哪行代码创建了这个对象,你需要一个剖析器(类似于UMDH,但适用于.NET)嗯,但是我可以解释一下对象1的根链。我可以将其与源代码交叉引用,得出有意义的结论。对于对象2,这种情况是不可能的。