我的windbg技能有点生疏,所以如果这很明显,请原谅我。
3个主题对它们有例外。这是否意味着它们位于每个线程的堆栈顶部?我不明白这是怎么发生的,因为第一个会导致未处理的异常处理程序启动并崩溃我的应用程序。下面的缩写输出。
!threads
0 1 1e5c 0015c008 2006020 Enabled 00000000:00000000 0015a4a8 6 STA
2 2 2734 00176740 b220 Enabled 00000000:00000000 0015a4a8 0 MTA (Finalizer)
4 3 1f64 001b22d0 880b220 Enabled 00000000:00000000 0015a4a8 0 MTA
25 14 2714 0897ef78 180b220 Enabled 39e4bf38:39e4cbec 0015a4a8 0 MTA (Threadpool Worker)
29 19 1884 0898a3b8 1000b221 Disabled 39f36d50:39f38bec 0015a4a8 0 MTA System.Threading.ThreadAbortException (39f36bf8)
71 57 164c 274b41f0 b220 Enabled 39ef4098:39ef4bec 0015a4a8 4 MTA System.NullReferenceException (39ef3028)
72 58 223c 274b1110 200b220 Enabled 00000000:00000000 0015a4a8 0 MTA
107 83 1e60 275fe008 b020 Enabled 00000000:00000000 0015a4a8 0 MTA System.ObjectDisposedException (1e66684c)
答案 0 :(得分:3)
!threads
命令输出每个线程的最后一个异常。由于所有线程可能同时发生异常,因此您可以看到多个异常,但在我的经验中并不常见。
但是,我注意到输出列出了一个107的线程ID,所以我假设应用程序创建了很多线程。我还注意到一些线程持有多个锁。也许一个或多个线程在堆栈上仍然存在异常的状态下被阻塞。
很难用手头的信息说出更具体的内容。
答案 1 :(得分:2)
您可以在Debug->事件过滤器下设置希望WinDbg中断的异常。我没有使用WinDbg进行.net调试,但我之前使用过这些事件过滤器来捕获特定的已处理异常以获取有问题代码的调用堆栈。
当然发生许多处理异常是很正常的,所以我不知道你的app状态究竟意味着什么,但你应该能够切换线程并转储调用堆栈并检查异常上下文记录或设置你是否希望WinDbg在发生这些异常时中断,然后当它们确实发生时比较调用堆栈,点击go看看是否通过启用/禁用它们作为消除过程而崩溃。
答案 2 :(得分:1)
通常,如果您在windbg中打开崩溃转储,它将提供导致崩溃的异常 一旦加载崩溃转储。您应该在windbg中看到类似于此
的消息“此转储文件存储在其中的兴趣例外。 可以通过.ecxr访问存储的异常信息。 (1890.da0):堆栈溢出 - 代码c00000fd(第一/第二次机会不可用)“
导致异常的线程应该与您在中看到的线程号相同 加载崩溃转储后,windbg的左下角。
答案 3 :(得分:0)
好的,所以似乎没有办法确定哪个线程导致调试器调用。