13

我正在使用 SOS 探索一个带有 WinDbg 的 ASP.NET 进程的小型转储。如果我列出托管线程,我会看到一个正常的线程列表:

0:000> !threads
ThreadCount: 8
UnstartedThread: 0
BackgroundThread: 8
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
                                              PreEmptive                                                Lock
       ID OSID        ThreadOBJ     State   GC     GC Alloc Context                  Domain           Count APT Exception
XXXX    1 12bc 00000000001441f0   1808220 Disabled 0000000140b10fc8:0000000140b12f20 000000000017f6e0     0 Ukn (Threadpool Worker)
XXXX    2 1334 0000000000152f90      b220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Finalizer)
XXXX    3 138c 000000000017b100    80a220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Completion Port)
XXXX    4  81c 000000000017eb40      1220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn
XXXX    5  5e4 00000000001bccd0   880a220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Completion Port)
XXXX    6 11e4 0000000004bee280   180b220 Disabled 0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Worker)
XXXX    7  73c 0000000004c267e0   180b220 Disabled 0000000140b0f158:0000000140b10f20 000000000017f6e0     3 Ukn (Threadpool Worker) System.StackOverflowException (000000007fff0138) (nested exceptions)
XXXX    8  21c 00000000001ad1c0   180b220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Worker)

但是,如果我尝试切换到线程 7(有例外的线程),我会得到:

0:000> ~7s
        ^ Illegal thread error in '~7s'

尝试切换到任何托管线程时会发生这种情况。我不知道从哪里开始。我真正需要做的是查看该托管线程的堆栈跟踪。

4

1 回答 1

11

输出!threads显示线程的三个不同 ID(WinDbg 的 ID、托管 ID 和本机 ID)。您需要使用的是最左边的。如您所见,转储中的所有线程都被标记为XXXX它们不再可用。这是正常的,但我确实觉得奇怪的是所有线程都被标记为这样。进程关闭期间是否进行了转储?

更新基于评论

您绝对应该能够使用 获得有用的转储adplus -crash,但显然这里的一切都有些混乱,因为即使是终结器线程也被终止。我注意到其中一个线程有一个 StackoverflowException,这可能是你所追求的。要做到这一点,您可以在第一次机会异常上创建转储,看看您是否能以这种方式获得更有用的东西。Adplus 对此有一个FullOnFirst标志。

附加更新

好吧,这奇怪。其他几件事要尝试。

  • 附加到崩溃前的进程,让它g。这应该会在异常情况下进入调试器。如果需要,您可以设置一个事件以将任何异常打印到控制台。使用sxe -c "!pe; !clrstack; gn" clr.

  • Adplus 曾经是一个 vbs 脚本,但不久前它被重写为可执行文件。我已经看到新版本的一些小问题,但没有这样的。您可以尝试旧脚本,它仍然可以作为 adplus_old.vbs 使用。

  • 从 sysinternals尝试procdump 。它支持与 Adplus 相同类型的转储选项(加上更多)。

于 2012-07-10T15:20:21.030 回答