Freigeben über


Häufig gestellte Fragen zum Debuggen von systemeigenem Code

Wie kann ich Zugriffsverletzungen debuggen, wenn mein Programm außerhalb des Visual Studio-Debuggers ausgeführt wird?

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.

Wie kann ich eine C++-Zugriffsverletzung debuggen?

Wenn Sie eine Zugriffsverletzung in einer Codezeile erhalten, die mehrere Zeiger ableiten, kann es schwierig sein, herauszufinden, welcher Zeiger die Zugriffsverletzung verursacht hat. In Visual Studio benennt das Ausnahmedialogfeld explizit den Zeiger, der die Zugriffsverletzung verursacht hat.

Wenn Sie z. B. den folgenden Code erhalten, sollten Sie eine Zugriffsverletzung erhalten:

#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();

}

Wenn Sie diesen Code in Visual Studio ausführen, sollte das folgende Ausnahmedialogfeld angezeigt werden:

Screenshot eines Microsoft Visual Studio-Ausnahmedialogfelds mit einer Lesezugriffsverletzung für

Wenn Sie nicht ermitteln können, warum der Zeiger eine Zugriffsverletzung verursacht hat, verfolgen Sie den Code, um sicherzustellen, dass der Zeiger, der das Problem verursacht hat, ordnungsgemäß zugewiesen wurde. If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. Stellen Sie dann sicher, dass die Werte nicht versehentlich an einer beliebigen Stelle im Programm geändert werden, indem Sie einen Datentrennpunkt für den betreffenden Zeiger erstellen, um sicherzustellen, dass sie nicht an anderer Stelle im Programm geändert wird. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.

Wie kann ich herausfinden, ob meine Zeiger eine Speicheradresse beschädigt haben?

Überprüfen Sie auf Heapbeschädigung. Die meisten Speicherbeschädigungen sind auf Heapbeschädigung zurückzuführen. Versuchen Sie, das Global Flags Utility (gflags.exe) oder pageheap.exezu verwenden. Siehe GFlags und PageHeap.

So suchen Sie, wo die Speicheradresse geändert wird:

  1. Legen Sie einen Datentrennpunkt auf 0x00408000 fest. Siehe Festlegen eines Datenänderungs-Haltepunkts (nur systemeigenes C++).

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

Wie kann ich herausfinden, wer einen falschen Parameterwert übergibt?

Dieses Problem lässt sich wie folgt beheben:

  1. Legen Sie einen Positionstrennpunkt am Anfang der Funktion fest.

  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. Geben Sie einen Ausdruck, z Var==3. B., in das Textfeld ein, wobei Var der Name des Parameters, der den ungültigen Wert enthält, und 3 der ungültige Wert, der an ihn übergeben wird.

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

  6. Führen Sie nun das Programm erneut aus. Der Haltepunkt bewirkt, dass das Programm am Anfang der Funktion angehalten wird, wenn der Var Parameter den Wert 3aufweist.

  7. Verwenden Sie das Fenster "Aufrufstapel", um die aufrufende Funktion zu finden und zum Quellcode zu navigieren. Weitere Informationen finden Sie unter How to: Use the Call Stack Window.

Wie weiß ich, welcher Anruf fehlgeschlagen ist, wenn eine Funktion hundert mal aufgerufen wird?

Beispiel: Mein Programm schlägt bei einem Aufruf einer bestimmten Funktion fehl. CnvtV Das Programm ruft diese Funktion wahrscheinlich ein paar Hundert Mal auf, bevor sie fehlschlägt. Wenn ich einen Ortsumbruchpunkt CnvtVfestgelegt habe, stoppt das Programm bei jedem Aufruf dieser Funktion, und ich möchte das nicht. Ich weiß nicht, welche Bedingungen dazu führen, dass der Aufruf fehlschlägt, sodass ich keinen bedingten Haltepunkt festlegen kann. Was kann ich tun?

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. Führen Sie dann das Programm aus, und warten Sie, bis der Anruf fehlschlägt. Wenn ein Fehler auftritt, öffnen Sie das Fenster "Haltepunkte", und sehen Sie sich die Liste der Haltepunkte an. Der von Ihnen festgelegte CnvtV Haltepunkt wird angezeigt, gefolgt von der Trefferanzahl und der Anzahl der verbleibenden Iterationen:

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

Sie wissen jetzt, dass die Funktion beim 101. Aufruf fehlgeschlagen ist. Wenn Sie den Haltepunkt mit einer Trefferanzahl von 101 zurücksetzen und das Programm erneut ausführen, stoppt das Programm am Aufruf, der CnvtV dazu führte, dass er fehlschlug.

Wo kann ich Win32-Fehlercodes nachschlagen?

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

Wie kann ich den Fokus behalten, wenn ich meine App durchschreite?

Beispiel: Mein Programm hat ein Problem bei der Fensteraktivierung. Das Durchlaufen des Programms mit dem Debugger beeinträchtigt meine Fähigkeit, das Problem zu reproduzieren, da mein Programm den Fokus verliert. Gibt es eine Möglichkeit, den Fokus zu vermeiden?

Wenn Sie über einen zweiten Computer verfügen, verwenden Sie das Remotedebugging. Sie können Ihr Programm auf dem Remotecomputer ausführen, während Sie den Debugger auf dem Host ausführen. Weitere Informationen finden Sie unter How to: Select a Remote Computer.

Wie kann ich Windows-API-Funktionen debuggen?

So legen Sie einen Haltepunkt für eine Windows-API-Funktion mit geladenen NT-Symbolen fest:

  • In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). Verwenden Sie in 32-Bit-Code die dekorierte Form des Funktionsnamens. To set a breakpoint on MessageBeep, for example, you must enter the following.

    {,,USER32.DLL}_MessageBeep@4
    

    Informationen zum Abrufen des verzierten Namens finden Sie unter "Bestopfte Namen anzeigen".

    Sie können den verzierten Namen testen und im Demontagecode anzeigen. Klicken Sie während der Pause an der Funktion im Visual Studio-Debugger mit der rechten Maustaste auf die Funktion im Code-Editor oder im Aufrufstapelfenster, und wählen Sie "Zur Demontage wechseln" aus.

  • Im 64-Bit-Code können Sie den nicht berechneten Namen verwenden.

    {,,USER32.DLL}MessageBeep
    

Next steps

Weitere Informationen zum debuggen von systemeigenem Code in Visual Studio finden Sie unter folgenden Links: