Megosztás a következőn keresztül:


Natív kód gyakori kérdések hibakeresése

Hogyan lehet hibakeresést végezni a hozzáférés-szabálysértéseken, ha a programomat a Visual Studio hibakeresőjén kívül futtatom?

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.

Hogyan lehet hibakeresést végezni a C++ hozzáférés megsértése esetén?

Ha olyan kódsoron kap hozzáférés-megsértést, amely több mutatót is késleltet, nehéz lehet megállapítani, hogy melyik mutató okozta a hozzáférés-megsértést. A Visual Studióban a kivétel párbeszédpanel kifejezetten a hozzáférés megsértését okozó mutatót adja meg.

A következő kóddal például hozzáférés-megsértést kell kapnia:

#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();

}

Ha ezt a kódot a Visual Studióban futtatja, a következő kivétel párbeszédpanelnek kell megjelennie:

Képernyőkép egy Microsoft Visual Studio-kivétel párbeszédpanelről, amelyen az

Ha nem tudja megállapítani, hogy az egérmutató miért okozott hozzáférés-megsértést, kövesse végig a kódot, és győződjön meg arról, hogy a problémát okozó mutató megfelelően lett hozzárendelve. If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. Ezután ellenőrizze, hogy az értékek nem változnak-e véletlenül valahol a programban. Ehhez hozzon létre egy adattörési pontot a szóban forgó mutatóhoz, hogy meggyőződjön arról, hogy a program máshol nem módosítja az értékeket. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.

Hogyan deríthetem ki, hogy a mutatóim sérültek-e a memóriacímben?

Ellenőrizze a halom sérülését. A memóriasérülések többségét halomsérülés okozza. Próbálja meg használni a Global Flags segédprogramot (gflags.exe) vagy pageheap.exe. Lásd: GFlags és PageHeap.

A memóriacím módosításának helyének megkeresése:

  1. Állítson be egy adattörési pontot 0x00408000. Lásd: Adatváltozási töréspont beállítása (csak natív C++ esetén).

  2. When you hit the breakpoint, use the Memory window to view memory contents starting at 0x00408000. For more information, see Memory Windows.

Hogyan deríthetem ki, hogy ki ad át rossz paraméterértéket?

A probléma megoldása:

  1. Állítson be egy helytörési pontot a függvény elején.

  2. Right-click the breakpoint and select Condition.

  3. In the Breakpoint Condition dialog box, click on the Condition check box. See Advanced Breakpoints.

  4. Adjon meg egy kifejezést(például Var==3) a szövegmezőbe, ahol Var a paraméter neve tartalmazza a hibás értéket, és 3 a hibás értéket adja át neki.

  5. Select the is True radio button, and click the OK button.

  6. Most futtassa újra a programot. A töréspont hatására a program leáll a függvény elején, amikor a Var paraméter értéke 3meg van adva.

  7. A Hívásverem ablakban keresse meg a hívó függvényt, és keresse meg a forráskódot. További információ : Útmutató: A Hívásverem ablak használata.

Ha több százszor hívok meg függvényeket, honnan tudhatom, hogy melyik hívás meghiúsult?

Példa: A programom egy adott függvény hívása esetén meghiúsul. CnvtV A program valószínűleg néhány százszor hívja meg a függvényt, mielőtt sikertelen lenne. Ha beállítok egy helymegszakítási CnvtVpontot, a program leáll a függvény minden hívásán, és ezt nem akarom. Nem tudom, milyen feltételek miatt hiúsul meg a hívás, ezért nem tudok feltételes töréspontot beállítani. Mit tehetek?

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. Ezután futtassa a programot, és várja meg, amíg a hívás sikertelen lesz. Ha nem sikerül, nyissa meg a Töréspontok ablakot, és tekintse meg a töréspontok listáját. Megjelenik a beállított CnvtV töréspont, amelyet a találatok száma és a fennmaradó iterációk száma követ:

CnvtV(int) (no condition) when hit count is equal to 1000 (currently 101)

Most már tudja, hogy a függvény a 101. hívás során meghiúsult. Ha alaphelyzetbe állítja a töréspontot 101-et tartalmazó találatszámmal, és ismét futtatja a programot, a program leáll a hívásnál CnvtV , amely miatt sikertelen volt.

Hol kereshetek Win32-hibakódokat?

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

Hogyan tarthatom a fókuszt az alkalmazásomon való áthaladáskor?

Példa: A programom ablakaktiválási problémával rendelkezik. A programon való áthaladás a hibakeresővel zavarja a probléma reprodukálásának képességét, mert a programom folyamatosan elveszíti a fókuszt. Van mód arra, hogy elkerülje a fókusz elvesztését?

Ha van egy második számítógépe, használjon távoli hibakeresést. A programot a távoli számítógépen is futtathatja, miközben futtatja a hibakeresőt a gazdagépen. További információ : Útmutató: Távoli számítógép kiválasztása.

Hogyan lehet hibakeresést végezni a Windows API-függvények között?

Töréspont beállítása egy Windows API-függvényen NT-szimbólumokkal betöltve:

  • In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). 32 bites kódban használja a függvénynév díszített formáját. To set a breakpoint on MessageBeep, for example, you must enter the following.

    {,,USER32.DLL}_MessageBeep@4
    

    A kitüntetett név beszerzéséhez lásd: Díszített nevek megtekintése.

    Tesztelheti a kitüntetett nevet, és szétszerelési kódban tekintheti meg. Miközben a Visual Studio hibakeresőjében szüneteltette a függvényt, kattintson a jobb gombbal a függvényre a kódszerkesztőben vagy a hívási veremablakban, és válassza az Ugrás a szétszerelésre lehetőséget.

  • A 64 bites kódban használhatja a fel nem használt nevet.

    {,,USER32.DLL}MessageBeep
    

Next steps

A Visual Studióban a natív kódkeresésről az alábbi hivatkozások segítségével tudhat meg többet: