Не удается переключиться на управляемый поток в WinDbg


Я исследую мини-трамплин из ASP.NET процесс с WinDbg, используя SOS. Если я перечисляю управляемые потоки, я вижу обычный список потоков:

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'

Это происходит при попытке переключиться на любой управляемый поток. Я не уверен, где, чтобы перейти от здесь. Что мне действительно нужно сделать, так это увидеть трассировку стека из этого управляемого потока.

1 11

1 ответ:

Выходные данные из !threads показывают три различных идентификатора для потоков (идентификатор WinDbg, управляемый идентификатор и собственный идентификатор). Тот, который вам нужно использовать, - самый левый. Как вы можете видеть, все потоки в дампе были помечены как XXXX, Что означает, что они больше не доступны. Это нормально, но мне кажется странным, что все нити помечены именно так. Был ли дамп взят во время остановки процесса?

Обновление на основе комментария

Вы определенно должны быть в состоянии получить полезный дамп с adplus -crash, но очевидно, что здесь все немного запутано, так как даже поток финализатора завершается. Я заметил, что один из потоков имеет исключение StackoverflowException, которое, вероятно, является тем, что вы ищете. Чтобы получить это, вы можете создать дампы на исключениях первого шанса и посмотреть, получите ли вы что-то более полезное таким образом. Adplus имеет флаг FullOnFirst для этого.

Дополнительное обновление

Ладно, это странно. Нужно попробовать еще кое-что.

  • Прикрепить к процесс перед крахом и просто дайте ему g. Это должно проникнуть в отладчик при исключениях. Если вы хотите, вы можете настроить событие, чтобы просто печатать любые исключения в консоли. Используйте sxe -c "!pe; !clrstack; gn" clr.

  • Adplus раньше был сценарием vbs, но некоторое время назад он был переписан как исполняемый файл. Я видел несколько незначительных проблем с новой версией, но ничего подобного. Вы можете попробовать старый скрипт, который все еще доступен как adplus_old.vbs.

  • Попробуйте procdump от Sysinternals. Он поддерживает те же параметры дампа, что и Adplus (плюс еще несколько).