<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sv">
	<id>https://wiki.linux.se/index.php?action=history&amp;feed=atom&amp;title=Ptrace</id>
	<title>Ptrace - Versionshistorik</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.linux.se/index.php?action=history&amp;feed=atom&amp;title=Ptrace"/>
	<link rel="alternate" type="text/html" href="https://wiki.linux.se/index.php?title=Ptrace&amp;action=history"/>
	<updated>2026-04-11T18:24:48Z</updated>
	<subtitle>Versionshistorik för denna sida på wikin</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://wiki.linux.se/index.php?title=Ptrace&amp;diff=2347&amp;oldid=prev</id>
		<title>Admin: Skapade sidan med &#039;== ptrace - Kontrollera och övervaka processer == `ptrace` är ett systemanrop som används för att kontrollera och övervaka processer. Det används främst av debuggers och andra verktyg för att undersöka och manipulera en annan process.  === NAMN === ptrace - Kontrollera och övervaka processer  === SYNOPSIS ===  &lt;code&gt;  #include &lt;sys/ptrace.h&gt;   long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);  &lt;/code&gt;  === BESKRIVNING === `ptrace`...&#039;</title>
		<link rel="alternate" type="text/html" href="https://wiki.linux.se/index.php?title=Ptrace&amp;diff=2347&amp;oldid=prev"/>
		<updated>2024-06-07T13:59:13Z</updated>

		<summary type="html">&lt;p&gt;Skapade sidan med &amp;#039;== ptrace - Kontrollera och övervaka processer == `ptrace` är ett systemanrop som används för att kontrollera och övervaka processer. Det används främst av debuggers och andra verktyg för att undersöka och manipulera en annan process.  === NAMN === ptrace - Kontrollera och övervaka processer  === SYNOPSIS ===  &amp;lt;code&amp;gt;  #include &amp;lt;sys/ptrace.h&amp;gt;   long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);  &amp;lt;/code&amp;gt;  === BESKRIVNING === `ptrace`...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ny sida&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== ptrace - Kontrollera och övervaka processer ==&lt;br /&gt;
`ptrace` är ett systemanrop som används för att kontrollera och övervaka processer. Det används främst av debuggers och andra verktyg för att undersöka och manipulera en annan process.&lt;br /&gt;
&lt;br /&gt;
=== NAMN ===&lt;br /&gt;
ptrace - Kontrollera och övervaka processer&lt;br /&gt;
&lt;br /&gt;
=== SYNOPSIS ===&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/ptrace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BESKRIVNING ===&lt;br /&gt;
`ptrace` är ett systemanrop som tillåter en process (spåraren) att observera och kontrollera en annan process (spårad process). `ptrace` används ofta av debuggers som GDB för att sätta brytpunkter, inspektera minne, och stegvis exekvera instruktioner.&lt;br /&gt;
&lt;br /&gt;
=== ALTERNATIV ===&lt;br /&gt;
`ptrace` stöder flera alternativ som definieras av enum-typen `__ptrace_request`. Här är de vanligaste alternativen:&lt;br /&gt;
&lt;br /&gt;
* PTRACE_TRACEME - Gör den aktuella processen spårbar av sin förälder.&lt;br /&gt;
* PTRACE_PEEKTEXT, PTRACE_PEEKDATA, PTRACE_PEEKUSER - Läs ett ord från minnet eller register från den spårade processen.&lt;br /&gt;
* PTRACE_POKETEXT, PTRACE_POKEDATA, PTRACE_POKEUSER - Skriv ett ord till minnet eller register i den spårade processen.&lt;br /&gt;
* PTRACE_CONT - Fortsätt exekveringen av en spårad process.&lt;br /&gt;
* PTRACE_SYSCALL - Fortsätt en spårad process och stoppa vid nästa systemanrop.&lt;br /&gt;
* PTRACE_SINGLESTEP - Stegvis exekvera en instruktion i den spårade processen.&lt;br /&gt;
* PTRACE_GETREGS, PTRACE_SETREGS - Hämta eller ställ in registervärden i den spårade processen.&lt;br /&gt;
* PTRACE_GETFPREGS, PTRACE_SETFPREGS - Hämta eller ställ in flyttalsregister i den spårade processen.&lt;br /&gt;
* PTRACE_ATTACH - Fäst till en redan körande process och gör den spårbar.&lt;br /&gt;
* PTRACE_DETACH - Koppla loss från en spårad process.&lt;br /&gt;
* PTRACE_KILL - Skicka ett SIGKILL-signal till en spårad process.&lt;br /&gt;
&lt;br /&gt;
=== ANVÄNDNING ===&lt;br /&gt;
Här är flera exempel på hur man använder `ptrace` för att kontrollera och övervaka processer:&lt;br /&gt;
&lt;br /&gt;
==== Göra en process spårbar ====&lt;br /&gt;
För att en process ska kunna spåras av sin förälder, ska den anropa `ptrace` med `PTRACE_TRACEME`.&lt;br /&gt;
&lt;br /&gt;
===== EXEMPEL =====&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/ptrace.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 int main() {&lt;br /&gt;
     ptrace(PTRACE_TRACEME, 0, NULL, NULL);&lt;br /&gt;
     execl(&amp;quot;/bin/ls&amp;quot;, &amp;quot;ls&amp;quot;, NULL);&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detta program gör sig självt spårbart och kör sedan `ls`.&lt;br /&gt;
&lt;br /&gt;
==== Läsa från en spårad process ====&lt;br /&gt;
För att läsa ett ord från minnet i en spårad process, använd `PTRACE_PEEKDATA`.&lt;br /&gt;
&lt;br /&gt;
===== EXEMPEL =====&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/ptrace.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/wait.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 int main() {&lt;br /&gt;
     pid_t child = fork();&lt;br /&gt;
     if (child == 0) {&lt;br /&gt;
         ptrace(PTRACE_TRACEME, 0, NULL, NULL);&lt;br /&gt;
         execl(&amp;quot;/bin/ls&amp;quot;, &amp;quot;ls&amp;quot;, NULL);&lt;br /&gt;
     } else {&lt;br /&gt;
         wait(NULL);&lt;br /&gt;
         long data = ptrace(PTRACE_PEEKDATA, child, (void*)0x400000, NULL);&lt;br /&gt;
         printf(&amp;quot;Data at 0x400000: %lx\n&amp;quot;, data);&lt;br /&gt;
         ptrace(PTRACE_CONT, child, NULL, NULL);&lt;br /&gt;
     }&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detta program spårar ett barnprocess som kör `ls` och läser ett ord från dess minne.&lt;br /&gt;
&lt;br /&gt;
==== Stegvis exekvera instruktioner ====&lt;br /&gt;
För att stegvis exekvera instruktioner i en spårad process, använd `PTRACE_SINGLESTEP`.&lt;br /&gt;
&lt;br /&gt;
===== EXEMPEL =====&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/ptrace.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/wait.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 int main() {&lt;br /&gt;
     pid_t child = fork();&lt;br /&gt;
     if (child == 0) {&lt;br /&gt;
         ptrace(PTRACE_TRACEME, 0, NULL, NULL);&lt;br /&gt;
         execl(&amp;quot;/bin/ls&amp;quot;, &amp;quot;ls&amp;quot;, NULL);&lt;br /&gt;
     } else {&lt;br /&gt;
         wait(NULL);&lt;br /&gt;
         for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
             ptrace(PTRACE_SINGLESTEP, child, NULL, NULL);&lt;br /&gt;
             wait(NULL);&lt;br /&gt;
         }&lt;br /&gt;
         ptrace(PTRACE_CONT, child, NULL, NULL);&lt;br /&gt;
     }&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detta program stegvis exekverar 10 instruktioner i en spårad process som kör `ls`.&lt;br /&gt;
&lt;br /&gt;
==== Fästa till en redan körande process ====&lt;br /&gt;
För att fästa till en redan körande process och göra den spårbar, använd `PTRACE_ATTACH`.&lt;br /&gt;
&lt;br /&gt;
===== EXEMPEL =====&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/ptrace.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/wait.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 int main(int argc, char *argv[]) {&lt;br /&gt;
     if (argc != 2) {&lt;br /&gt;
         fprintf(stderr, &amp;quot;Usage: %s &amp;lt;pid&amp;gt;\n&amp;quot;, argv[0]);&lt;br /&gt;
         return 1;&lt;br /&gt;
     }&lt;br /&gt;
     pid_t pid = atoi(argv[1]);&lt;br /&gt;
     ptrace(PTRACE_ATTACH, pid, NULL, NULL);&lt;br /&gt;
     wait(NULL);&lt;br /&gt;
     printf(&amp;quot;Attached to process %d\n&amp;quot;, pid);&lt;br /&gt;
     ptrace(PTRACE_DETACH, pid, NULL, NULL);&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detta program fäster till en redan körande process med angivet PID och gör den spårbar.&lt;br /&gt;
&lt;br /&gt;
=== SKILLNADER MELLAN macOS OCH LINUX ===&lt;br /&gt;
Det finns viktiga skillnader att tänka på när man använder `ptrace` på macOS jämfört med Linux:&lt;br /&gt;
&lt;br /&gt;
Tillgänglighet: `ptrace` är tillgängligt på både macOS och Linux, men implementationen och stödet för olika funktioner kan variera.&lt;br /&gt;
&lt;br /&gt;
Funktionsuppsättning: Vissa `ptrace`-funktioner som är tillgängliga på Linux kanske inte är tillgängliga på macOS, och vice versa. Till exempel kan `PTRACE_SYSEMU` och `PTRACE_SYSEMU_SINGLESTEP` vara Linux-specifika.&lt;br /&gt;
&lt;br /&gt;
Säkerhetsbegränsningar: macOS har strängare säkerhetsbegränsningar för `ptrace`-användning. På macOS kan det krävas att processen körs med root-behörighet eller att System Integrity Protection (SIP) är inaktiverat för att tillåta fullständig spårning.&lt;br /&gt;
&lt;br /&gt;
Prestanda: Prestandan för `ptrace`-operationer kan variera mellan macOS och Linux beroende på operativsystemets kärnimplementation och optimeringar.&lt;br /&gt;
&lt;br /&gt;
=== FELSÖKNING ===&lt;br /&gt;
Om du får ett felmeddelande när du använder `ptrace`, kontrollera följande:&lt;br /&gt;
&lt;br /&gt;
Att du använder rätt syntax och alternativ för ditt specifika kommando.&lt;br /&gt;
Att processen du försöker spåra existerar och har rätt behörigheter.&lt;br /&gt;
Att alla nödvändiga paket och bibliotek är installerade och uppdaterade.&lt;br /&gt;
Att du har tillräckliga användarrättigheter för att spåra processer.&lt;br /&gt;
&lt;br /&gt;
Vanliga fel och deras lösningar:&lt;br /&gt;
* Felmeddelande: &amp;quot;Permission denied&amp;quot;:&lt;br /&gt;
  * Lösning: Kontrollera att du har nödvändiga behörigheter för att spåra de specifika processerna. På macOS kan det krävas root-behörighet eller att SIP är inaktiverat.&lt;br /&gt;
&lt;br /&gt;
* Felmeddelande: &amp;quot;No such process&amp;quot;:&lt;br /&gt;
  * Lösning: Kontrollera att den angivna processen existerar och är korrekt stavad.&lt;br /&gt;
&lt;br /&gt;
* Felmeddelande: &amp;quot;Invalid request&amp;quot;:&lt;br /&gt;
  * Lösning: Kontrollera att du använder en giltig `ptrace`-begäran för ditt operativsystem.&lt;br /&gt;
&lt;br /&gt;
=== AVANCERAD ANVÄNDNING ===&lt;br /&gt;
`ptrace` erbjuder avancerade funktioner som kan användas för att spåra och analysera processer mer effektivt. Här är några exempel:&lt;br /&gt;
&lt;br /&gt;
==== Inspektera och ändra registervärden ====&lt;br /&gt;
Du kan använda `PTRACE_GETREGS` och `PTRACE_SETREGS` för att inspektera och ändra registervärden i en spårad process.&lt;br /&gt;
&lt;br /&gt;
===== EXEMPEL =====&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/ptrace.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/wait.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/user.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 int main() {&lt;br /&gt;
     pid_t child = fork();&lt;br /&gt;
     if (child == 0) {&lt;br /&gt;
         ptrace(PTRACE_TRACEME, 0, NULL, NULL);&lt;br /&gt;
         execl(&amp;quot;/bin/ls&amp;quot;, &amp;quot;ls&amp;quot;, NULL);&lt;br /&gt;
     } else {&lt;br /&gt;
         wait(NULL);&lt;br /&gt;
         struct user_regs_struct regs;&lt;br /&gt;
         ptrace(PTRACE_GETREGS, child, NULL, &amp;amp;regs);&lt;br /&gt;
         printf(&amp;quot;RIP: %llx\n&amp;quot;, regs.rip);&lt;br /&gt;
         regs.rip += 2;  // Ändra instruktionspekaren&lt;br /&gt;
         ptrace(PTRACE_SETREGS, child, NULL, &amp;amp;regs);&lt;br /&gt;
         ptrace(PTRACE_CONT, child, NULL, NULL);&lt;br /&gt;
     }&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detta program inspekterar och ändrar instruktionspekaren i en spårad process som kör `ls`.&lt;br /&gt;
&lt;br /&gt;
==== Spåra systemanrop ====&lt;br /&gt;
Du kan använda `PTRACE_SYSCALL` för att stoppa en process vid varje systemanrop.&lt;br /&gt;
&lt;br /&gt;
===== EXEMPEL =====&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/ptrace.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/wait.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/user.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 int main() {&lt;br /&gt;
     pid_t child = fork();&lt;br /&gt;
     if (child == 0) {&lt;br /&gt;
         ptrace(PTRACE_TRACEME, 0, NULL, NULL);&lt;br /&gt;
         execl(&amp;quot;/bin/ls&amp;quot;, &amp;quot;ls&amp;quot;, NULL);&lt;br /&gt;
     } else {&lt;br /&gt;
         int status;&lt;br /&gt;
         wait(&amp;amp;status);&lt;br /&gt;
         while (WIFSTOPPED(status)) {&lt;br /&gt;
             ptrace(PTRACE_SYSCALL, child, NULL, NULL);&lt;br /&gt;
             wait(&amp;amp;status);&lt;br /&gt;
             if (WIFSTOPPED(status)) {&lt;br /&gt;
                 struct user_regs_struct regs;&lt;br /&gt;
                 ptrace(PTRACE_GETREGS, child, NULL, &amp;amp;regs);&lt;br /&gt;
                 printf(&amp;quot;System call: %lld\n&amp;quot;, regs.orig_rax);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detta program spårar systemanrop i en process som kör `ls`.&lt;br /&gt;
&lt;br /&gt;
==== Fånga och hantera signaler ====&lt;br /&gt;
Du kan använda `ptrace` för att fånga och hantera signaler som skickas till en spårad process.&lt;br /&gt;
&lt;br /&gt;
===== EXEMPEL =====&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/ptrace.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/wait.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 int main() {&lt;br /&gt;
     pid_t child = fork();&lt;br /&gt;
     if (child == 0) {&lt;br /&gt;
         ptrace(PTRACE_TRACEME, 0, NULL, NULL);&lt;br /&gt;
         execl(&amp;quot;/bin/ls&amp;quot;, &amp;quot;ls&amp;quot;, NULL);&lt;br /&gt;
     } else {&lt;br /&gt;
         int status;&lt;br /&gt;
         wait(&amp;amp;status);&lt;br /&gt;
         while (WIFSTOPPED(status)) {&lt;br /&gt;
             int signal = WSTOPSIG(status);&lt;br /&gt;
             printf(&amp;quot;Caught signal: %d\n&amp;quot;, signal);&lt;br /&gt;
             ptrace(PTRACE_CONT, child, NULL, (void*)(long)signal);&lt;br /&gt;
             wait(&amp;amp;status);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detta program fångar och hanterar signaler som skickas till en process som kör `ls`.&lt;br /&gt;
&lt;br /&gt;
=== SE ÄVEN ===&lt;br /&gt;
* [[strace]] - Spåra systemanrop och signaler (Linux).&lt;br /&gt;
* [[dtrace]] - Dynamisk spårning av operativsystem och applikationer.&lt;br /&gt;
* [[gdb]] - GNU Debugger.&lt;br /&gt;
* [[lsof]] - Lista öppna filer och de processer som använder dem.&lt;br /&gt;
&lt;br /&gt;
=== FÖRFATTARE ===&lt;br /&gt;
`ptrace` utvecklades som en del av Unix-operativsystemet och är nu en del av flera operativsystem inklusive Linux och macOS.&lt;br /&gt;
&lt;br /&gt;
=== KOLOFON ===&lt;br /&gt;
Denna sida är en del av `ptrace`-projektet. Mer information om projektet finns på ⟨https://man7.org/linux/man-pages/man2/ptrace.2.html⟩. Om du har en buggrapport för denna manualsida, se ⟨https://man7.org/linux/man-pages⟩. Denna sida erhölls från projektets upstream Git-repository ⟨https://github.com/man-pages-5.10.git⟩ den 2023-12-22. Om du upptäcker några renderingsproblem i denna HTML-version av sidan, eller om du tror att det finns en bättre eller mer uppdaterad källa för sidan, eller om du har korrigeringar eller förbättringar av informationen i denna KOLOFON (som inte är en del av den ursprungliga manualsidan), skicka ett e-postmeddelande till man-pages@man7.org.&lt;br /&gt;
&lt;br /&gt;
=== KÄLLOR ===&lt;br /&gt;
[https://man7.org/linux/man-pages/man2/ptrace.2.html ptrace manual (Linux)]&lt;br /&gt;
[https://github.com/man-pages-5.10 ptrace GitHub Repository]&lt;br /&gt;
&lt;br /&gt;
[[Kategori:Unix-kommandon]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>