2014-12-17 3 views
2

존슨 M. 하트의 Windows 시스템 프로그래밍 4 판을 공부하고 있습니다. 다음은 windbg에서 저를 곤란하게 만든 한 가지 예제의 소스 코드입니다. 아래 스 니펫은 명령 줄에서 각 파일에 대한 스레드를 만듭니다. 내가 알아 차 렸던 것은 스레드가 ~ 또는 ~~ [TID]를 사용하여 윈드백에 보이지 않는다는 것입니다. 그러나 procexp와 procmon은 스레드를 보여줍니다.Microsoft C 라이브러리 _beginthreadex

왜 스레드가 windbg에서 보이지 않습니까? 그들이 있다고 가정한다면 어떻게 볼 수 있습니까? ###! _ beginthreadex 함수에 중단 점을 설정했습니다. 중단 점이 트리거되지만 함수를 단계별로 실행하면 스레드가 표시되지 않습니다.

for (iThrd = 0; iThrd < argc - 2; iThrd++) { 

     /* Set: targv[1] to the pattern 
      targv[2] to the input file 
      targv[3] to the output file. */ 

    _tcscpy (gArg[iThrd].targv[1], argv[1]); /* Pattern. */ 
    _tcscpy (gArg[iThrd].targv[2], argv[iThrd + 2]); /* Search file. */ 

    if (GetTempFileName /* Temp file name */ 
      (".", "Gre", 0, gArg[iThrd].targv[3]) == 0) 
     ReportError (_T ("Temp file failure."), 3, TRUE); 

    /* Output file. */ 

    gArg[iThrd].argc = 4; 

    /* Create a thread to execute the command line. */ 

    tHandle[iThrd] = (HANDLE)_beginthreadex (
      NULL, 0, ThGrep, &gArg[iThrd], 0, NULL); 

    if (tHandle[iThrd] == 0) 
     ReportError (_T ("ThreadCreate failed."), 4, TRUE); 
} 
+1

이 스레드가 단명하고 있습니까? ProcExp의 Difference Highlight Duration에 따라 ProcExp에서 완료 후 최대 9 초 동안 볼 수 있습니다. –

답변

3

당신은 windbg를, 에있는 모든 활성 스레드를 볼 수 있어야하지만 종료 때, 그들은 사라 졌어요. 이 (sxn xx)에 예외 통지를 활성화하여 스레드 생성/삭제를 관찰 할 수 있습니다. 여기

0:001> sxn ct 
0:001> sxn et 
0:001> g 
Exit thread 1:2944, code 0 
Create thread 1:2cbc 
Create thread 2:2aec 
Exit thread 2:2aec, code 0 
Create thread 2:1a5c 

나는 스레드가 여전히 활성 목록 :

0:002> ~ 
    0 Id: 25c0.2d3c Suspend: 1 Teb: 7efdd000 Unfrozen 
    1 Id: 25c0.2cbc Suspend: 1 Teb: 7efda000 Unfrozen "kgtDlgThread" 
. 2 Id: 25c0.1a5c Suspend: 1 Teb: 7efd7000 Unfrozen 
+0

스레드 이벤트에 대한 알림을 보내 주셔서 감사합니다. – dcrearer

+0

의견을 보내 주셔서 감사합니다. 스레드 이벤트를 사용하여 스레드 생성을 중단하고 스택을 검사 할 수 있습니다. – dcrearer

+0

또한 스레드 시작 주소 인 ThGrep에서 일반적인 중단 (bp)을 사용할 수 있습니다. –