我的托管应用程序中的哪个线程导致崩溃?

时间:2012-05-10 17:58:14

标签: .net debugging windbg

我的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)

4 个答案:

答案 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)

好的,所以似乎没有办法确定哪个线程导致调试器调用。