Jak debugować naruszenia dostępu podczas uruchamiania programu poza debugerem programu 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.
Jak debugować naruszenie dostępu w języku C++?
Jeśli uzyskasz naruszenie dostępu w wierszu kodu, który wyłudza wiele wskaźników, może być trudno ustalić, który wskaźnik spowodował naruszenie dostępu. W programie Visual Studio okno dialogowe wyjątku jawnie nazywa wskaźnik, który spowodował naruszenie dostępu.
Na przykład, biorąc pod uwagę następujący kod, należy uzyskać naruszenie dostępu:
#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();
}
Jeśli uruchomisz ten kod w programie Visual Studio, powinno zostać wyświetlone następujące okno dialogowe wyjątku:
Jeśli nie możesz określić, dlaczego wskaźnik spowodował naruszenie dostępu, prześledź kod, aby upewnić się, że wskaźnik powodujący problem został przypisany poprawnie. If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. Następnie sprawdź, czy wartości nie są przypadkowo zmieniane w programie, tworząc punkt przerwania danych dla danego wskaźnika, aby upewnić się, że nie jest modyfikowany w innym miejscu w programie. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.
Jak sprawdzić, czy wskaźniki uszkodzą adres pamięci?
Sprawdź uszkodzenie stert. Większość uszkodzeń pamięci jest spowodowana uszkodzeniem stert. Spróbuj użyć narzędzia Global Flags (gflags.exe) lub pageheap.exe. Zobacz GFlags i PageHeap.
Aby dowiedzieć się, gdzie jest modyfikowany adres pamięci:
Ustaw punkt przerwania danych na 0x00408000. Zobacz Ustawianie punktu przerwania zmiany danych (tylko natywny język C++).
When you hit the breakpoint, use the Memory window to view memory contents starting at 0x00408000. For more information, see Memory Windows.
Jak sprawdzić, kto przekazuje nieprawidłową wartość parametru?
Aby rozwiązać ten problem:
Ustaw punkt przerwania lokalizacji na początku funkcji.
Right-click the breakpoint and select Condition.
In the Breakpoint Condition dialog box, click on the Condition check box. See Advanced Breakpoints.
Wprowadź wyrażenie, takie jak
Var==3, w polu tekstowym, gdzieVarjest nazwą parametru zawierającego złą wartość i3jest nieprawidłową wartością przekazaną do niego.Select the is True radio button, and click the OK button.
Teraz ponownie uruchom program. Punkt przerwania powoduje zatrzymanie programu na początku funkcji, gdy
Varparametr ma wartość3.Użyj okna Stos wywołań, aby znaleźć funkcję wywołującą i przejść do jej kodu źródłowego. Aby uzyskać więcej informacji, zobacz How to: Use the Call Stack Window (Instrukcje: używanie okna stosu wywołań).
Jak sprawdzić, które wywołanie funkcji zakończyło się niepowodzeniem podczas wywoływania funkcji setki razy?
Przykład: Mój program kończy się niepowodzeniem przy wywołaniu określonej funkcji . CnvtV Program prawdopodobnie wywołuje tę funkcję kilkaset razy, zanim zakończy się niepowodzeniem. Jeśli ustawię punkt przerwania lokalizacji na CnvtV, program zatrzymuje się na każdym wywołaniu tej funkcji i nie chcę tego. Nie wiem, jakie warunki powodują niepowodzenie wywołania, więc nie mogę ustawić warunkowego punktu przerwania. Co mogę zrobić?
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. Następnie uruchom program i poczekaj na niepowodzenie wywołania. Gdy zakończy się to niepowodzeniem, otwórz okno Punkty przerwania i przyjrzyj się liście punktów przerwania. Zostanie wyświetlony punkt CnvtV przerwania, po którym następuje liczba trafień i liczba pozostałych iteracji:
CnvtV(int) (no condition) when hit count is equal to 1000 (currently 101)
Teraz wiesz, że funkcja nie powiodła się podczas wywołania 101. Jeśli zresetujesz punkt przerwania z liczbą trafień 101 i ponownie uruchomisz program, program zatrzyma wywołanie, które CnvtV spowodowało jego niepowodzenie.
Gdzie można wyszukać kody błędów 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
Jak zachować fokus podczas przechodzenia przez aplikację?
Przykład: Mój program ma problem z aktywacją okien. Przechodzenie przez program z debugerem zakłóca moją zdolność do odtworzenia problemu, ponieważ mój program ciągle traci fokus. Czy istnieje jakiś sposób, aby uniknąć utraty koncentracji uwagi?
Jeśli masz drugi komputer, użyj zdalnego debugowania. Program można obsługiwać na komputerze zdalnym podczas uruchamiania debugera na hoście. Aby uzyskać więcej informacji, zobacz How to: Select a Remote Computer (Instrukcje: wybieranie komputera zdalnego).
Jak mogę debugować funkcje interfejsu API systemu Windows?
Aby ustawić punkt przerwania w funkcji interfejsu API systemu Windows z załadowanymi symbolami NT:
In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). W 32-bitowym kodzie użyj ozdobionej formy nazwy funkcji. To set a breakpoint on MessageBeep, for example, you must enter the following.
{,,USER32.DLL}_MessageBeep@4Aby uzyskać nazwę ozdobioną, zobacz Wyświetlanie nazw ozdobionych.
Możesz przetestować nazwę ozdobioną i wyświetlić ją w kodzie dezasemblacji. Podczas wstrzymania funkcji w debugerze programu Visual Studio kliknij prawym przyciskiem myszy funkcję w edytorze kodu lub oknie stosu wywołań i wybierz polecenie Przejdź do dezasemblacji.
W 64-bitowym kodzie można użyć nazwy nieukodowanej.
{,,USER32.DLL}MessageBeep
Next steps
Aby dowiedzieć się więcej na temat debugowania kodu natywnego w programie Visual Studio, skorzystaj z następujących linków: