2012-07-10 4 views
10

SOS를 사용하여 WinDbg로 ASP.NET 프로세스의 미니 덤프를 탐색 중입니다. 나는 7 (을 제외하고 하나) 스레드로 전환하려고하면, 나는이 얻을 그러나WinDbg의 관리되는 스레드로 전환 할 수 없습니다.

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) 

:

0:000> ~7s 
     ^Illegal thread error in '~7s' 
내가 관리 스레드를 게시하면 내가 스레드의 정상적인 찾고 목록을 보려면

관리되는 스레드로 전환하려고 할 때 발생합니다. 여기에서 어디로 가야할지 모르겠습니다. 실제로해야 할 일은 관리되는 스레드의 스택 추적을 보는 것입니다.

답변

9

!threads의 출력은 스레드 (WinDbg의 ID, 관리 ID 및 기본 ID)에 대해 서로 다른 세 가지 ID를 표시합니다. 당신이 사용해야하는 것은 가장 왼쪽에 있습니다. 덤프의 모든 스레드가 XXXX으로 표시되어 더 이상 사용할 수 없다는 것을 알 수 있습니다. 이것은 정상적인 일이지만 모든 스레드가 이와 같이 표시되는 것이 이상하다는 것을 알게됩니다. 프로세스 종료 중에 덤프가 걸렸습니까? 코멘트

에 따라

UPDATE 당신은 확실히 adplus -crash와 유용한 덤프를 얻을 수 있어야하지만, 분명히 모든 심지어 종료 자 스레드가 종료되고 있기 때문에 조금 여기 엉망이다. 스레드 중 하나가 StackoverflowException을 가졌음을 알게되었습니다. 이를 얻으려면 첫 번째 예외 상황에서 덤프를 만들고 더 유용한 방법이 있는지 확인하십시오. Adplus에는 FullOnFirst 플래그가 있습니다.

추가 업데이트

좋아, 이상한입니다. 시도 할 몇 가지.

  • 충돌 전에 프로세스에 연결하고 그냥 g으로 지정하십시오. 예외가 발생하면 디버거에 침입해야합니다. 원하는 경우 예외를 콘솔에 인쇄하도록 이벤트를 설정할 수 있습니다. sxe -c "!pe; !clrstack; gn" clr을 사용하십시오.

  • Adplus는 vbs 스크립트로 사용되었지만 이전에는 실행 파일로 다시 작성되었습니다. 나는 새로운 버전에 약간의 사소한 문제를 보았지만 이것과 같은 것은 없다. adplus_old.vbs로 계속 사용할 수있는 이전 스크립트를 사용해 볼 수 있습니다.

  • 시도해보십시오. procdump from sysinternals. Adplus와 동일한 종류의 덤프 옵션을 지원합니다 (몇 가지 더 추가).

+0

예, 덤프는 충돌하는 동안 ('ADPlus -crash'를 실행하여) 수행되었습니다. 이것은 내가 그 스레드를 전혀 볼 수 없다는 것을 의미합니까? – andypaxo

+0

명확한 설명에 감사드립니다. 나는'-fullonfirst'를 사용하여이 작업을 다시 시도 했으므로 전체 덤프가 작성되었습니다. 불행히도 결과는 동일하며 모든 스레드를 사용할 수 없습니다. 나는 또한 힙에서 직접 예외를 얻으려고했지만 메시지, 스택 추적 등은 모두 null이었다. 정보가 거의없는 이유를 아십니까? – andypaxo

+0

@Brian, sxe 명령에'gn'을 사용해서는 안됩니까? –

관련 문제