어셈블리 모드에서 디버깅

애플리케이션에 대한 C 또는 C++ 원본 파일이 있는 경우 소스 모드에서 디버그하는 경우 디버거를 훨씬 더 강력하게 사용할 수 있습니다.

그러나 원본 디버깅을 수행할 수 없는 경우가 많습니다. 애플리케이션에 대한 원본 파일이 없을 수 있습니다. 다른 사람의 코드를 디버깅할 수 있습니다. 전체 .pdb 기호를 사용하여 실행 파일을 빌드하지 않았을 수 있습니다. 애플리케이션에서 원본 디버깅을 수행할 수 있더라도 애플리케이션이 호출하거나 애플리케이션을 로드하는 데 사용되는 Microsoft Windows 루틴을 추적해야 할 수 있습니다.

이러한 경우 어셈블리 모드에서 디버그해야 합니다. 또한 어셈블리 모드에는 소스 디버깅에 없는 많은 유용한 기능이 있습니다. 디버거는 액세스될 때 메모리 위치 및 레지스터의 내용을 자동으로 표시하고 프로그램 카운터의 주소를 표시합니다. 이 디스플레이를 사용하면 어셈블리 디버깅을 원본 디버깅과 함께 사용할 수 있는 유용한 도구가 됩니다.

디스어셈블리 코드

디버거는 주로 이진 실행 코드를 분석합니다. 디버거는 이 코드를 원시 형식으로 표시하는 대신 이 코드를 디스어셈블합니다 . 즉, 디버거는 코드를 컴퓨터 언어에서 어셈블리 언어로 변환합니다.

결과 코드( 디스어셈블리 코드라고 함)를 여러 가지 방법으로 표시할 수 있습니다.

  • u(Unassemble) 명령은 컴퓨터 언어의 지정된 섹션을 디스어셈블하고 표시합니다.

  • uf(Unassemble Function) 명령은 함수를 디스어셈블하고 표시합니다.

  • 위쪽(실제 메모리에서 어셈블 해제) 명령은 실제 메모리에 저장된 컴퓨터 언어의 지정된 섹션을 디스어셈블하고 표시합니다.

  • (Unassemble Real Mode BIOS) 명령은 지정된 16비트 실제 모드 코드를 디스어셈블하고 표시합니다.

  • ux(Unassemble x86 BIOS) 명령은 지정된 주소에 설정된 x86 기반 BIOS 코드 명령을 디스어셈블하고 표시합니다.

  • (WinDbg에만 해당) 디스어셈블리 창은 컴퓨터 언어의 지정된 섹션을 디스어셈블하고 표시합니다. 창 메뉴에서 자동으로 디스어셈블리 열기 명령을 선택하면 이 이 자동으로 활성화됩니다. 보기 메뉴에서 디스어셈블리를 선택하거나, alt+7을 누르거나, 디스어셈블리(alt+7) 단추를 눌러 이 창을 열 수도 있습니다.

디스어셈블리 표시는 주소 오프셋, 이진 코드, 어셈블리 언어 니모닉 및 어셈블리 언어 세부 정보의 네 열에 표시됩니다. 다음 예제에서는 이 디스플레이를 보여줍니다.

0040116b    45          inc         ebp            
0040116c    fc          cld                        
0040116d    8945b0      mov         eax,[ebp-0x1c] 

현재 프로그램 카운터를 나타내는 줄의 오른쪽에는 액세스 중인 메모리 위치 또는 레지스터의 값이 표시됩니다. 이 줄에 분기 명령이 포함되어 있으면 표기법 [br=1] 또는 [br=0] 이 나타납니다. 이 표기법은 각각 또는 가 수행되지 않는 분기를 나타냅니다.

.asm(디스어셈블리 옵션 변경) 명령을 사용하여 디스어셈블된 명령이 표시되는 방식을 변경할 수 있습니다.

WinDbg의 디스어셈블리 창에서 현재 프로그램 카운터를 나타내는 줄이 강조 표시됩니다. 중단점이 설정된 줄도 강조 표시됩니다.

다음 명령을 사용하여 어셈블리 코드를 조작할 수도 있습니다.

  • #(디스어셈블리 패턴 검색) 명령은 메모리 영역에서 특정 패턴을 검색합니다. 이 명령은 디스어셈블리 디스플레이의 4개 열을 검색하는 것과 같습니다.

  • (Assemble) 명령은 어셈블리 지침을 받아 이진 머신 코드로 변환할 수 있습니다.

어셈블리 모드 및 소스 모드

디버거에는 어셈블리 모드와 소스 모드라는 두 가지 작동 모드가 있습니다.

애플리케이션을 한 단계씩 실행하는 경우 단일 단계의 크기는 모드에 따라 어셈블리 코드 한 줄 또는 소스 코드 한 줄입니다.

여러 명령은 모드에 따라 다른 데이터 표시를 만듭니다.

WinDbg에서 어셈블리 모드에서 애플리케이션을 실행하거나 단계별로 실행하면 디스어셈블리 창 이 자동으로 포그라운드로 이동합니다. 소스 모드에서 원본 창 은 포그라운드로 이동합니다.

모드를 설정하려면 다음 중 하나를 수행할 수 있습니다.

  • l+, l- (소스 옵션 설정) 명령을 사용하여 모드를 제어합니다. l-t 명령은 어셈블리 모드를 활성화합니다.

  • (WinDbg에만 해당) 디버그 메뉴에서 소스 모드 명령을 지우면 디버거가 어셈블리 모드로 전환됩니다. 도구 모음에서 소스 모드 끄기 단추를 선택할 수도 있습니다.

WinDbg에서 어셈블리 모드에 있는 경우 ASM이 상태 표시줄에 표시됩니다.

WinDbg의 디스어셈블리 창의 바로 가기 메뉴에는 현재 소스 줄 명령의 강조 표시 지침이 포함되어 있습니다 . 이 명령은 현재 소스 줄에 해당하는 모든 지침을 강조 표시합니다. 일반적으로 단일 소스 줄은 여러 어셈블리 지침에 해당합니다. 코드가 최적화된 경우 이러한 어셈블리 명령이 연속되지 않을 수 있습니다. 현재 소스 줄 명령의 강조 표시 명령을 사용하면 현재 소스 줄에서 어셈블된 모든 지침을 찾을 수 있습니다.

어셈블리 언어 원본 파일

애플리케이션이 어셈블리 언어로 작성된 경우 디버거에서 생성하는 디스어셈블리가 원래 코드와 정확히 일치하지 않을 수 있습니다. 특히 NO-OPs 및 주석은 존재하지 않습니다.

원래 .asm 파일을 참조하여 코드를 디버그하려면 소스 모드 디버깅을 사용해야 합니다. C 또는 C++ 소스 파일과 같은 어셈블리 파일을 로드할 수 있습니다. 이러한 종류의 디버깅에 대한 자세한 내용은 소스 모드에서 디버깅을 참조하세요.