2

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

4 回答 4

3

!threads命令输出每个线程的最后一个异常。由于所有线程都可能同时发生异常,因此您可以看到多个异常,但根据我的经验,这并不常见。

但是,我确实注意到输出列出了 107 的线程 id,所以我假设应用程序创建了很多线程。我还注意到一些线程持有多个锁。也许一个或多个线程在异常仍然存在于堆栈上的状态下被阻塞。

手头的信息很难说更具体的东西。

于 2012-05-10T23:53:42.393 回答
2

您可以在 Debug->Event Filters 下设置希望 WinDbg 中断的异常。我没有使用 WinDbg 完成 .net 调试,但我之前使用这些事件过滤器来捕获特定处理的异常以获取违规代码的调用堆栈。

当然,发生许多已处理的异常是很正常的,所以我不知道您的应用程序状态的真正含义,但您应该能够切换线程并转储调用堆栈并检查异常上下文记录或设置是否需要WinDbg 在这些异常发生时中断,然后当它们发生时比较调用堆栈,点击 go 并通过启用/禁用它们作为消除过程来查看它是否崩溃。

于 2012-05-10T22:06:17.820 回答
1

通常如果你在windbg中打开一个崩溃转储,它会在加载崩溃转储后立即给出导致崩溃的异常。您应该在 windbg 中看到与此类似的消息

“此转储文件中存储了一个感兴趣的异常。存储的异常信息可以通过 .ecxr 访问。(1890.da0):堆栈溢出 - 代码 c00000fd(第一次/第二次机会不可用)”

并且一旦加载故障转储,导致异常的线程应该与您在windbg左下角看到的线程号相同。

于 2012-05-11T09:37:26.250 回答
0

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

于 2012-05-14T07:14:39.057 回答