Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 esetbenbmtö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<int>}
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.