Sdílet prostřednictvím


Zarážky procesoru (zarážky ba)

Zarážky řízené procesorem v požadavku ladicího programu se označují jako zarážky procesoru nebo datové zarážky. Zarážky řízené přímo ladicím programem se označují jako softwarové zarážky.

Poznámka I když se termín zarážka dat běžně používá jako synonymum pro zarážku procesoru, může být tento termín zavádějící. Existují dva základní typy zarážek: zarážky procesoru, které jsou řízeny procesorem, a softwarové zarážky, které jsou řízeny ladicím programem. Zarážky procesoru jsou obvykle nastavené na programová data – to je důvod, proč se označují jako "datové zarážky", ale dají se nastavit také u spustitelného kódu. Softwarové zarážky jsou obvykle nastavené u spustitelného kódu, ale dají se nastavit také u programových dat. V dokumentaci k ladění je bohužel běžné odkazovat na zarážky procesoru jako "datové zarážky", i když jsou nastavené na spustitelný kód.

Zarážky procesoru

K aktivaci zarážky procesoru dojde, když je přistoupeno ke konkrétnímu umístění paměti. Existují čtyři typy zarážek procesoru, které odpovídají druhu přístupu k paměti, který ho aktivuje:

Typ bodu přerušení Činnost
e (vykonat) Aktivuje se, když procesor načte instrukce ze zadané adresy.
r (čtení/zápis) Aktivuje se, když procesor na zadané adrese čte nebo zapisuje paměť.
w (zápis) Aktivuje se, když procesor zapíše paměť na zadanou adresu.
i (i/o) Aktivuje se při přístupu k V/V portu na zadané adrese.

Každý bod přerušení procesoru je spojen s určitou velikostí. Například zarážku procesoru w (write) lze nastavit na adrese 0x70001008 s velikostí čtyř bajtů. To by monitorovalo blok adres od 0x70001008 do 0x7000100B včetně. Pokud zapisujeme do tohoto bloku paměti, aktivuje se zarážka.

Může se stát, že procesor provádí operaci v oblasti paměti, která se překrývají, ale není identická se zadanou oblastí. V příkladu uvedeném v předchozím odstavci by jedna operace zápisu, která zahrnuje rozsah 0x70001000 0x7000100F, nebo operace zápisu, která zahrnuje pouze bajt v 0x70001009, by byla překrývající se operace. V takové situaci, zda je zarážka aktivována, je závislá na procesoru. Podrobnosti o tom, jak se tato situace zpracovává u konkrétního procesoru, najdete v příručce k architektuře procesoru a vyhledejte "registr ladění" nebo "registr ovládacího prvku ladění". Na procesoru x86 se zarážka pro čtení nebo zápis aktivuje, kdykoli se přístupná oblast překrývá s oblastí zarážky.

Podobně platí, že pokud je na adrese 0x00401003 nastavena zarážka e (execute) a pak se spustí dvoubajtová instrukce, která se rozprostírá přes adresy 0x00401002 a 0x00401003, výsledek je závislý na procesoru. Další podrobnosti najdete v příručce k architektuře procesoru.

Procesor rozlišuje zarážky nastavené ladicím programem v uživatelském režimu a zarážky nastavené ladicím programem režimu jádra. Zarážka procesoru v uživatelském režimu nemá vliv na žádné procesy režimu jádra. Zarážka procesoru v režimu jádra může nebo nemusí mít vliv na proces uživatelského režimu v závislosti na tom, jestli kód uživatelského režimu používá stav registru ladění a jestli je připojený ladicí program v uživatelském režimu.

Pokud chcete použít existující datové zarážky aktuálního procesu na jiný kontext registru, použijte příkaz .apply_dbp (Použít zarážku dat do kontextu).

Na multiprocesorovém počítači platí každý bod přerušení procesoru pro všechny procesory. Pokud je například aktuální procesor 3 a pomocí příkazu ba e1 MyAddress umístíte zarážku na MyAddress, jakýkoli procesor – nejen procesor 3 – který se spustí na této adrese, aktivuje zarážku. To platí i pro zarážky softwaru.

Softwarové zarážky

