Nem egyértelmű töréspont megoldása

A hibakereső motor 10.0.25310.1001-es és újabb verziójában mostantól támogatott a nem egyértelmű töréspont-felbontás.

A nem egyértelmű töréspontok lehetővé teszik, hogy a hibakereső töréspontokat állítson be olyan helyzetekben, amikor egy töréspont-kifejezés több helyre is feloldható. Ez például akkor fordulhat elő, ha:

  • Egy függvény többszörös túlterhelése.
  • Több szimbólum is létezik, amelyek egy töréspont-kifejezésnek felelnek meg.
  • Ugyanaz a szimbólumnév több helyen is használatos.
  • A szimbólum be van ágyazva.
  • Töréspont beállítása egy sablonfüggvényben, amely többször van példányosítva a forrásablakban.

Ha engedélyezve van, a hibakereső egy töréspontot állít be az egyes szimbólumokon egy adott töréspont-kifejezéshez. A hibakereső a szimbólumok egyezéseit is szűri, ha bizonyos feltételek teljesülnek.

A töréspontok használatával kapcsolatos általános információkért lásd: Töréspontok használata.

Egyértelműtlen töréspont-felbontás engedélyezése

Alapértelmezés szerint a nem egyértelmű töréspontok le vannak tiltva. Ha ezt hibakereső munkamenetben szeretné engedélyezni, futtassa ezt a parancsot a WinDbg konzolon:

dx @$debuggerRootNamespace.Debugger.Settings.EngineInitialization.ResolveAmbiguousBreakpoints = true;

Annak ellenőrzéséhez, hogy a nem egyértelmű töréspontok beállítása aktív-e:

0:010> dx @$debuggerRootNamespace.Debugger.Settings.EngineInitialization.ResolveAmbiguousBreakpoints
@$debuggerRootNamespace.Debugger.Settings.EngineInitialization.ResolveAmbiguousBreakpoints                 : true

A dx parancs használatáról további információt a dx (Debugger objektummodell-kifejezés megjelenítése) című témakörben talál.

A funkció letiltásához állítsa be a fenti értéket false. Ha meg szeretné győződni arról, hogy a beállítás a munkamenetek között is megmarad, kattintson rá File -> Settings -> Debugger Settings , majd jelölje be a bejelölt jelölőnégyzetet Persist engine settings across debugger sessions.

A használat egyetlen töréspontra vonatkozik

A nem egyértelmű töréspont-kifejezések feloldása csak a töréspont parancs futtatására vonatkozik, hogy egyetlen töréspontot állítson be a hibakeresőben. Más szóval, ha több töréspontot állít be a bm paranccsal, az a szokásos módon fog működni. Ha ezzel a funkcióval futtatja a parancsot, az új töréspont-viselkedést eredményez az egyes töréspontok esetében.

A töréspont-parancsokkal kapcsolatos általános információkért lásd a bp, bu, bm (Breakpoint beállítása) című témakört.

Hierarchikus töréspontok

A hierarchikus töréspontok egy nem egyértelmű töréspont-kifejezés több töréspontra való feloldásának eredményét jelölik. Ha egy kifejezés két vagy több egyezést eredményez, amelyek a töréspontok beállítására szolgálnak, akkor létrejön egy másik töréspont, amely a töréspontkészletet vezérli. Ez a fölérendelt töréspont, a hierarchikus töréspont engedélyezhető/letiltható/törölhető, és ugyanúgy listázható, ahogyan egy normál töréspont tenné, és a hozzá tartozó töréspontokon is elvégezheti ugyanazt a műveletet.

Ha például a parancs bp foo!bar futtatása két egyezést eredményez a szimbólummal barszemben, akkor létrejön egy hierarchikus töréspont, amely a két egyezést vezérli. Ha a hierarchikus funkció be van kapcsolva, le van tiltva, vagy törölve van, akkor az egyező töréspontok is módosulnak.

A .bpcmds(Display Breakpoint Commands) listázni fogja az egyes töréspontok beállításához futtatható töréspont-parancsokat. A hierarchikus töréspont tulajdonában lévő töréspontok továbbra is megadnak egy érvényes bp parancsot, amely létrehoz egy töréspontot a címén. A hierarchikus töréspontok is megjelennek a kimenetben, és megjelenítik azt a parancsot, amely a töréspontok teljes készletének újbóli létrehozásához használható egyetlen töréspont helyett.

Kétértelmű szimbólumok

