ptrace (anglicky process trace) je v informatice speciální systémové volání používané unixovými operačními systémy. Systémové volání ptrace umožňuje jednomu procesu ovládat druhý proces, takže je ho možné sledovat a měnit jeho vnitřní stavy. Volání ptrace je využíváno debuggery a dalšími nástroji zabývajícími se analýzou zdrojového kódu, většinou při vývoji software.
Ptrace je využíváno debuggery (jako jsou gdb a dbx), trasovacími nástroji jako strace a ltrace a nástroji code coverage (zajímají se hloubkou testování kódu). Ptrace je také využíváno jako specializovaný program pro opravu běžících programů, aby se předešlo neočekávaným chybám či překonání bezpečnostních prvků.
Připojením se k jinému procesu využívajícím ptrace volání, má nástroj značnou kontrolu nad operacemi svého cíle. To zahrnuje ovládání jeho souborových deskriptorů, paměti a registrů procesoru. Může využít krokování kódu (angl. single-step) při průchodu cílovým kódem, či sledovat systémové volání a jejich výsledky. Dále je možné ovládat signály obsluhy procesoru a jak přijímat tak odesílat signály jeho jménem. Schopnost psát do cílové paměti umožňuje nejen měnit uložená data, ale také aplikaci vlastního segmentu kódu. To umožňuje, aby kontroler vložil "zarážky" (angl. Breakpoints ) a opravil běžící kód cíle.[1]
Jelikož možnost kontrolovat a měnit nějaký proces je velice mocný nástroj, může být ptrace využíváno pouze na procesy, kterým má vlastník povoleno posílat signály (typicky jeho vlastním procesům) ; superuživatelským účtem je možné využívat ptrace téměř na všechny procesy (s výjimkou init). V systémech Linux představující další možnosti zabezpečení, je schopnost ptrace dále omezena možnostmi CAP_SYS_PTRACE.[2] V FreeBSD, je limitováno pomocí FreeBSD jail a Mandatory access control politikou.
Komunikace mezi kontrolerem a cílem je prováděna pomocí opakovaného volání ptrace, posíláním malých pevných bloků paměti mezi sebou, což vyžaduje dvě změny kontextu (přepínání řízení mezi procesy) během každého volání. To je velice neefektivní při přístupu k velkému množství paměti cíle, protože tímto způsobem lze brát pouze bloky velikosti word (pro každý word nové volání ptrace).[3] Z tohoto důvodu osmá edice Unixu představuje procfs, které umožňuje povoleným procesům přímý přístup do paměti jiného procesu. Tato funkce byla implementována do verze 4.4BSD. Následně bylo užití /proc pro debuggery převzato do systémů Solaris, BSD, AIX a z větší části zkopírováno Linuxem.[3] V systému Solaris je ptrace zcela odstraněno jako systémové volání a je uzavřeno do volání knihovny, která předá volání do ptrace podle pravidel procfs.[4] Naopak FreeBSD rozšířilo ptrace a odstranilo tak výše zmíněné problémy a označilo procf za zastaralé, kvůli jeho návrhovým problémům.
Ptrace pouze poskytuje základní rozhraní nezbytné pro podporu debuggerů nebo podobných nástrojů. Programy (programátoři) jej využívající musí mít znalosti o daném operačním systému a jeho architektuře jako je stack layout, application binary interface, name mangling, the format of any debug data a odpovídají za porozumění a rozložení si strojového kódu. Porozumění systémovému volání vyžaduje znalost kontroleru mapovací tabulky systémového volání a pochopení příkazů (parametrů) každého volání. Dále programy vkládající spustitelný kód do cílového procesu nebo (jako gdb) umožňují uživateli zadávat příkazy spouštěné v rámci cíle, musí tento kód samy generovat a nahrávat obecně bez použití programového zavaděče.
Ptrace bylo poprvé implementováno do Unixu verze 7[5] a obsahují jej i dvě odnože Unixu SVR4 a BSD.[2] Jako systémové volání je ptrace dostupné i v IRIX,[6] AIX,[7] NetBSD,[8] FreeBSD,[5] OpenBSD[9] a Linuxu.[2] Na systému Solaris je dostupné jako volání knihovny, vestavěné v kernel procfs souborovém systému. Sun k tomu poznamenává, že ptrace je na systému Solaris kvůli zpětné kompatibilitě a doporučuje, aby nové implementace využívaly bohatšího rozhraní procfs, které jej nahrazuje.[4] UnixWare představuje také ptrace[10], ale podobně jako Sun, SCO doporučuje vývojářům místo něho použít základní vlastnosti procfs.[11] HP-UX podporuje ptrace do verze 11i v3 (bylo zavrženo ve prospěch ttrace).[12]
Apple Mac OS X také realizuje ptrace jako systémové volání. Verze od Apple přidává speciální možnost PT_DENY_ATTACH. Když proces zavolá tuto volbu sám na sebe následné pokusy o ptrace procesu se nezdaří.[13] Apple touto funkcí omezuje použití debuggerů na programy, které pracují s DRM (správou digitálních práv) včetně iTunes.[14] PT_DENY_ATTACH také zamezuje možnostem DTrace monitorovat proces.[15] Debuggery v OS X typicky využívají kombinaci ptrace a Mach VM.[16] Ptrace (opět s PT_DENY_ATTACH) je pro vývojáře k dispozici u Apple iPhone.[17]
V tomto článku byl použit překlad textu z článku ptrace na anglické Wikipedii.