Dela via


Vanliga frågor och svar om felsökning av inbyggd kod

Hur kan jag felsöka åtkomstöverträdelser när jag kör mitt program utanför Visual Studio-felsökningsprogrammet?

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.

Hur kan jag felsöka en C++-åtkomstöverträdelse?

Om du får en åtkomstöverträdelse på en kodrad som avrefereras flera pekare kan det vara svårt att ta reda på vilken pekare som orsakade åtkomstöverträdelsen. I Visual Studio namnger undantagsdialogrutan uttryckligen pekaren som orsakade åtkomstöverträdelsen.

Med hjälp av följande kod bör du till exempel få en åtkomstöverträdelse:

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

}

Om du kör den här koden i Visual Studio bör du se följande undantagsdialogruta:

Skärmbild av en microsoft Visual Studio-undantagsdialogruta som visar en överträdelse av läsåtkomst för

Om du inte kan avgöra varför pekaren orsakade en åtkomstöverträdelse kan du spåra koden för att se till att pekaren som orsakar problemet har tilldelats korrekt. If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. Kontrollera sedan att värdena inte oavsiktligt ändras någonstans i programmet genom att skapa en data brytpunkt för pekaren i fråga för att se till att den inte ändras någon annanstans i programmet. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.

Hur tar jag reda på om mina pekare skadar en minnesadress?

Sök efter heapkorruption. De flesta minneskorruptioner beror på att högen är skadad. Prova att använda verktyget Globala flaggor (gflags.exe) eller pageheap.exe. Se GFlags och PageHeap.

Så här tar du reda på var minnesadressen ändras:

  1. Ange en data brytpunkt till 0x00408000. Se Ange en dataändrings brytpunkt (endast intern C++).

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

Hur kan jag ta reda på vem som skickar fel parametervärde?

Så här löser du problemet:

  1. Ange en platsbrytpunkt i början av funktionen.

  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. Ange ett uttryck, till exempel Var==3, i textrutan, där Var är namnet på parametern som innehåller det felaktiga värdet och 3 är det felaktiga värdet som skickas till det.

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

  6. Kör programmet igen. Brytpunkten gör att programmet stoppas i början av funktionen när parametern Var har värdet 3.

  7. Använd fönstret Samtalsstack för att hitta den anropande funktionen och navigera till källkoden. Mer information finns i How to: Use the Call Stack Window (Så här gör du: Använd anropsstackfönstret).

Hur vet jag vilket anrop som misslyckades när jag anropar en funktion hundratals gånger?

Exempel: Mitt program misslyckas vid ett anrop till en viss funktion, CnvtV. Programmet anropar förmodligen den funktionen ett par hundra gånger innan den misslyckas. Om jag ställer in en plats brytpunkt på CnvtVstoppas programmet vid varje anrop till den funktionen, och det vill jag inte. Jag vet inte vilka villkor som gör att anropet misslyckas, så jag kan inte ange en villkorlig brytpunkt. Vad kan jag göra?

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. Kör sedan programmet och vänta tills anropet misslyckas. När det misslyckas öppnar du fönstret Brytpunkter och tittar på listan över brytpunkter. Brytpunkten som du anger CnvtV visas, följt av antalet träffar och antalet iterationer som återstår:

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

Nu vet du att funktionen misslyckades vid det 101:a anropet. Om du återställer brytpunkten med ett träffantal på 101 och kör programmet igen stoppas programmet vid anropet till CnvtV som gjorde att det misslyckades.

Var kan jag leta upp Win32-felkoder?

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

Hur kan jag hålla fokus när jag går igenom min app?

Exempel: Mitt program har problem med fönsteraktivering. Att gå igenom programmet med felsökningsprogrammet stör min förmåga att återskapa problemet eftersom mitt program fortsätter att förlora fokus. Finns det något sätt att undvika att förlora fokus?

Om du har en andra dator använder du fjärrfelsökning. Du kan använda programmet på fjärrdatorn medan du kör felsökningsprogrammet på värden. Mer information finns i Så här: Välj en fjärrdator.

Hur kan jag felsöka Windows API-funktioner?

Så här anger du en brytpunkt för en Windows API-funktion med NT-symboler inlästa:

  • In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). Använd den dekorerade formen av funktionsnamnet i 32-bitarskod. To set a breakpoint on MessageBeep, for example, you must enter the following.

    {,,USER32.DLL}_MessageBeep@4
    

    Information om hur du hämtar det dekorerade namnet finns i Visa dekorerade namn.

    Du kan testa det dekorerade namnet och visa det i demonteringskod. När du har pausat funktionen i Visual Studio-felsökningsprogrammet högerklickar du på funktionen i kodredigeraren eller anropsstackfönstret och väljer Gå till Demontera.

  • I 64-bitarskod kan du använda det odekorerade namnet.

    {,,USER32.DLL}MessageBeep
    

Next steps

Du kan lära dig mer om intern kodfelsökning i Visual Studio med hjälp av följande länkar: