Come è possibile eseguire il debug delle violazioni di accesso quando si esegue il programma all'esterno del debugger di 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.
Come è possibile eseguire il debug di una violazione di accesso C++?
Se si verifica una violazione di accesso su una riga di codice che dereferenzia più puntatori, può essere difficile individuare il puntatore che ha causato la violazione di accesso. In Visual Studio la finestra di dialogo eccezione assegna un nome esplicito al puntatore che ha causato la violazione di accesso.
Ad esempio, dato il codice seguente, si dovrebbe ottenere una violazione di accesso:
#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();
}
Se si esegue questo codice in Visual Studio, verrà visualizzata la finestra di dialogo di eccezione seguente:
Se non è possibile determinare il motivo per cui il puntatore ha causato una violazione di accesso, tracciare il codice per assicurarsi che il puntatore che causa il problema sia stato assegnato correttamente. If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. Verificare quindi che i valori non vengano modificati involontariamente in un punto del programma creando un punto di interruzione dati per il puntatore in questione per assicurarsi che non venga modificato altrove nel programma. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.
Come è possibile verificare se i puntatori danneggiano un indirizzo di memoria?
Verificare la presenza di danneggiamento dell'heap. La maggior parte del danneggiamento della memoria è dovuta al danneggiamento dell'heap. Provare a usare l'utilità Global Flags (gflags.exe) o pageheap.exe. Vedere GFlags e PageHeap.
Per trovare dove viene modificato l'indirizzo di memoria:
Impostare un punto di interruzione dei dati in 0x00408000. Vedere Impostare un punto di interruzione delle modifiche ai dati (solo C++ nativo).
When you hit the breakpoint, use the Memory window to view memory contents starting at 0x00408000. For more information, see Memory Windows.
Come è possibile scoprire chi sta passando un valore di parametro errato?
Per risolvere questo problema:
Impostare un punto di interruzione della posizione all'inizio della funzione.
Right-click the breakpoint and select Condition.
In the Breakpoint Condition dialog box, click on the Condition check box. See Advanced Breakpoints.
Immettere un'espressione, ad esempio
Var==3, nella casella di testo, doveVarè il nome del parametro che contiene il valore non valido ed3è il valore non valido passato.Select the is True radio button, and click the OK button.
Eseguire di nuovo il programma. Il punto di interruzione fa sì che il programma si arresti all'inizio della funzione quando il
Varparametro ha il valore3.Usare la finestra Stack di chiamate per trovare la funzione chiamante e passare al relativo codice sorgente. Per altre informazioni, vedere Procedura: Usare la finestra Stack di chiamate.
Quando si chiama una funzione centinaia di volte, come si sa quale chiamata non è riuscita?
Esempio: il programma non riesce in una chiamata a una determinata funzione, CnvtV. Il programma probabilmente chiama tale funzione un paio di centinaia di volte prima che non riesca. Se si imposta un punto di interruzione della posizione in CnvtV, il programma si arresta su ogni chiamata a tale funzione e non lo si vuole. Non si conoscono le condizioni che causano l'esito negativo della chiamata, quindi non è possibile impostare un punto di interruzione condizionale. Cosa posso fare?
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. Eseguire quindi il programma e attendere che la chiamata non riesca. Quando ha esito negativo, aprire la finestra Punti di interruzione e esaminare l'elenco dei punti di interruzione. Viene visualizzato il punto di interruzione impostato su CnvtV , seguito dal numero di passaggi e dal numero di iterazioni rimanenti:
CnvtV(int) (no condition) when hit count is equal to 1000 (currently 101)
Ora si sa che la funzione non è riuscita nella chiamata 101. Se si reimposta il punto di interruzione con un numero di passaggi pari a 101 ed eseguire di nuovo il programma, il programma si arresta alla chiamata a CnvtV che ha causato l'esito negativo.
Dove è possibile cercare i codici di errore 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
Come è possibile mantenere lo stato attivo durante l'esecuzione dell'app?
Esempio: il programma presenta un problema di attivazione della finestra. L'esecuzione del programma con il debugger interferisce con la mia capacità di riprodurre il problema perché il programma continua a perdere lo stato attivo. Esiste un modo per evitare di perdere lo stato attivo?
Se si dispone di un secondo computer, usare il debug remoto. È possibile gestire il programma nel computer remoto mentre si esegue il debugger nell'host. Per altre informazioni, vedere Procedura: Selezionare un computer remoto.
Come è possibile eseguire il debug delle funzioni api di Windows?
Per impostare un punto di interruzione in una funzione API di Windows con simboli NT caricati:
In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). Nel codice a 32 bit usare la forma decorata del nome della funzione. To set a breakpoint on MessageBeep, for example, you must enter the following.
{,,USER32.DLL}_MessageBeep@4Per ottenere il nome decorato, vedere Visualizzazione dei nomi decorati.
È possibile testare il nome decorato e visualizzarlo nel codice disassembly. Durante la sospensione della funzione nel debugger di Visual Studio, fare clic con il pulsante destro del mouse sulla funzione nell'editor di codice o nella finestra dello stack di chiamate e scegliere Vai a Disassembly.
Nel codice a 64 bit è possibile usare il nome non dichiarato.
{,,USER32.DLL}MessageBeep
Next steps
Per altre informazioni sul debug del codice nativo in Visual Studio, vedere i collegamenti seguenti: