다음을 통해 공유


어셈블리 모드에서 디버깅

애플리케이션에 대한 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개 열을 검색하는 것과 같습니다.

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

어셈블리 모드 및 소스 모드

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

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

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

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

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

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

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

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

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

어셈블리 언어 원본 파일

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

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