Ha töréspontot állít be egy szimbólumnévre, a következő viselkedést kell eredményeznie, ha a szimbólum a következő:

  • Túlterhelés: Minden szimbólumnak megfelelő túlterhelésnek törésponttal kell rendelkeznie.

  • Sablonfüggvény:

    • Ha a kifejezésben minden sablonparaméter meg van adva (például bp foo!bar<int>), akkor a rendszer töréspontot állít be a sablonfüggvény adott implementációjára.

    • Ha a kifejezéshez nincs megadva típus implementáció (például bp foo!bar), akkor nem lesznek beállítva töréspontok. Ebben az esetben bm töréspontok beállítására kell használni a sablonfüggvénynél.

    • A hibakereső nem támogatja a részleges sablonspecifikációkat, és ebben az esetben nem állít be töréspontokat.

  • Beágyazott függvény: Minden beágyazott hely rendelkezik törésponttal

Vegye figyelembe, hogy több töréspont nem lesz beállítva, ha a szimbólumkifejezés olyan operátorokat vagy eltolásokat tartalmaz, amelyeknél a hibakereső több értékelést igényel. Például, ha a foo szimbólum több helyre is feloldható, de a foo+5 kifejezés kiértékelésre kerül, a hibakereső nem fogja megpróbálni az összes helyet feloldani a töréspontok beállításához.

Példa töréspontkódokra

Tekintettel a következő kódrészletre:

class BikeCatalog
{
public:
    void GetNumberOfBikes()
    {
        std::cout << "There are 42 bikes." << std::endl;
    }
    int GetNumberOfBikes(int num)
    {
        std::cout << "There are " << num << " bikes." << std::endl;
        return num;
    }
}; 

A parancs bu BikeCatalog::GetNumberOfBikes meghívása két töréspont létrehozását eredményezné, egyet minden túlterheléshez. A töréspontok felsorolása a következő kimenetet eredményezné:

0:000> bl
     2 e Disable Clear  <hierarchical breakpoint>     0001 (0001)  0:**** {BikeCatalog!BikeCatalog::GetNumberOfBikes}
         0 e Disable Clear  00007ff6`c6f52200  [C:\BikeCatalog\BikeCatalog.cpp @ 13]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::GetNumberOfBikes
         1 e Disable Clear  00007ff6`c6f522a0  [C:\BikeCatalog\BikeCatalog.cpp @ 9]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::GetNumberOfBikes

Nem egyértelmű forrásvonalak

Ha töréspontot állít be egy forrásvonalon, a következő viselkedést kell eredményeznie, ha a forrásvonal a következő:

  • Fordítóoptimalizált függvény: Ha a sor több helyen van felosztva a fordítóoptimalizálás miatt, akkor a töréspont a megadott sornak megfelelő függvény legalacsonyabb helyére lesz beállítva.
  • Beillesztett függvény: Az egyes híváshelyekhez töréspont van beállítva, kivéve, ha a megadott sor a beillesztés részeként került optimalizálásra.
  • Több helyszínre lett feloldva: Ha a fenti feltételek nem teljesülnek, akkor a rendszer töréspontot állít be minden címhez a következő feltételek mellett.
    • Ha a kifejezés forrásvonalának megfelelő N-címek vannak, és ezeknek az N-címeknek az M alhalmaza nulla forrásvonal-eltolódást tartalmaz a kifejezés forrássorából, akkor csak az M-címeknek lesznek töréspontjai.
    • Ha az N-címek készletében nincsenek olyan címek, amelyek a kifejezés forrássorából nulla eltolódást jelentenek, akkor az összes N-címnek töréspontjai lesznek.

Szűrés a szimbólumindex alapján

Minden szimbólumnak egyedi szimbólumindexszel kell rendelkeznie. A szimbólumok szerkezetével kapcsolatos részletes információkért lásd SYMBOL_INFO szerkezetét.

A hibakereső a szimbólumindex használatával ellenőrzi, hogy az ismétlődő egyezések szűrve legyenek-e több, nulla forrásvonal-eltolással rendelkező cím esetén.

Példák sablonra és túlterhelt függvényekre

Sablonfüggvények

Ha egy sablonfüggvény definíciójának forrásvonalán állít be töréspontot, az a sablonfüggvény minden implementációjának töréspontját eredményezi. Tekintettel a következő sablonfüggvényre a BikeCatalog.cpp 19. sorában:

