다음을 통해 공유


네이티브 코드 FAQ 디버깅

Visual Studio 디버거 외부에서 프로그램을 실행할 때 액세스 위반을 디버그하려면 어떻게 해야 하나요?

Set the Just-in-time debugging option and run your program stand-alone until the access violation occurs. Then, in the Access Violation dialog box, you can click Cancel to start the debugger.

C++ 액세스 위반을 디버그하려면 어떻게 해야 하나요?

여러 포인터를 역참조하는 코드 줄에서 액세스 위반이 발생하는 경우 액세스 위반을 유발한 포인터를 찾기가 어려울 수 있습니다. Visual Studio에서 예외 대화 상자는 액세스 위반을 일으킨 포인터의 이름을 명시적으로 지정합니다.

예를 들어 다음 코드가 제공되면 액세스 위반이 발생합니다.

#include <iostream>
using namespace std;

class ClassC {
public:
  void printHello() {
    cout << "hello world";
  }
};

class ClassB {
public:
  ClassC* C;
  ClassB() {
    C = new ClassC();
  }
};

class ClassA {
public:
  ClassB* B;
  ClassA() {
    // Uncomment to fix
    // B = new ClassB();
  }
};

int main() {
  ClassA* A = new ClassA();
  A->B->C->printHello();

}

Visual Studio에서 이 코드를 실행하는 경우 다음 예외 대화 상자가 표시됩니다.

'A-B> was nullptr'에 대한 읽기 액세스 위반을 보여 주는 Microsoft Visual Studio 예외 대화 상자의 스크린샷. 중단 단추가 선택되어 있습니다.

포인터가 액세스 위반을 일으킨 이유를 확인할 수 없는 경우 코드를 추적하여 문제를 일으키는 포인터가 올바르게 할당되었는지 확인합니다. If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. 그런 다음 문제의 포인터에 대한 데이터 중단점을 만들어 프로그램의 다른 위치에서 수정되지 않도록 하여 값이 프로그램 어딘가에서 의도치 않게 변경되지 않는지 확인합니다. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.

포인터가 메모리 주소를 손상했는지 어떻게 알 수 있나요?

힙 손상이 있는지 확인합니다. 대부분의 메모리 손상은 힙 손상으로 인한 것입니다. Global Flags 유틸리티(gflags.exe) 또는 pageheap.exe사용해 보세요. GFlags 및 PageHeap을 참조하세요.

메모리 주소가 수정되는 위치를 찾으려면 다음을 수행합니다.

  1. 0x00408000 데이터 중단점을 설정합니다. 데이터 변경 중단점 설정(네이티브 C++만 해당)을 참조하세요.

  2. When you hit the breakpoint, use the Memory window to view memory contents starting at 0x00408000. For more information, see Memory Windows.

잘못된 매개 변수 값을 전달하는 사용자를 어떻게 알 수 있나요?

이 문제를 해결하려면

  1. 함수의 시작 부분에 위치 중단점을 설정합니다.

  2. Right-click the breakpoint and select Condition.

  3. In the Breakpoint Condition dialog box, click on the Condition check box. See Advanced Breakpoints.

  4. 입력란에 잘못된 값이 포함된 매개 변수의 이름과 전달된 잘못된 값 3 인 식(예: Var==3텍스트 상자에Var)을 입력합니다.

  5. Select the is True radio button, and click the OK button.

  6. 이제 프로그램을 다시 실행합니다. 중단점은 매개 변수에 값3이 있는 경우 Var 함수의 시작 부분에서 프로그램이 중단됩니다.

  7. 호출 스택 창을 사용하여 호출 함수를 찾고 해당 소스 코드로 이동합니다. 자세한 내용은 방법: 호출 스택 창 사용을 참조하세요.

함수를 수백 번 호출할 때 실패한 호출을 어떻게 알 수 있나요?

예: 특정 함수 CnvtV를 호출할 때 프로그램이 실패합니다. 프로그램은 아마 실패하기 전에 몇 백 번 그 함수를 호출합니다. 위치 중단점을 CnvtV설정하면 프로그램이 해당 함수에 대한 모든 호출에서 중지되고 원하지 않습니다. 호출이 실패하는 조건을 모르기 때문에 조건부 중단점을 설정할 수 없습니다. 제가 할 수 있는 게 뭐죠?

You can set a breakpoint on the function with the Hit Count field to a value so high that it will never be reached. In this case, because you believe the function CnvtV is called a couple hundred times, you might set Hit Count to 1000 or more. 그런 다음 프로그램을 실행하고 호출이 실패할 때까지 기다립니다. 실패하면 중단점 창을 열고 중단점 목록을 확인합니다. 설정한 CnvtV 중단점이 나타나고 그 다음에 적중 횟수와 남은 반복 횟수가 표시됩니다.

CnvtV(int) (no condition) when hit count is equal to 1000 (currently 101)

이제 함수가 101번째 호출에서 실패했음을 알 수 있습니다. 적중 횟수 101로 중단점을 재설정하고 프로그램을 다시 실행하면 프로그램이 호출 CnvtV 시 중지되어 실패하게 됩니다.

Win32 오류 코드는 어디에서 조회할 수 있나요?

WINERROR.H in the INCLUDE directory of your default system installation contains the error code definitions for the Win32 API functions.

You can look up an error code by typing the code in the Watch window or the QuickWatch dialog box. For example:

0x80000004,hr

앱을 단계별로 실행할 때 포커스를 유지하려면 어떻게 해야 하나요?

예: 프로그램에 창 활성화 문제가 있습니다. 디버거를 사용하여 프로그램을 단계별로 실행하면 프로그램이 계속 포커스를 잃어버리기 때문에 문제를 재현하는 기능이 방해됩니다. 포커스를 잃지 않도록 방지할 수 있는 방법이 있나요?

두 번째 컴퓨터가 있는 경우 원격 디버깅을 사용합니다. 호스트에서 디버거를 실행하는 동안 원격 컴퓨터에서 프로그램을 작동할 수 있습니다. 자세한 내용은 방법: 원격 컴퓨터 선택 방법을 참조하세요.

Windows API 함수를 디버그하려면 어떻게 해야 하나요?

NT 기호가 로드된 Windows API 함수에서 중단점을 설정하려면 다음을 수행합니다.

  • In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). 32비트 코드에서 데코레이팅된 형식의 함수 이름을 사용합니다. To set a breakpoint on MessageBeep, for example, you must enter the following.

    {,,USER32.DLL}_MessageBeep@4
    

    데코레이팅된 이름을 가져오려면 데코레이트된 이름 보기를 참조하세요.

    데코레이팅된 이름을 테스트하고 디스어셈블리 코드에서 볼 수 있습니다. Visual Studio 디버거의 함수에서 일시 중지된 상태에서 코드 편집기 또는 호출 스택 창에서 함수를 마우스 오른쪽 단추 로 클릭하고 디스어셈블리로 이동을 선택합니다.

  • 64비트 코드에서는 디코레이션되지 않은 이름을 사용할 수 있습니다.

    {,,USER32.DLL}MessageBeep
    

Next steps

다음 링크를 사용하여 Visual Studio에서 네이티브 코드 디버깅에 대해 자세히 알아볼 수 있습니다.