Manpages

NAAM

ptrace − proces volgen

OVERZICHT

#include <sys/ptrace.h>

long int ptrace(enum __ptrace_request verzoek, pid_t pid, void * addr, void * gegevens)

BESCHRIJVING

De ptrace systeem aanroep levert een manier waardoor een ouder-proces de uitvoering van een ander proces kan volgen en manipuleren: zijn geheugen-beeld en registers kan bekijken en veranderen. Het wordt in de eerste plaats gebruikt om breekpunt-debuggen en systeem-aanroep-volgen te implementeren.

De ouder kan het volgen beginnen door fork(2) aan te roepen en het opgeleverde kind een PTRACE_TRACEME {volgme}, gevolgd (gewoonlijk) door een exec(2) te laten doen. De ouder kan ook met volgen beginnen op een bestaand proces met PTRACE_ATTACH.

Als het kind gevolgd wordt, zal het elke keer dat een signaal afgeleverd wordt stoppen, zelfs als het signaal genegeerd wordt. (De uitzondering is SIGKILL {*vermoord}, die het gewoonlijke gevolg heeft.) De ouder wordt opmerkzaam gemaakt bij zijn volgende wait(2) en kan het gestopte kind-proces inspecteren en veranderen. De ouder zorgt dan dat het kind doorgaat, met eventueel het afgeleverde signaal genegeerd (of zelfs een ander signaal afgevend in plaats daarvan).

Als de ouder klaar is met volgen kan het het kind beëindigen met PTRACE_KILL of zorgen dat het doorgaat met uitvoeren in een normale ongevolgde toestand met PTRACE_DETACH.

De waarde van verzoek bepaald wat het doet:
PTRACE_TRACEME

{*volg me} betekend dat het proces gevolgd zal gaan worden door zijn ouder. Elk signaal (behalve SIGKILL) dat aan het proces gegeven wordt maakt dat het stopt en dat zijn ouder geïnformeerd wordt via wait. Ook zullen alle volgende aanroepen van exec door dit proces, het zenden van een SIGTRAP naar het proces veroorzaken, ervoor zorgend dat de ouder een kans heeft om de macht over te nemen voordat een nieuw programma met uitvoeren begint. Een proces moet dit verzoek waarschijnlijk niet doen als zijn ouder niet verwacht om het te volgen. (pid, addr, en gegevens worden genegeerd.)

Het bovenstaande verzoek wordt alleen door het kind proces gebruikt; de rest wordt alleen door de ouder gebruikt. In de volgende verzoeken bepaald pid het kind proces waarop gewerkt wordt. Voor andere verzoeken dan PTRACE_KILL moet het kind proces gestopt worden.
PTRACE_PEEKTEXT, PTRACE_PEEKDATA

{*gluur tekst} {*gluur gegevens} Leest een woord op positie addr in het geheugen van het kind, en geeft het terug als het resultaat van de ptrace aanroep. Linux heeft geen afzonderlijke text {code} en gegevens adres ruimtes, dus de twee verzoeken zijn momenteel gelijk. (gegevens wordt genegeerd.)

PTRACE_PEEKUSER

{*gluur gebruiker} Leest een woord op positie addr in het GEBRUIKER gebied van het kind, waar de registers en andere informatie over het proces vastgehouden worden (zie <linux/user.h> en <sys/user.h>). Het woord wordt teruggegeven als het resultaat van een ptrace aanroep. Meestal moet de positie woord-opgelijnd zijn, hoewel dat per architectuur kan wisselen. (gegevens wordt genegeerd.)

PTRACE_POKETEXT, PTRACE_POKEDATA

{*prik text} {*prik gegevens} Kopieert een woord op positie gegevens in het geheugen van de ouder, naar positie addr in het geheugen van het kind. Net als hierboven zijn de twee verzoeken momenteel gelijk.

PTRACE_POKEUSER

{*prik gebruiker} Kopieert een woord op positie gegevens in het geheugen van de ouder, naar de positie addr in het kind zijn GEBRUIKER gebied. Net als boven moet de positie meestal woord-opgelijnd zijn. Om de zuiverheid van de "kernel" te handhaven worden sommige veranderingen aan het GEBRUIKER gebied niet toegestaan.

PTRACE_GETREGS, PTRACE_GETFPREGS

Kopiëren respectievelijk de algemeen gebruik-, of de drijvende-komma- registers van het kind naar positie gegevens in de ouder. Zie <linux/user.h> voor informatie over de vorm van deze gegevens. (addr wordt genegeerd.)

PTRACE_SETREGS, PTRACE_SETFPREGS

{*zet registers} {*zet Fregisters} Zetten respectievelijk de algemeen gebruik-, of de drijvende-komma- registers van het kind, van positie gegevens in de ouder. Net als voor PTRACE_POKEUSER kunnen sommige veranderingen in de algemeen-gebruik-registers niet worden toegestaan.

PTRACE_CONT

{*ga-door} Herstart het gestopte kind-proces. Als gegevens ongelijk-nul is en niet SIGSTOP, dan wordt het geïnterpreteerd als een signaal dat afgeleverd wordt aan het kind; anders wordt geen signaal afgeleverd. Dus de ouder kan bijvoorbeeld bepalen of een signaal dat naar het kind werd gezonden aangeboden wordt of niet. (addr wordt genegeerd.)

PTRACE_SYSCALL, PTRACE_SINGLESTEP

{*systeemaanr.} {*enkele stap} Herstart het gestopte kind net als PTRACE_CONT, maar zorgt ervoor dat het kind gestopt wordt bij de volgende ingang naar- of uitgang van- een systeem aanroep, of na uitvoering van een enkele instructie, respectievelijk. (Het kind zal ook -zoals gebruikelijk- worden gestopt bij ontvangst van een signaal.) Gezien vanuit de ouder zal het lijken of het kind gestopt is bij ontvangst van een SIGTRAP. Dus voor PTRACE_SYSCALL bijvoorbeeld is het idee om: de argumenten naar een systeemaanroep te onderzoeken bij de eerste stop, dan nog een PTRACE_SYSCALL te doen, en de teruggeef-waarde van de systeem aanroep te onderzoeken bij de tweede stop. (addr wordt genegeerd.)

PTRACE_KILL

{*vermoord} Zend het kind een SIGKILL om het te beëindigen. (addr en gegevens worden genegeerd.)

PTRACE_ATTACH

{*mount} mount aan een proces bepaald in pid, en maakt het een gevolgd "kind" van het huidige proces; het gedrag van het kind is alsof het een PTRACE_TRACEME had gedaan. Het huidige proces wordt feitelijk de ouder van het kind voor de meeste zaken (o.a., zal het kennis nemen van kind-gebeurtenissen en in ps(1) uitkomst zal als de ouder verschijnen), maar een getpid(2) door het kind zal nog steeds de originele ouder teruggeven. Het kind wordt een SIGSTOP gezonden maar zal niet noodzakelijkerwijs al gestopt zijn bij afronding van deze aanroep; gebruik wait om te wachten tot het kind stopt. (addr en gegevens worden genegeerd.)

PTRACE_DETACH

{*ontkoppel} Herstart een gestopt kind net als PTRACE_CONT, maar ontkoppeld eerst van het proces: het om-ouderen gevolg van PTRACE_ATTACH, en de gevolgen van PTRACE_TRACEME ongedaan makend. Alhoewel misschien niet bedoeld, onder Linux kan een gevolgd kind ontkoppeld worden via deze weg, op welke welke manier het volgen ook begonnen was.

OPMERKINGEN

Hoewel argumenten van ptrace worden geïnterpreteerd volgens het gegeven prototype, verklaard GNU libC ptrace momenteel als een variërende functie met alleen het verzoek argument vereist. Dit betekend dat onnodige, achteraan hangende argumenten, weggelaten mogen worden, hoewel dat gebruik maakt van onbeschreven gcc(1) gedrag.

init(8), het proces met pid 1 mag niet gevolgd worden.

De vorm van de inhoud van het geheugen en het GEBRUIKER gebied zijn nogal besturingssysteem- en architectuur- eigen.

De maat voor een "word" {woord} wordt bepaald door de besturingssysteem soort (voor 32-bit Linux is het 32 bits, enz.).

Volgen veroorzaakt een paar kleine verschillen in werking van het gevolgde proces. Bijvoorbeeld: als aan een proces mount werd met PTRACE_ATTACH dan kan zijn originele ouder niet langer bericht via wait krijgen wanneer het stopt, en er is geen manier voor de nieuwe ouder om dit bericht na te bootsen.

Deze pagina beschrijft de manier ptrace momenteel werkt in Linux. Zijn gedrag verschilt nogal van andere smaken Unix. In elk geval, gebruik van ptrace is zeer besturingssysteem- en architectuur- eigen.

De SunOS handleiding beschrijft ptrace als "uniek en ouderwets", wat zo is. De proc-gebaseerde debuggings interfaces, aanwezig in in Solaris 2, implementeren meer dan de ptrace mogelijkheden op een sterkere en meer eenvormige manier.

TERUGGEEF WAARDE

Bij success geven PTRACE_PEEK* verzoeken de gevraagde gegevens terug, andere verzoeken geven nul terug. Bij falen geven alle verzoeken −1 en wordt errno(3) naar behoren gezet. Omdat de waarde teruggegeven door een geslaagd PTRACE_PEEK* verzoek −1 kan zijn, moet de aanroeper errno testen na dergelijke verzoeken om te bepalen of al of niet een fout optrad.

FOUTEN

EPERM

{toestemming} Het bepaalde proces kan niet gevolgd worden. Dit kan zijn omdat de ouder onvoldoende rechten heeft; niet-root processen kunnen processen niet volgen waar ze geen signalen naar kunnen zenden, of processen die setuid/setgid zijn, om overduidelijke redenen. Het proces zou ook al gevolgd kunnen worden, of init (pid 1) zijn.

ESRCH

{zoek} Het bepaalde proces bestaat niet, wordt momenteel niet gevolgd door de aanroeper, of is niet gestopt (voor verzoeken die dat nodig hebben).

EIO

{in/uit} verzoek is ongeldig, of een poging werd gedaan om te lezen of schrijven van/naar een ongeldig gebied in het geheugen van de ouder of het kind, of er was een woord-oplijning schending, of een ongeldig signaal werd gegeven in een herstart verzoek.

EFAULT

{fout} Er werd een poging gedaan om te lezen of schrijven van/naar een ongeldig gebied in het geheugen van de ouder of het kind, waarschijnlijk omdat het gebied niet voorhanden {eng: mapped} of toegankelijk was. Helaas geven onder Linux verschillende soorten van deze fout nogal lukraak EIO of EFAULT terug.

VOLDOET AAN

SVr4, SVID EXT, AT&T, X/OPEN, BSD 4.3

ZIE

exec(3) {uitvoeren}, wait(2) {wacht}, signal(2) {signaal}, fork(2) {splits}, gdb(1) {gnu debugger}, strace(1) {volg}

VERTALING

Dit is een handleiding uit manpages-dev 1.29. Alles wat tussen ’{’..’}’ staat is aanvullende vertaling, en hoort niet bij de originele handleiding. Email naar <manpages-nl [AT] nl.org>.

$Id: ptrace.2,v 1.1.1.1 2004/03/21 21:02:25 cor Exp $