So enträtseln Sie die strace-Ausgabe richtig

454
torvin

Wie kann ich Strings ausgeben, die von ausgegeben werden strace? Ich sehe einige Ratschläge, die ich verwenden sollte printf '%b', aber das funktioniert in einigen Fällen nicht richtig für mich. Bedenken Sie echo -ne '\037\061':

$ strace -e write echo -ne '\037\061' write(1, "\0371", 21) = 2 +++ exited with 0 +++ 

Nun, wenn ich dies einfüge printf:

$ printf "%b" "\0371" | xxd -p f9 

In Wirklichkeit war es:

$ echo -ne '\037\061' | xxd -p 1f31 

Deutlich printf %binterpretiert \0371als \371(wie es dem Mann zufolge ). Dieses Mittel printfeignet sich nicht wirklich zum Dekodieren der straceAusgabe. Was soll ich stattdessen verwenden?

1

1 Antwort auf die Frage

2
Kamil Maciorowski

tl; dr - siehe "Schluss" ganz am Ende.


Was hier passiert, ist sehr interessant.

Vor allem echo -ewirkt es so (von man 1 echo):

\0NNN
Byte mit Oktalwert NNN(1 bis 3 Ziffern)

Dies bedeutet, dass 0in \037keine Oktalstelle steht, sondern lediglich ein Teil des \0Präfixes ist, der die fortlaufende Oktaleingabe anzeigt. Sie \037können sein \0037und jetzt ist nur die Sekunde 0eine Oktalziffer.

Noch innerhalb echo -e \061ist äquivalent zu \0061. Dies entspricht 1einem wörtlichen Zeichen, das "Eins" bedeutet.

Nun scheint es, dass der Teil der straceAusgabe, den Sie decodieren möchten, auf folgende Weise decodiert werden sollte:

write(1, "\0371", 21) ^ prefix that indicates consecutive octal output ^^^ three digits of octal output ^ literal character meaning "one" 

Also das Präfix hier ist \0aber nicht \.

Du verwendest printf "%b" "\0371". Die allgemeine Form lautet printf FORMAT [ARGUMENT]…und das man 1 printfsagt FORMATFolgendes aus %b:

%b
ARGUMENTals String mit \interpretierten Escape-Zeichen, außer dass oktale Escape-Zeichen die Form \0oder haben\0NNN

Wie Sie sehen, ist das Präfix \0wie in echo -e. Die Interpretation geht jetzt so:

printf "%b" "\0371" ^^ prefix that indicates consecutive octal input ^^^ three octal digits 

Dies erklärt Ihr falsches Ergebnis. Dasselbe Handbuch besagt jedoch, dass innere FORMATOktalstellen etwas anders interpretiert werden:

\NNN
Byte mit Oktalwert NNN(1 bis 3 Ziffern)

Das Präfix ist \genau wie in der Ausgabe von strace. Scheint zusätzlich stracedarauf zu achten, wann das nächste Zeichen als Oktalziffer interpretiert werden kann. Vergleichen Sie:

$ strace -e write echo -ne '\037' write(1, "\37", 1) = 1 +++ exited with 0 +++ 

zu

$ strace -e write echo -ne '\037\101' write(1, "\37A", 21) = 2 +++ exited with 0 +++ 

zu

$ strace -e write echo -ne '\037\061' write(1, "\0371", 21) = 2 +++ exited with 0 +++ 

Beachten Sie die Führung 0im letzten Fall. Es ist zu vermeiden, \371welches als ein Byte interpretiert werden würde.

Es sieht so aus, als könnten Sie printfzum Dekodieren der straceAusgabe verwenden, aber Sie sollten es als FORMATnicht weitergeben ARGUMENT:

$ printf "\0371" | xxd -p 1f31 

Aber andere Sequenzen, die in FORMAT(zB %b) interpretiert wurden, würden Sie in Schwierigkeiten bringen, also ist es besser, sich daran zu halten ARGUMENT. Ich spielte mit, sedum mich \in \0richtigen Fällen zu verwandeln, es wurde schnell mühsam; dann wurde mir klar %b, FORMATdass auch andere sequenzen in interpretiert werden ARGUMENT! Meiner Meinung nach ist das eine Sackgasse.


Fazit: Es ist viel besser, das Verhalten von zu ändern strace. Versuchen Sie die Hex-Ausgabe:

$ strace -xx -e write echo -ne '\037\061' write(1, "\x1f\x31", 21) = 2 +++ exited with 0 +++ 

Dann

$ printf "%b" "\x1f\x31" | xxd -p 1f31 
Danke für die ausführliche Erklärung. Ich mag die Idee mit '-x' jedoch nicht: Es macht die Ausgabe schwieriger zu lesen (jetzt muss ich alles decodieren!). "strace -xe write echo -ne" \ 037z "" führt zu "" \ x1f \ x7a "" anstatt zu viel nützlicherem "" \ x1fz "", was es viel schwieriger macht, nach dem Syscal zu suchen, nach dem ich suche in der Ausgabe von "strace" torvin vor 6 Jahren 0