Jak můžu ladit porušení přístupu při spuštění programu mimo ladicí program sady 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 můžu ladit porušení přístupu jazyka C++?
Pokud dojde k narušení přístupu na řádku kódu, který dereference více ukazatelů, může být obtížné zjistit, který ukazatel způsobil narušení přístupu. V sadě Visual Studio dialogové okno výjimky explicitně pojmenuje ukazatel, který způsobil narušení přístupu.
Například vzhledem k následujícímu kódu byste měli získat porušení přístupu:
#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();
}
Pokud tento kód spustíte v sadě Visual Studio, měli byste vidět následující dialogové okno výjimky:
Pokud nemůžete určit, proč ukazatel způsobil narušení přístupu, projděte kódem a ujistěte se, že byl správně přiřazen ukazatel způsobující problém. If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. Potom ověřte, že se hodnoty nechtěně nemění někde v programu vytvořením datové zarážky pro daný ukazatel, abyste se ujistili, že se neupravuje jinde v programu. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.
Jak zjistím, jestli moje ukazatele poškodily adresu paměti?
Zkontrolujte poškození haldy. Většina poškození paměti je způsobená poškozením haldy. Zkuste použít nástroj Global Flags (gflags.exe) nebo pageheap.exe. Viz GFlags a PageHeap.
Pokud chcete zjistit, kde je adresa paměti upravena:
Nastavte zarážku dat na 0x00408000. Viz Nastavení zarážky změn dat (pouze nativní jazyk C++).
When you hit the breakpoint, use the Memory window to view memory contents starting at 0x00408000. For more information, see Memory Windows.
Jak zjistím, kdo předává nesprávnou hodnotu parametru?
Tento problém vyřešíte takto:
Nastavte zarážku umístění na začátku funkce.
Right-click the breakpoint and select Condition.
In the Breakpoint Condition dialog box, click on the Condition check box. See Advanced Breakpoints.
Zadejte výraz, například
Var==3, do textového pole, kdeVarje název parametru, který obsahuje chybnou hodnotu, a3je chybná hodnota předaná do něj.Select the is True radio button, and click the OK button.
Teď program spusťte znovu. Zarážka způsobí zastavení programu na začátku funkce, pokud
Varmá parametr hodnotu3.Pomocí okna Zásobník volání vyhledejte volající funkci a přejděte do jejího zdrojového kódu. Další informace naleznete v tématu Postupy: Použití okna zásobníku volání.
Jak při volání funkce stokrát zjistím, které volání selhalo?
Příklad: Program selže při volání určité funkce, CnvtV. Program pravděpodobně volá funkci několikrát, než selže. Pokud nastavím zarážku CnvtVmísta , program zastaví při každém volání této funkce, a nechci to. Nevím, jaké podmínky způsobují selhání volání, takže nemůžu nastavit podmíněnou zarážku. Co můžu dělat?
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. Pak spusťte program a počkejte, až volání selže. Pokud selže, otevřete okno Zarážky a prohlédněte si seznam zarážek. Zobrazí se zarážka, kterou jste nastavili CnvtV , a počet zbývajících iterací:
CnvtV(int) (no condition) when hit count is equal to 1000 (currently 101)
Teď víte, že funkce selhala při 101. volání. Pokud resetujete zarážku s počtem přístupů 101 a spustíte program znovu, program se zastaví při volání CnvtV , které způsobilo selhání.
Kde najdu kódy chyb 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 se můžu soustředit při procházení aplikace?
Příklad: Můj program má problém s aktivací okna. Krokování programem s ladicím programem koliduje s možností reprodukovat problém, protože můj program stále ztrácí fokus. Existuje nějaký způsob, jak se vyhnout ztrátě fokusu?
Pokud máte druhý počítač, použijte vzdálené ladění. Program můžete ovládat na vzdáleném počítači při spuštění ladicího programu na hostiteli. Další informace naleznete v tématu Postupy: Výběr vzdáleného počítače.
Jak můžu ladit funkce rozhraní API systému Windows?
Nastavení zarážky ve funkci rozhraní API systému Windows se načtenými symboly NT:
In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). V 32bitovém kódu použijte zdobenou formu názvu funkce. To set a breakpoint on MessageBeep, for example, you must enter the following.
{,,USER32.DLL}_MessageBeep@4Pokud chcete získat zdobený název, podívejte se na zobrazení zdobených jmen.
Dekorovaný název můžete otestovat a zobrazit ho v kódu pro demontáž. Když je funkce v ladicím programu sady Visual Studio pozastavená, klikněte pravým tlačítkem myši na funkci v editoru kódu nebo v okně zásobníku volání a zvolte Přejít na Zpětný překlad.
V 64bitovém kódu můžete použít nepojmenovaný název.
{,,USER32.DLL}MessageBeep
Next steps
Další informace o ladění nativního kódu v sadě Visual Studio najdete na těchto odkazech: