次の方法で共有


ネイティブ コードのデバッグに関する 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 でこのコードを実行すると、次の例外ダイアログが表示されます。

ポインターがアクセス違反の原因を特定できない場合は、コードをトレースして、問題の原因となっているポインターが正しく割り当てられていることを確認します。 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.

ポインターがメモリ アドレスを破損しているかどうかを確認するにはどうすればよいですか?

ヒープの破損を確認します。 ほとんどのメモリ破損は、ヒープの破損が原因です。 グローバル フラグ ユーティリティ (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. テキスト ボックスに式 ( Var==3 など) を入力します。ここで、 Var は無効な値を含むパラメーターの名前、 3 は渡された不適切な値です。

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

  6. 次に、プログラムをもう一度実行します。 ブレークポイントにより、 Var パラメーターの値が 3されると、プログラムは関数の先頭で停止します。

  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

アプリをステップ実行するときにフォーカスを維持するにはどうすればよいですか?

例: プログラムにウィンドウアクティブ化の問題があります。 デバッガーを使用してプログラムをステップ実行すると、プログラムがフォーカスを失い続けているため、問題を再現する機能が妨げられます。 フォーカスが失われるのを回避する方法はありますか?

2 台目のコンピューターがある場合は、リモート デバッグを使用します。 ホストでデバッガーを実行している間は、リモート コンピューターでプログラムを操作できます。 詳細については、「 方法: リモート コンピューターを選択する」を参照してください

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 でのネイティブ コードデバッグの詳細については、次のリンクを使用してください。