Nejčastější dotazy k ladění nativního kódu

Jak můžu ladit porušení přístupu při spuštění programu mimo ladicí program sady Visual Studio?

Nastavte možnost ladění za běhu a spusťte program samostatně, dokud nedojde k narušení přístupu. Potom v dialogovém okně Narušení přístupu můžete kliknutím na tlačítko Storno spustit ladicí program.

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:

Screenshot of a Microsoft Visual Studio exception dialog, showing a read access violation for 'A->B was nullptr'. The Break button is selected.

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. Pokud se předá jako parametr, ujistěte se, že je předán správně, a nechtěně vytváříte mělké kopie. 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. Další informace o datových zarážek najdete v části Datové zarážky v části Používání zarážek.

Jak zjistím, že 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 Global Flags Utility (gflags.exe) nebo pageheap.exe. Viz /windows-hardware/drivers/debugger/gflags-and-pageheap.

Pokud chcete zjistit, kde je adresa paměti upravena:

  1. Nastavte zarážku dat na 0x00408000. Viz Nastavení zarážky změn dat (pouze nativní jazyk C++).

  2. Když se dostanete na zarážku, pomocí okna Paměť zobrazte obsah paměti počínaje 0x00408000. Další informace naleznete v tématu Systém Windows paměti.

Jak zjistím, kdo předává nesprávnou hodnotu parametru?

Tento problém vyřešíte takto:

  1. Nastavte zarážku umístění na začátku funkce.

  2. Klikněte pravým tlačítkem myši na zarážku a vyberte Podmínka.

  3. V dialogovém okně Podmínka zarážky klikněte na zaškrtávací políčko Podmínka . Viz Upřesňující zarážky.

  4. Zadejte výraz, například Var==3, do textového pole, kde Var je název parametru, který obsahuje chybnou hodnotu, a 3 je chybná hodnota předaná do něj.

  5. Vyberte přepínač True a klikněte na tlačítko OK.

  6. Teď program spusťte znovu. Zarážka způsobí zastavení programu na začátku funkce, pokud Var má parametr hodnotu 3.

  7. 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 opakovaném volání funkce zjistím, jaké volání bylo neúspěšné?

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ám dělat?

U funkce můžete nastavit zarážku s polem Počet přístupů na hodnotu tak vysokou, že se nikdy nedosáhne. V tomto případě, protože se domníváte, že se funkce CnvtV nazývá několikrát, můžete nastavit počet přístupů na 1 000 nebo více. 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 systému Win32?

WINERROR. H v adresáři INCLUDE výchozí instalace systému obsahuje definice kódu chyby pro funkce rozhraní API Win32.

Kód chyby můžete vyhledat zadáním kódu v okně Kukátko nebo v dialogovém okně Rychlé kukátko . Příklad:

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 mohu ladit funkce rozhraní API systému Windows?

Nastavení zarážky ve funkci rozhraní API systému Windows se načtenými symboly NT:

  • Do zarážky funkce zadejte název funkce společně s názvem knihovny DLL, ve které se funkce nachází (viz kontextový operátor). V 32bitovém kódu použijte zdobenou formu názvu funkce. Chcete-li nastavit zarážku na MessageBeep, například musíte zadat následující.

    {,,USER32.DLL}_MessageBeep@4
    

    Pokud 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
    

Další kroky

Další informace o ladění nativního kódu v sadě Visual Studio najdete na těchto odkazech: