Processorbrytpunkter (ba brytpunkter)

Brytpunkter som styrs av processorn på begäran av felsökningsprogrammet kallas för processor brytpunkter eller data brytpunkter. Brytpunkter som styrs direkt av felsökningsprogrammet kallas för programvarubrytpunkter.

Notera Även om termen databrytpunkt ofta används som synonym för processorbrytpunkt, kan den här termen vara missvisande. Det finns två grundläggande typer av brytpunkter: processor brytpunkter, som styrs av processorn och brytpunkter, som styrs av felsökningsprogrammet. Processor brytpunkter anges vanligtvis på programdata – det är anledningen till att de kallas "data brytpunkter" – men de kan också ställas in på körbar kod. Programvarubrytpunkter anges vanligtvis på körbar kod, men de kan också ställas in på programdata. Tyvärr är det vanligt i felsökningslitteraturen att referera till processorbrytpunkter som "databrytpunkter", även när de är inställda på körbar kod.

Processorbrytpunkter

En processorbrytpunkt utlöses när en specifik minnesplats nås. Det finns fyra typer av processorbrytpunkter som motsvarar den typ av minnesåtkomst som utlöser den:

Brytpunktstyp Åtgärd
e (kör) Utlöses när processorn hämtar en instruktion från den angivna adressen.
r (läsa/skriva) Utlöses när processorn läser eller skriver minne på den angivna adressen.
w (skriva) Utlöses när processorn skriver minne på den angivna adressen.
i (i/o) Utlöses när I/O-porten på den angivna adressen används.

Varje processor brytpunkt har en associerad storlek. Till exempel kan en w -processorbrytpunkt (skriva) anges på adressen 0x70001008 med en storlek på fyra byte. Detta skulle övervaka adressblocket från 0x70001008 till 0x7000100B, inklusive. Om det här minnesblocket skrivs till utlöses brytpunkten.

Det kan hända att processorn utför en åtgärd i en minnesregion som överlappar, men inte är identisk med, den angivna regionen. I exemplet i föregående stycke skulle en enda skrivåtgärd som innehåller intervallet 0x70001000 till 0x7000100F, eller en skrivåtgärd som endast innehåller byte vid 0x70001009, vara en överlappande åtgärd. I sådana fall är det processorberoende huruvida brytpunkten utlöses. Mer information om hur den här situationen hanteras på en specifik processor finns i handboken för processorarkitektur och letar efter "felsökningsregister" eller "felsökningskontrollregister". För att ta en specifik processortyp som exempel utlöses en brytpunkt för läsning eller skrivning på en x86-processor när det anslutna intervallet överlappar brytpunktsintervallet.

Om en e-brytpunkt (kör) sätts på adressen 0x00401003 och en tvåbytesinstruktion som sträcker sig över adresserna 0x00401002 och 0x00401003 sedan körs, blir resultatet processorberoende. Mer information finns i processorarkitekturhandboken.

Processorn skiljer mellan brytpunkter som anges av ett felsökningsprogram i användarläge och brytpunkter som anges av ett felsökningsprogram i kernelläge. En processorbrytpunkt i användarläge påverkar inte några processer i kernelläge. En processorbrytpunkt i kernelläge kan eller kanske inte påverkar en process i användarläge, beroende på om koden i användarläge använder felsökningsregistrets tillstånd och om det finns ett felsökningsprogram i användarläge som är kopplat.

Om du vill tillämpa den aktuella processens befintliga data brytpunkter på en annan registerkontext använder du kommandot .apply_dbp (Tillämpa data brytpunkt på kontext).

På en dator med flera processorer gäller varje processor brytpunkt för alla processorer. Om den aktuella processorn till exempel är 3 och du använder kommandot ba e1 MyAddress för att placera en brytpunkt på MyAddress utlöser alla processorer – inte bara processor 3 – som körs på den adressen brytpunkten. Detta gäller även för programvarubrytpunkter.

Brytpunkter för programvara

