2016-04-11 7 views
4

私は、トレースログはでPHPを実行している上のようなstraceコマンドによって生成されました:シェルのstraceをプレーンテキストに解析するにはどうすればよいですか?

sudo strace -e sendto -fp $(pgrep -n php) -o strace.log 

、出力は次のようになります。

11208 sendto(4, "set 29170397297_-cache-schema 85 0 127240\r\n\257\202\v\0?\0\0\0\2\27\10stdClass\24\7\21\3cid\21\6schema\21\4d\37ata\25\n\247\21\5block\24\6\21\6fields\24\f\21\3bid\24\2\5\21\4type 0\37erial\21\10not null\5\21\6module\24\4\16\7\21\7va\37rchar\21\6length\[email protected]\16\t\5\21\7default\r\21\5de\[email protected]\5\16\v\16\f\6 \35\7\16\r\21\0010\21\5t \207C \ 30 6 @ \ 2 \ 16 \ rを\ rnを\ 340 \ t \ 34 \ 7 \ 5pages \ 24 \ 2 \ 205 \ 3 \ 4tex @ 4 \ 21 \ 3int /\7\6\0\21\4size \222\finy\21\6weight\24\3 ;\0\22\300 \6\[email protected]\340\5P\5custom \ 27 \ 300,17 \ 16 \ 23 \ 16 \ 24 \ 21 \ \ 206 \ 261 \ 1it \ 365 \ 0 \ 5 \ 240 \0\377 \ 10 \ r \ 21 \ ftransl!\ 2ble%\ 1ca!a \ 340 \ 3Q \ 0 \ 1 n\31\vprimary key\24\1\6\0\16\6\21\[email protected]\21\ts\24\1\21\3tmd\24\3 \31\0\20 2\v\n\6\2\16\16\21\7index \210\10\1\21\4list\24\5\240\36\0\21 \36\10\26\6\3\16\25\6\4\16\n \1\6\4\21\4name \7\0\na\317\2_ro \ 252 \ 0 \ 5!$ \ 0 \ n \ 3 \ 341 \ 2 \ 23 \ 0 \ 16 \ 340 \ 0 \ 16A \ 214 \ 2 \ 21 \ 3r!\ 354 \ 36 \213\0\n \213\0\16 l\6%\16!\24\1\16% \ 271 \ 0%@ p \ 5 \ 16#1 y \ 0 \ 225a; \ 240 \ 201 \ 2 \ 21 \ van \ 0_ \207 \ 200 \ 2 \ 5 \ 16 \ 1 \ 340 \ 0U = @ U \ 1 \ 16 \ 3 @ 222 \ 212 \ 2lob @ 0 \ n \ 23 \ 16)\ 21 \ 6expire @ \ 30 \ 342 \ 0 \ 26 \ 7 \ 21 \ 7create \ 241 \ 17 < \25\0\n\203\1\"\177\0d Y \ 0 \ 22 \ 305 \ 5 \ 5 \ 240 \ a32 \ 0。 323 \ 2 \ 1 \ 16 \ 25 \ 340 \ 3 \ 16 \ r \ 167 \ 345 \ 340 \ 0U \223\340\0'AC\4sourc\202\202\340\3\27\0\v\200\27\0_C\326\340\0074\1\16\21 \ 240 \ 363 \ 2 \ 1 \ 16 \ 25 \ 0 \ 21 \ vmultipliers \31\0- \223\1\21\t\341\0\30B-\0\1!\10\0003a\253\0005 \ v155ac \ 327Dz \ "\ 364 \ 20 \ 0 \ 10 \ 6 \ 0333 \ r \ 0165 \ 16 \ 36 \ 0163 \ 21 \ nidenti $ x \ nr \ 0166 \ 21 \ 23 \ 240 \ r \ 0 \ 340 \ 1 \ 375 \ fs \ 21 \ 3api \ 24 \ 4 \ 21 \ 5 \ F \ 262 \ 0002 \ "\ 305 \ 0022 \ 21 \ 20 \ 16C \ 16B \ 21 \ 17H \ 5imum_v \ 260 $ \ 25 \ 7 \ 6 \ 340 \ 1N \ 5_groupa \ 247 \ 2 \ 6 \ 0163 \352\0\10 \352\2\0164\5 \325C%\341\0P\341\5\220\1\0162aQA\26\4\16:\5\21\17\201\321\1 c\"$\5back\21#\340\7b\0_\200!\340\3\311\1\16\7 C \ 340 \ 0a!\ 312 \ 1 \ no \ 300#240! & }\241\237\0\0\242e\341\4n\5\16;\24\10\16< \7\2=\21\35\340\1m\0 320 320 0342 3XAz16326161616132301 3412132222220243 0B0 \ 6文字列#o \ 4ツールバー\ 1 \ 16C \ 260 \ 0D!\ 4C \ 16L \ 16E!P \ 0F \ 3 \ 201T \ 16G \ 21 \ 21ckeditor_set%\ 266 \ 0gE \ 323 \ 0 \ 5% \ 0#4 @ 345!)\ "\ 372 \ 1 \ 21 \ 10 \ 340 \ 0!\ 0 \ 1 \ 31 \ 0 \ 32 \ 240 \ 334 \ 4 \ 16 \ n \ 21 \ 10 \ 300D \ r \ 2O \ 21 \ 25 \ 300 \ r \ 6_input_244+ \ 340 \ 16V \ 1 \ 16+ \ 31 \ 340 \ 4h X \ 0 \ 2; \ 0#\ 245 \ 0+ \ 4 \ 5 \ 24 \ 10 \ 21 \ 7 \\ 0 \ 243 \ 257 \ 301 \ 231 \ 1 \ 21 \ 4F \ 35 \ 340 \ 1 \ 22F \ 323 \ 0021 \ 21 \ 10 \ "311B \ 0e \ 223A \ 254 & f` \ 346 \"〜\ 6 \ vcollap & q% \ 227 \ 340 \ 6 \ 35 \ 2 \ 0 \ 21 \ t \ 240 \ 35 \ 344 \ 1a \ 3009 \ 0 \ 0#\ 212 \ 300 \ 0001 \ 200L $ 247 \ 1enFl \ 344 \ 0 \ 8196、MSG_NOSIGNAL | NULL、0)= 8196

これは普通のC escape codesで表されるようです。

私は同じようprintfによってシェルでそれらを解読しようとしました:(それはどんな意味がないように見えます)

while read line; do printf "%s" "$line"; done < <(cat strace.log | head -n2) 

が、それは失敗しました:6216rr n4tatus @

11208 sendto(4, "set 29170397297_-cache-schema 85 0 127240rn257202v0?00022710stdClass247213cid216schema214d37ata25n247215block246216fields24f213bid2425214type 037erial2110not [email protected][email protected]516v16f6 35716r210010215t 207C 30 206 2611it 36​​505240 0377 y10r21ftransl!N2ble%の1CA!a3403Q01 n31vprimary [email protected] 31020 2vn621616217index 210101214list24524036021 3610266316256416n 164214name 70na3172_ro 25205!$ 0nの3341223016340016A2142213r!354 v222110unsigned5 @ 2710 2130n 213016 l6%16!24116% 332036 @%の@のP51 @ @ 04213int /760214size 222finy216weight243 ;022300 [email protected] 27300,171623162421nvisibility340t3475pages242 20534tex 6#16 $ 21f200l241b @ n24166 M21016&@E4214bod201_53216t41623B\2g1634 303info [email protected]!L56forma201332B/!d241637 y0* Y0 225A;!2402012'21van0_ 207 200251613400U = @ U1163 @ 222 2122lob @ On2316)216expire @ 303420267217create24117 < 250n2031"1770d Y022 30555small240 a320.`2300.240240012402403,21vb S2kpo「3132s246 2202t212241q010 ...

straceコマンドの出力を解析して平文文字列をrecvfrom/sendtoに渡す方法がありますか?

新しい行(\r\n)を含む印刷可能な文字を印刷することは理想的ですが、NULLやその他の印刷不能な文字はカットオフできますか?

+0

'strace'がエスケープする理由は、それらがプレーンテキストではなくバイナリデータだからです。 –

+0

'\ 0 \ 0 \ 0 \ 2 \ 27 \ 10'のような出力をしたいのですか? –

+0

ダンプとそのコンテキストから意味のあるテキストを抽出したいと思います。どんなものでも、エスケープされた文字は読めないようにします。これは 'memcached'間の通信の可能性が最も高いです。 – kenorb

答えて

5

readシェルがすでに文字をエスケープしているため、文字列がエスケープされているため、\r\nrnと表示されます。

には、バックスラッシュが任意の文字をエスケープできるように(文字通り処理されるように)read -rを使用できます。次に例を示します。

while read -r line; do printf "%b\n" "$line"; done < strace.log | strings 

それはバイナリデータなので、上記の例だけ印刷可能な文字列を表示するstringsコマンドが含まれています。

Straceは、-xが指定されている場合、すべての文字列を16進数で表示することもサポートしますが、同じように動作します。ここで


はリアルタイムでstrace出力を解析するためのバージョンは次のとおりです。

while read -r line; 
    do printf "%b\n" "$line" | strings 
done < <(sudo strace -e recvfrom,sendto -s 1000 -fp $(pgrep -n php) 2>/dev/stdout) 

さらにstringsよりは、内部であるものだけを取得するには、grepを使用して、より具体的なフィルタで置き換えることができます二重引用符:

grep -o '".\+[^"]"' | grep -o '[^"]\+[^"]' 

rintバイナリ形式。それを避けるために

ので、以下のフォーマッタの別名を定義することができます、全体のプロセスを簡素化することができます:

alias format-strace='grep --line-buffered -o '\''".\+[^"]"'\'' | grep --line-buffered -o '\''[^"]*[^"]'\'' | while read -r line; do printf "%b" $line; done | tr "\r\n" "\275\276" | tr -d "[:cntrl:]" | tr "\275\276" "\r\n"' 

  • grep -o '".\+[^"]"'を - 引用符
  • grep -o '[^"]*[^"]'との二重引用符で囲まれた文字列を選択します - 二重引用符内のテキストを選択する
  • while read -r line - 各行をに保存するとdo何らかのアクション(help read
  • printf "%b" $line - バックスラッシュのエスケープシーケンスに
  • tr "\r\n" "\275\276"を拡大することにより、印刷ライン - すべての制御文字に
  • tr "\275\276" "\r\n"を削除 - - 新しい行末
  • を復元し、一時的に tr -d "[:cntrl:]"
  • \275\276\r\nを置き換えます

次に、いくつかのコマンドをトレースする完全な例(例:同様の例について

strace -e trace=read,write,recvfrom,sendto -s 1000 -fp $(pgrep -n php) 2>&1 | format-strace 

チェック:UnixのでHow to view the output of a running process in another bash session?phpは)のように見えることができます。SE

関連する問題