template <class T>
void RegisterBike(T id)
{
    std::cout << "Registered bike " << id << std::endl;
}

És annak használati módjai:

catalog.RegisterBike("gravel bike");
catalog.RegisterBike(1234);

A parancs bp `BikeCatalog.cpp:19` meghívása két töréspontot állít be, amelyek a fájl későbbi részében használt sablonfüggvények implementációira vonatkoznak. Ha a felhasználó ehelyett egyetlen töréspontot szeretne beállítani a függvényen, akkor vagy be kell állítania egy töréspontot a sablonfüggvény implementációjának adott forrásvonalán, vagy be kell állítania egy töréspontot a sablonfüggvény szimbólumára a megfelelő típusinformációkkal (pl. bp BikeCatalog::RegisterBike<int>).

A töréspontok felsorolása a következő kimenetet eredményezi:

0:000> bl
     2 e Disable Clear  <hierarchical breakpoint>     0001 (0001)  0:**** {BikeCatalog!BikeCatalog::RegisterBike&lt;int&gt;}
         0 e Disable Clear  00007ff7`6b691dd0  [C:\BikeCatalog\BikeCatalog.cpp @ 20]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::RegisterBike<int>
         1 e Disable Clear  00007ff7`6b691e60  [C:\BikeCatalog\BikeCatalog.cpp @ 20]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::RegisterBike<char const *>

Túlterhelt függvények

Ha egy túlterhelt függvény definíciójának forrásvonalán állít be töréspontot, az csak egy töréspontot eredményez a túlterhelt függvény definícióján. A kódrészlet újbóli használata felülről, az első sor az 5. sorban kezdődik:

class BikeCatalog
{
public:
    void GetNumberOfBikes()
    {
        std::cout << "There are 42 bikes." << std::endl;
    }
    int GetNumberOfBikes(int num)
    {
        std::cout << "There are " << num << " bikes." << std::endl;
        return num;
    }
}; 

A bp `BikeCatalog.cpp:9` parancs meghívása egyetlen töréspontot állít be a void megvalósításának GetNumberOfBikes sorára. A töréspontok felsorolása a következő kimenetet eredményezi:

0:000> bl
     0 e Disable Clear  00007ff7`6b691ec0  [C:\BikeCatalog\BikeCatalog.cpp @ 9]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::GetNumberOfBikes

beágyazott függvények

Ha töréspontot állít be a forrásvonalon egy beágyazott függvény híváshelyéhez, az csak egy töréspontot eredményez az adott hívóhelyen, még akkor is, ha ugyanabban a függvényben egy másik híváshely található.

Több hierarchikus töréspont

A hierarchikus töréspontok a csoport minden töréspontját birtokolják, kivéve, ha:

Az adott beállításban lévő töréspont törlődik

  • A hierarchikus töréspont törlődik.
  • Létrejön egy másik hierarchikus töréspont, amely tartalmaz egy töréspontot a hierarchikus töréspont készletében.

Erre úgy is gondolhat, hogy a töréspontoknak csak egy hierarchikus töréspont-tulajdonosa lehet, és a legutóbbi töréspont-parancs határozza meg, hogy mi legyen a töréspontlista állapota.

Emellett egy hierarchikus töréspont nem birtokolhat egy másik hierarchikus töréspontot.

Meglévő töréspontok részösszegezése

Ha a A töréspont önmagában létezik, és egy nem egyértelmű töréspont-kifejezés feloldása létrehozza a A, B töréspontokat, akkor az A az új töréspontkészlet része lesz B-vel együtt.

Hierarchikus töréspontkészletek metszeteinek részösszegzése

Ha az A hierarchikus töréspont B, C töréspontot birtokol, akkor egy nem egyértelmű töréspont-kifejezés feloldva lesz töréspontok létrehozásához:

  • B, C, D: A B, C töréspontok a D törésponttal csatlakoznak az új hierarchikus töréspontcsoporthoz, és az A hierarchikus töréspont törlődik.

  • C, D vagy B, D: Az egyik töréspont a D törésponttal csatlakozik az új hierarchikus töréspontcsoporthoz, és az A hierarchikus töréspont továbbra is létezik az új csoporthoz nem csatlakozó egyetlen fennmaradó törésponttal.

Lásd még

Töréspontok használata

Töréspont szintaxisa

bp, bu, bm (Töréspont beállítása)

Megoldatlan töréspontok (Unresolved Breakpoints)