2011-02-07 2 views
1

현재 마우스 오른쪽 버튼을 눌러 "Copy file path to clipboard" 메뉴를 선택하십시오. 다음으로 코드를 실행하는 곳, 루프 외부 (이 줄 번호는 WinDbg의 오른쪽 하단 모서리에 표시)까지 소스 행을 왼쪽 클릭하십시오. WinDbg 용 GDB 나 WinDbg에 루프를 남기는 쉬운 방법과 같은 "until"명령의 아날로그?

은 다음 명령 프롬프트 나는 (상태 표시 줄에서 읽을 클립 보드 파일에 경로와 입력 라인 번호에서 삽입하여) 중단 점을 설정이 너무 복잡하게 보인다

 
bp `d:\home\devel\plugin\plugin-svn\common\win-gui-admin.c:788` 

. 루프를 떠나는 GDB에서 명령이 다시 발생했습니다 until. WinDbg에서이 작업을 수행 할 수있는 방법은 무엇입니까?

답변

3

F7은 "커서로 실행"명령을 제공하므로 사용자가 찾고있는 것으로 생각됩니다. 원하는 소스 라인에 커서를 놓고 F7을 누르십시오.

-scott

+0

고마워요! WinDbg을 사용하고 "커서로 실행"버튼 (F7 또는 Ctrl + F10)을 관찰하지 않습니다. – gavenkoa

1

다시 매우 늦게 대답 그러나 사람은
lsf가 SRC 파일
을로드하는 모든 SRC 옵션을 사용하려면 SRC 라인 지원을
l+* 수 있도록

.lines을 WINDBG에서 소스 레벨 구문을 사용할 수 있습니다 ls from,to 현재 src 파일에서 src 행을 검사합니다.
현재 파일을 보려면
lsc`module!srcfile:linenum` 어떤 SRC 파일에서 모든 줄을 denaote하는 (여기 src syntax needs to be wrapped in grave accents not single quotes)

는 (이것은 WinDBG에서의 defaukt)
l+* 모든 SRC 줄 옵션을 가능하게하여 CDB에서 .lines turns on src line support에있다

샘플 연습

jmpouttaloo:\>dir /b 
jmpouttaloo.cpp 

jmpouttaloo:\>type jmpouttaloo.cpp 
#include <stdio.h> 
int main (void) 
{ 
    int i=0,j=0,k=0,l=0; 
    while (i++ < 100) 
    { 
     while (j++ < 100) 
     { 
      while(k++ < 100) 
      { 
       l++; 
      } 
      l++; 
     } 
     l++; 
    } 
    printf("%d\n",l); 
    return 0; 
} 
jmpouttaloo:\>cl /Zi /nologo jmpouttaloo.cpp 
jmpouttaloo.cpp 

jmpouttaloo:\>dir /b *.exe 
jmpouttaloo.exe 

jmpouttaloo:\>jmpouttaloo.exe 
300 
입니다
lsf로드 src 파일 jmpouttaloo.루프
지금 우리가 체계적으로 각 루프

나가야 할 때 페이지와 스테핑 CPP
set a bp on main and run exe를

jmpouttaloo:\>cdb -c ".lines;l+*; lsf jmpouttaloo.cpp; bp jmpouttaloo!main;g" jmpouttaloo.exe 

우리가 가장 안쪽의 내부에 착륙 단계 당 하나 개의 SRC 라인
6 단계를 단계 ls start , count은 시작 번호부터 시작 번호 + 개수의 src 행을 보여줍니다.

특정 src 행이 나타날 때까지 실행

,451,515,

이 g graveaccent 콜론 LINENUMBER의 graveaccent을

전체 SRC 줄 구문은 우리가 (12)가 다시 9 호선에 우리가 종료해야하는 루프 라인에

0:000> cdb: Reading initial command '.lines;l+*; lsf jmpouttaloo.cpp; bp jmpouttaloo!main;g' 


Breakpoint 0 hit 
> 3: { 
0:000> p 
> 4:  int i=0,j=0,k=0,l=0; 
0:000> 
> 5:  while (i++ < 100) 
0:000> 
> 7:   while (j++ < 100) 
0:000> 
> 9:    while(k++ < 100) 
0:000> 
> 11:     l++; 
0:000> 
> 12:    } 
0:000> 
> 9:    while(k++ < 100) 

graveaccent modulename! filename : linenumber graveaccent 

첫 번째 실행을 다음과 같이 13 호선에서이 루프를 벗어났다.

0:000> ls 13,6 view src lines from line number 13 to 18 (6 lines) 

13:    l++; 
14:   } 
15:   l++; 
16:  } 
17:  printf("%d\n",l); 
18:  return 0; 

0:000> dv view locals we have stepped only once so all locals must be 1 

      j = 0n1 
      l = 0n1 
      k = 0n1 
      i = 0n1 

0:000> g `:13` lets get out of innermost loop and look at the locals 
> 13:    l++; 
0:000> dv 
       j = 0n1 
       l = 0n100 <------- 
       k = 0n101 <------------- 
       i = 0n1 

0:000> g `:15` getting out of second innermost loop and inspect locals 
> 15:   l++; 
0:000> dv 
       j = 0n101 
       l = 0n200 
       k = 0n200 
       i = 0n1 
0:000> g `:17` getting out of all loops and inspect locals 
> 17:  printf("%d\n",l); 
0:000> dv 
       j = 0n200 
       l = 0n300 
       k = 0n200 
       i = 0n101 
0:000> p 
300 <--------------- output of printf 
> 18:  return 0; 
0:000> 

두 번째 실행

another jig this time we break on line 15 straight without even loading the src 


jmpouttaloo:\>cdb -c ".lines;g `jmpouttaloo!jmpouttaloo.cpp:15`;dv;q" jmpouttaloo.exe | grep -A 4 "j =" 
       j = 0n101 
       l = 0n200 
       k = 0n200 
       i = 0n1 
quit: 

jmpouttaloo:\> 
+0

질문에 관심을 가져 주셔서 감사합니다! +1 – gavenkoa