{"id":25234,"date":"2026-10-12T13:29:18","date_gmt":"2026-10-12T11:29:18","guid":{"rendered":"https:\/\/linux-bibel.at\/?p=25234"},"modified":"2026-10-15T13:33:01","modified_gmt":"2026-10-15T11:33:01","slug":"__trashed","status":"publish","type":"post","link":"https:\/\/linux-bibel.at\/index.php\/2026\/10\/12\/__trashed\/","title":{"rendered":"strace &#8230;.. ein Lieblingsprogramm von mir"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Was soll ich sagen, es ist und bleibt DAS Lieblingsprogramm von mit. Wann immer ich ein Problem mit irgend einer Software habe, schaue ich mir mit strace an, was das Programm so macht. Wenn man dann den source-Code zur Hand hat k\u00f6nnte es passieren, dass das Problem ruckzuck keines mehr ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich lernte strace auf der SUN-Sparc kennen und sch\u00e4tzen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was kann strace?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">strace protokolliert alle Systemaufrufe (syscall) und auch die Aufrufparameter. Damit kann man erkennen, was so innerhalb des Programmes passiert. Aber auch welche Programmspr\u00fcnge ein Programmierer eingebaut hat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Programm wird bei der Systeminstallation mitinstalliert und ist sofort abrufbereit. Aber Achtung: es werden viele Informationen gesammelt und durch das permanente Unterbrechen des Ablaufes kommt es zu Performanceverlust am mitgetraceten Programm.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das erste Beispiel<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">strace ls<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Ausgabe erfolgt dann auf stderr auf den Bildschirm und schaut so aus.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>execve(\"\/usr\/bin\/ls\", &#091;\"ls\"], 0x7ffebdeb98d0 \/* 43 vars *\/) = 0\nbrk(NULL)                               = 0x560639e12000\nmmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa220e2e000\naccess(\"\/etc\/ld.so.preload\", R_OK)      = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)\nopenat(AT_FDCWD, \"\/etc\/ld.so.cache\", O_RDONLY|O_CLOEXEC) = 3\nfstat(3, {st_mode=S_IFREG|0644, st_size=134971, ...}) = 0\nmmap(NULL, 134971, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa220e0d000\nclose(3)                                = 0\nopenat(AT_FDCWD, \"\/lib\/x86_64-linux-gnu\/libselinux.so.1\", O_RDONLY|O_CLOEXEC) = 3\nread(3, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0&gt;\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"..., 832) = 832\nfstat(3, {st_mode=S_IFREG|0644, st_size=202984, ...}) = 0\nmmap(NULL, 210640, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa220dd9000\nmmap(0x7fa220de0000, 131072, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7fa220de0000\nmmap(0x7fa220e00000, 36864, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x27000) = 0x7fa220e00000\nmmap(0x7fa220e09000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x30000) = 0x7fa220e09000\nmmap(0x7fa220e0b000, 5840, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa220e0b000\nclose(3)       <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">wollen wir uns jetzt die Daten etwas genauer anschauen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>execve(&#8222;\/usr\/bin\/ls&#8220;, [&#8222;ls&#8220;], 0x7ffebdeb98d0 \/<\/em> 43 vars <em>\/) = 0<br>brk(NULL) = 0x560639e12000<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn wir jetzt in den Man-Pages mittels &#8222;man execver&#8220; nachschauen, dann finden wir das diese Routine zust\u00e4ndig ist f\u00fcr den Start eines Programmes u.a. auch f\u00fcr die \u00dcbergabeparameter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">*mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa220e2e000 *<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Man mmap  diese Funktion verr\u00e4t uns;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><br><em>&#8222;DESCRIPTION<br>mmap() creates a new mapping in the virtual address space of the calling<br>process. The starting address for the new mapping is specified in addr.<br>The length argument specifies the length of the mapping (which must be<br>greater than 0).&#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also kurz gesagt man kann damit, Speicherbereiche anfordern Die n\u00e4chste Routine pr\u00fcft ob man eine Datei \u00f6ffnen kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8222;access(&#8222;\/etc\/ld.so.preload&#8220;, R_OK) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)&#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und hier wird es spannend.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Returncode wird ausgegeben. -1 was soviel wie &#8222;nicht vorhanden&#8220;&#8220; bedeutet. Oder f\u00fcr die Gurus ENOENT. F\u00fcr alle die in den Guru-Status hineinwachsen wollen, denen sei das Kommando &#8222;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>errno -l<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">ans Herz gelegt. Das Programm muss allerdings vorher installiert werden<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install moreutils<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">erledigt das. Der Returncode wird pro Funktion definiert und gilt f\u00fcr diese eine Funtion. \u00dcblich sind Returncode 0 als OK und beendet. ein Returncode ungleich 0 z.B -1 deutet auf einen Fehler hin. Im Terminal kann man den Returncode \u00fcber die Variable $? abfragen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls \/tmp\/murksi ; echo \" der Returncode = $? \"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><em>openat(AT_FDCWD, &#8222;\/etc\/ld.so.cache&#8220;, O_RDONLY|O_CLOEXEC) = 3<br>fstat(3, {st_mode=S_IFREG|0644, st_size=134971, &#8230;}) = 0<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Zeile erz\u00e4hlt uns, dass eine &#8222;Datei&#8220; ge\u00f6ffnet wurde und die fstat-routine positioniert einen Zeiger auf eine bestimmte Stelle. Wir werden dann in weiterer Folge read, write, fstat Befehle finden gefolgt von mmap und \u00e4hnlichem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt muss ich noch etwas \u00fcber die Philosophie von Unix plaudern. Und wenn mich alle w\u00fcrgen, ich bleibe bei meiner Aussage: Linux ist nur ein weiteres Unix. Und mit Unix meine ich jenes, das <a href=\"https:\/\/de.wikipedia.org\/wiki\/Ken_Thompson\">Ken Thompson<\/a> und <a href=\"https:\/\/de.wikipedia.org\/wiki\/Dennis_Ritchie\">Dennis Ritchie<\/a> begonnen haben zu entwickelt. Also nicht das Markenzeichen von Novell, SCO oder Sun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und wie sagte ein Unix-Entwickler, Kollege und Freund einmal zu mir&#8230;. &#8222;It&#8217;s allways a file&#8230;.. &#8220; Und bet strace sieht man es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und was bedeutet es gerade bei strace. Memory, Netzwerk, Datenr\u00e4ger alles wird im Kern als &#8222;Datei&#8220; angesprochen. Selbst der Bildschirm ist eine Datei, ebenso die Tastatur und die Maus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dazu muss man wissen, dass beim \u00d6ffnen einer Datei ein Filedescriptor vergeben werden. Diese Filedescriptoren gelten pro Prozess und werden beim close zbw. bei Prozessende geschlossen. Daher gibt es im Minumum bei Start einen Prozess 3 Filediscriptoren, 0 oder STDIN f\u00fcr Standard-in (meistens die Tastatur) 1 oder STDOUT f\u00fcr die Ausgabe, (meistens\/manchmal der Bildschirm.), 2 oder STDERR als Ausgabe des Error-Protokolls.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ihr habt sicher schon ein Kommando \u00e4hnlich<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls \/tmp\/murksi 2&gt;\/tmp\/stderror.txt | grep \"mu\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">gesehen. Wollen wir uns jetzt anschauen was da passiert: ls wurde nur den Dateinamen anzeigen, wenn es die Datei gibt.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>gibt es die Datei NICHT wird die Fehlermeldung in die Datei stderret.txt geschrieben.<\/li>\n\n\n\n<li>gibt es die Datei, wird die Ausgabe (STDOUT) als Eingabe (STDIN) dem grep-Prozess \u00fcbergeben. (Pipe &#8211; Symbole)<\/li>\n\n\n\n<li>Dann erfolgt eine Suche im Programm grep nach dem Begriff &#8222;mu&#8220; in dieser Liste.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Vorgang wird duch entsprechenden Syscalls erreicht und da kann strace helfen<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So wir haben jetzt ein paar Grundlagen geschaffen, die meisten wissen das alles schon. Dann wollen wir uns um den Aufruf von strace k\u00fcmmern, damit wir uns an die Stelle Programm-Kern vorarbeiten k\u00f6nnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es gibt eine Menge an Parameter die man anwenden kann. Die wichtigsten als \u00dcbersicht.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>-o Die Angabe von Path und Datei, und alle Ausgaben werden in diese Datei geschrieben. Aber Achtung das kann viel werden.<\/li>\n\n\n\n<li>-p Wenn man eine ProzessID kennt (z.B von top) dann kann man diesen Hintergrundprozess beobachten. Wenn man auch die Kindprozesse beobachten will dann ist die<\/li>\n\n\n\n<li>-f Option f\u00fcr die Beobachtung der Kinder notwendig. Damit bekomme ich eine \u00dcbersicht was welcher Kindprozess startet\/beendet wird.<\/li>\n\n\n\n<li>-n gibt die Syscall-Nummer mit aus. Brauchbar wenn man nur etwas sehen oder nicht sehen will.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">ansonsten kann ich nur empfehlen, sich die man-page durch zu schauen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ach ja f\u00fcr alle, die auch auf anderen Betriebsystemen arbeiten. Unter BSD, Solaris lautet das Programm &#8222;truss&#8220; auf HP &#8222;trusc&#8220; und Apple bezeichnet es als dtruss<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was soll ich sagen, es ist und bleibt DAS Lieblingsprogramm von mit. Wann immer ich ein Problem mit irgend einer Software habe, schaue ich mir mit strace an, was das Programm so macht. Wenn man dann den source-Code zur Hand hat k\u00f6nnte es passieren, dass das Problem ruckzuck keines mehr ist. Ich lernte strace auf [&hellip;]<\/p>\n","protected":false},"author":52,"featured_media":25237,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[12,5,6],"class_list":["post-25234","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","tag-kommandozeile","tag-linux","tag-terminal"],"_links":{"self":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/25234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/comments?post=25234"}],"version-history":[{"count":6,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/25234\/revisions"}],"predecessor-version":[{"id":25257,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/25234\/revisions\/25257"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media\/25237"}],"wp:attachment":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media?parent=25234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/categories?post=25234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/tags?post=25234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}