Softwarové zarážky, na rozdíl od zarážek procesoru, jsou řízeny ladicím programem. Když debugger nastaví softwarový breakpoint na nějakém místě, dočasně nahradí obsah tohoto umístění paměti pokynem k přerušení. Ladicí program si pamatuje původní obsah tohoto umístění, takže pokud je tato paměť zobrazena v ladicím programu, ladicí program zobrazí původní obsah tohoto umístění paměti, nikoli instrukce přerušení. Když cílový proces spustí kód v tomto umístění, instrukce přerušení způsobí, že se proces rozdělí do ladicího programu. Jakmile provedete jakékoli akce, které zvolíte, můžete obnovit spuštění cílového procesu a provedení se obnoví s instrukcí, která byla původně v daném umístění.

Dostupnost typů zarážek procesoru

Možnost i (i/o) je k dispozici pouze při ladění v režimu jádra.

Ne všechny velikosti dat lze použít se všemi typy zarážek procesoru. Povolené velikosti závisí na procesoru cílového počítače. Podrobnosti viz ba (Break on Access).

Omezení zarážek softwaru a zarážek procesoru

Při použití příkazů bp nebo bm /a je možné zadat datovou adresu místo adresy programu. I když je však zadáno umístění dat, tyto příkazy vytvářejí softwarové zarážky, nikoli zarážky procesoru. Když ladicí program umístí softwarový přerušovací bod na určitou pozici, dočasně nahradí obsah této paměťové pozice instrukcí přerušení. To nepoškodí spustitelný obrázek, protože ladicí program si pamatuje původní obsah tohoto umístění a když se cílový proces pokusí spustit tento kód, může ladicí program odpovídajícím způsobem reagovat. Pokud je ale softwarový breakpoint nastaven v datovém umístění, může výsledné přepsání vést k poškození dat. Nastavení softwarové zarážky v umístění dat je proto bezpečné pouze v případě, že jste si jisti, že toto umístění bude použito pouze jako spustitelný kód.

Příkazy bp, bu a bm nastavují softwarové zarážky nahrazením instrukce procesoru instrukcí pro zarážku. Proto je nelze použít v kódu jen pro čtení nebo v jiném kódu, který nelze přepsat. Pokud chcete nastavit zarážku v tomto kódu, musíte použít ba (Break on Access) s možností e (execute).

Nelze vytvořit více zarážek procesoru na stejné adrese, které se liší pouze v příkazu, který se automaticky spustí při aktivaci zarážky. Můžete však vytvořit více zarážek na stejné adrese, které se liší v ostatních omezeních (například můžete vytvořit více zarážek na stejné adrese pomocí příkazu ba s různými hodnotami možností /p, /t, /c a /C ).

Počáteční zarážka v procesu uživatelského režimu (obvykle nastavená na hlavní funkci nebo její ekvivalent) nemůže být zarážkou procesoru.

Počet podporovaných zarážek procesoru závisí na architektuře cílového procesoru.

Řízení softwarových zarážek a zarážek procesoru

Softwarové zarážky lze vytvořit pomocí příkazů bp (Set Breakpoint),bm (Set Symbol Breakpoint) a bu (Set Unresolved Breakpoint). Zarážky procesoru je možné vytvořit pomocí příkazu ba (Break on Access). Příkazy, které zakazují, povolují a upravují zarážky, platí pro všechny typy zarážek. Příkazy, které zobrazují seznam zarážek, zahrnují všechny zarážky a označují typ jednotlivých zarážek. Seznam těchto příkazů naleznete v tématu Metody řízení zarážek.

Dialogové okno Zarážky WinDbg zobrazí všechny zarážky označující zarážky procesoru s notací "e", "r", "w" nebo "i" následovanou velikostí bloku. Toto dialogové okno lze použít pro úpravu jakékoli zarážky. Textové pole Příkaz v tomto dialogovém okně lze použít k vytvoření libovolného typu zarážky. Pokud je požadovaná zarážka procesoru, začněte vstupem "ba". Když nastavíte bod přerušení pomocí myši v okně WinDbg Disassembly nebo Source, ladicí program vytvoří nevyřešený softwarový bod přerušení.

Zarážky procesoru se ukládají do registrů ladění procesoru. Zarážku je možné nastavit ruční úpravou hodnoty registru ladění, ale silně to nedoporučujeme.