Не удается переключиться на управляемый поток в 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 ответ:
Выходные данные из
!threads
показывают три различных идентификатора для потоков (идентификатор WinDbg, управляемый идентификатор и собственный идентификатор). Тот, который вам нужно использовать, - самый левый. Как вы можете видеть, все потоки в дампе были помечены какXXXX
, Что означает, что они больше не доступны. Это нормально, но мне кажется странным, что все нити помечены именно так. Был ли дамп взят во время остановки процесса?Обновление на основе комментария
Вы определенно должны быть в состоянии получить полезный дамп с
adplus -crash
, но очевидно, что здесь все немного запутано, так как даже поток финализатора завершается. Я заметил, что один из потоков имеет исключение StackoverflowException, которое, вероятно, является тем, что вы ищете. Чтобы получить это, вы можете создать дампы на исключениях первого шанса и посмотреть, получите ли вы что-то более полезное таким образом. Adplus имеет флагFullOnFirst
для этого.Дополнительное обновление
Ладно, это странно. Нужно попробовать еще кое-что.
Прикрепить к процесс перед крахом и просто дайте ему
g
. Это должно проникнуть в отладчик при исключениях. Если вы хотите, вы можете настроить событие, чтобы просто печатать любые исключения в консоли. Используйтеsxe -c "!pe; !clrstack; gn" clr
.Adplus раньше был сценарием vbs, но некоторое время назад он был переписан как исполняемый файл. Я видел несколько незначительных проблем с новой версией, но ничего подобного. Вы можете попробовать старый скрипт, который все еще доступен как adplus_old.vbs.
Попробуйте procdump от Sysinternals. Он поддерживает те же параметры дампа, что и Adplus (плюс еще несколько).