Programvaru brytpunkter, till skillnad från processor brytpunkter, styrs av felsökningsprogrammet. När felsökningsprogrammet anger en programbrytpunkt på någon plats ersätter det tillfälligt innehållet på den minnesplatsen med en brytinstruktion. Felsökningsprogrammet kommer ihåg det ursprungliga innehållet på den här platsen, så att om det här minnet visas i felsökningsprogrammet visar felsökningsprogrammet det ursprungliga innehållet på den minnesplatsen, inte brytinstruktionen. När målprocessen kör koden på den här platsen gör brytinstruktionen att processen bryter sig in i felsökningsprogrammet. När du har utfört de åtgärder du väljer kan du få målet att återuppta körningen och körningen återupptas med instruktionen som ursprungligen fanns på den platsen.

Tillgänglighet för typer av processorbrytpunkter

Alternativet i (i/o) är endast tillgängligt vid felsökning i kernelläge.

Alla datastorlekar kan inte användas med alla typer av processor brytpunkter. De tillåtna storlekarna beror på måldatorns processor. Mer information om detta finns under ba (Break on Access).

Begränsningar för programvarubrytpunkter och processorbrytpunkter

Det går att ange en dataadress i stället för en programadress när du använder kommandona bp eller bm /a. Men även om en dataplats anges skapar dessa kommandon programvarubrytpunkter, inte processorbrytpunkter. När felsökningsprogrammet placerar en programbrytpunkt på någon plats ersätter den tillfälligt innehållet på den minnesplatsen med en brytinstruktion. Detta skadar inte den körbara avbildningen eftersom felsökaren kommer ihåg det ursprungliga innehållet på den här platsen, och när målprocessen försöker köra den här koden kan felsökaren svara på rätt sätt. Men när en programvarubrytpunkt anges på en dataplats kan den resulterande överskrivningen leda till att data skadas. Därför är det bara säkert att ange en programvarubrytpunkt på en dataplats om du är säker på att den här platsen endast kommer att användas som körbar kod.

Kommandona bp, bu och bm anger programvarubrytpunkter genom att ersätta processorinstruktionen med en brytinstruktion. Därför kan dessa inte användas i skrivskyddad kod eller någon annan kod som inte kan skrivas över. Om du vill ange en brytpunkt i sådan kod måste du använda ba (Break on Access) med alternativet e (execute).

Du kan inte skapa flera processorbrytpunkter på samma adress som bara skiljer sig åt i kommandot som körs automatiskt när brytpunkten utlöses. Du kan dock skapa flera brytpunkter på samma adress som skiljer sig åt i de andra begränsningarna (du kan till exempel skapa flera brytpunkter på samma adress med hjälp av ba-kommandot med olika värden för alternativen /p, /t, /c och /C ).

Den inledande brytpunkten i en användarlägesprocess (vanligtvis inställd på huvudfunktionen eller dess motsvarighet) kan inte vara en processorbrytpunkt.

Antalet processorbrytpunkter som stöds beror på målprocessorarkitekturen.

Kontrollerar brytpunkter för programvara och processorbrytpunkter

Programvarubrytpunkter kan skapas med kommandona bp (Set Breakpoint), bm (Set Symbol Breakpoint) och bu (Ange olöst brytpunkt). Processorbrytpunkter kan skapas med kommandot ba (Break on Access). Kommandon som inaktiverar, aktiverar och ändrar brytpunkter gäller för alla typer av brytpunkter. Kommandon som visar en lista över brytpunkter innehåller alla brytpunkter och anger typen av var och en. En lista över dessa kommandon finns i Metoder för att kontrollera brytpunkter.

Dialogrutan WinDbg Breakpoints visar alla brytpunkter, vilket anger processorbrytningspunkter med notationen "e", "r", "w" eller "i" följt av blockets storlek. Den här dialogrutan kan användas för att ändra vilken brytpunkt som helst. Textrutan Kommando i den här dialogrutan kan användas för att skapa valfri typ av brytpunkt. Om du vill ha en processorbrytpunkt börjar du indata med "ba". När du anger en brytpunkt med hjälp av musen i fönstret WinDbg Disassembly eller Source skapar felsökningsprogrammet en ouppklarad programvarubrytpunkt.

Processorbrytpunkter lagras i processorns felsökningsregister. Det går att ange en brytpunkt genom att manuellt redigera ett värde för felsökningsregister, men det rekommenderas inte.