Hoe kan ik fouten opsporen in toegangsschendingen bij het uitvoeren van mijn programma buiten het Foutopsporingsprogramma van 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.
Hoe kan ik fouten opsporen in een C++-toegangsschending?
Als u een toegangsfout krijgt op een coderegel die meerdere aanwijzers deducteert, kan het lastig zijn om erachter te komen welke aanwijzer de toegangsschending heeft veroorzaakt. In Visual Studio verwijst het dialoogvenster uitzondering expliciet naar de aanwijzer die de toegangsfout heeft veroorzaakt.
Als u bijvoorbeeld de volgende code hebt, krijgt u een schending van de toegang:
#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();
}
Als u deze code uitvoert in Visual Studio, ziet u het volgende uitzonderingsdialoogvenster:
Als u niet kunt bepalen waarom de aanwijzer een toegangsschending heeft veroorzaakt, volgt u de code om ervoor te zorgen dat de aanwijzer die het probleem veroorzaakt correct is toegewezen. If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. Controleer vervolgens of de waarden niet onbedoeld ergens in het programma worden gewijzigd door een gegevensonderbrekingspunt te maken voor de betreffende aanwijzer om ervoor te zorgen dat deze niet ergens anders in het programma wordt gewijzigd. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.
Hoe kan ik erachter komen of mijn aanwijzers een geheugenadres beschadigen?
Controleer op heap corruptie. De meeste geheugenbeschadiging is te wijten aan heap-corruptie. Probeer het hulpprogramma Global Flags (gflags.exe) of pageheap.exete gebruiken. Zie GFlags en PageHeap.
Ga als volgt te werk om te bepalen waar het geheugenadres is gewijzigd:
Stel een gegevensonderbrekingspunt in op 0x00408000. Zie Onderbrekingspunt voor gegevenswijziging instellen (alleen systeemeigen C++ ).
When you hit the breakpoint, use the Memory window to view memory contents starting at 0x00408000. For more information, see Memory Windows.
Hoe kan ik achterhalen wie een verkeerde parameterwaarde doorgeeft?
U kunt dit probleem als volgt oplossen:
Stel een locatie-onderbrekingspunt in aan het begin van de functie.
Right-click the breakpoint and select Condition.
In the Breakpoint Condition dialog box, click on the Condition check box. See Advanced Breakpoints.
Voer een expressie in, zoals
Var==3, in het tekstvak, waarVarde naam is van de parameter die de ongeldige waarde bevat en3de ongeldige waarde is die eraan wordt doorgegeven.Select the is True radio button, and click the OK button.
Voer het programma nu opnieuw uit. Het onderbrekingspunt zorgt ervoor dat het programma stopt aan het begin van de functie wanneer de
Varparameter de waarde3heeft.Gebruik het venster Aanroepstack om de aanroepende functie te zoeken en naar de bijbehorende broncode te navigeren. Zie Het venster Aanroepstack gebruiken voor meer informatie.
Hoe weet ik bij het aanroepen van een functie honderden keren welke aanroep is mislukt?
Voorbeeld: Mijn programma mislukt bij een aanroep naar een bepaalde functie, CnvtV. Het programma roept die functie waarschijnlijk een paar honderd keer aan voordat het mislukt. Als ik een locatieonderbrekingspunt CnvtVinstel, stopt het programma bij elke aanroep naar die functie en ik wil dat niet. Ik weet niet welke voorwaarden ervoor zorgen dat de aanroep mislukt, dus ik kan geen voorwaardelijk onderbrekingspunt instellen. Wat kan ik doen?
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. Voer vervolgens het programma uit en wacht tot de aanroep mislukt. Als dit mislukt, opent u het venster Onderbrekingspunten en bekijkt u de lijst met onderbrekingspunten. Het onderbrekingspunt dat u hebt ingesteld CnvtV , wordt weergegeven, gevolgd door het aantal treffers en het resterende aantal iteraties:
CnvtV(int) (no condition) when hit count is equal to 1000 (currently 101)
U weet nu dat de functie is mislukt tijdens de 101e aanroep. Als u het onderbrekingspunt opnieuw instelt met het aantal treffers van 101 en het programma opnieuw uitvoert, stopt het programma bij de aanroep CnvtV waardoor het is mislukt.
Waar kan ik Win32-foutcodes opzoeken?
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
Hoe kan ik de focus behouden bij het doorlopen van mijn app?
Voorbeeld: Mijn programma heeft een probleem met vensteractivering. Het doorlopen van het programma met het foutopsporingsprogramma interfereert met mijn vermogen om het probleem te reproduceren omdat mijn programma de focus blijft verliezen. Is er een manier om te voorkomen dat de focus verloren gaat?
Als u een tweede computer hebt, gebruikt u externe foutopsporing. U kunt uw programma uitvoeren op de externe computer terwijl u het foutopsporingsprogramma op de host uitvoert. Zie Een externe computer selecteren voor meer informatie.
Hoe kan ik fouten opsporen in Windows API-functies?
Een onderbrekingspunt instellen voor een Windows API-functie met NT-symbolen geladen:
In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). Gebruik in 32-bits code de versierde vorm van de functienaam. To set a breakpoint on MessageBeep, for example, you must enter the following.
{,,USER32.DLL}_MessageBeep@4Zie De versieringsnamen bekijken om de versieringsnaam te verkrijgen.
U kunt de versierde naam testen en bekijken in de demontagecode. Terwijl de functie in het foutopsporingsprogramma van Visual Studio is onderbroken, klikt u met de rechtermuisknop op de functie in de code-editor of het aanroepstackvenster en kiest u Go to Disassembly.
In 64-bits code kunt u de niet-geclassificeerde naam gebruiken.
{,,USER32.DLL}MessageBeep
Next steps
U vindt meer informatie over systeemeigen codeopsporing in Visual Studio met behulp van deze koppelingen: