Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将shell中的strace解析为纯文本?_Shell_Parsing_Escaping_Strace - Fatal编程技术网

如何将shell中的strace解析为纯文本?

如何将shell中的strace解析为纯文本?,shell,parsing,escaping,strace,Shell,Parsing,Escaping,Strace,我已经通过以下命令生成了跟踪日志,如运行PHP时: sudo strace -e sendto -fp $(pgrep -n php) -o strace.log 输出如下所示: 11208发送到(4,"1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0 \ \0 \ \ \ \10 10 10\10STDC10\10 10中国内地内地基

我已经通过以下命令生成了跟踪日志,如运行PHP时:

sudo strace -e sendto -fp $(pgrep -n php) -o strace.log
输出如下所示:

11208发送到(4,"1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0 \ \0 \ \ \ \10 10 10\10STDC10\10 10中国内地内地基层基层分类分类分类\10 10 10 10 10\10 10\10\10\10\7 7\7\7\7\7\7\7\7\7\7\7\21\21\21\21\21\21\21\21\21\21\21\21\21\21\21\21\21\21\21\21\21\21\21\21\21\3\21\3\3\3\3\3\3\3\3\3\3\7\16\r\21\0010\21\5t\207
C
\30@6\2\16\r\n\4tatus@0\4\21\3int
/\7\6\0\21\4size\222\finy\21\6weight\24\3;\0\22\300\6\6region@8\340\5P\5custom
\27\300\17\16\23\16\24\21\nvisibility\340\t\34\7\5page\24\2\205\3\4tex@\206\261\1it\365\0\5\240
\0\377
y\10\r\21\ftransl!N\2ble%\1ca!a\340\3Q\0\1
N\31\vprimary key\24\1\6\0\16\6\vunique\24\1\21\21\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3 \3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\0\16 l\6%\16!\24\1\16%
\271\0%@p\5\16\16$\21\f\200l\241b@n\2\4\16\6
M\2\10\16&@E\4\21\4bod\201\U5\32\16\t\4\16\23B\\\2g\16\34\30\3info。\0\7a\255\0\200@q!L\5\6forma\201\332B/!d\2\4\16\37 y\0*
y\0\225a;\240\201\2'\21\van\0\ucode>\207
\200\2\5\16\1\340\0U=@U\1\16\3\222\212\2lob@O\n\23\16)\21\6过期@\30\342\0\26\7\21\7创建\241\17
<\25\0\n\203\1\“\177\0d
Y\0\22\305\5\5small\240!a\32\0.
\230\0.\240\240\0\1\240\240\3\21\vb S\2kpo\“\313\2s\24\6!\220\2\t\21\2\241q\0\10?\4\21\tno\213\6ort\5\21\fm\”\3ine\U A\313
\232\241\3\2\5\16\340\4\16\345\340\0U
\223\340\0'AC\4sourc\202\202\340\3\27\0\v\200\27\0\U C\326\340\0074\1\16\21
\u240\363\2\1\16\25\340\3\16\r\0\21\vmultip钳
\31\0-\223\1\21\t\341\0\30B-\0\1\10\0003a\253\0005
\v\0005ac\327Dz\“\364\20\0\10\6\0\333\r\0165\16\36\0163\21\nidenti$x\nr\0166\21\vadmin\10\21\5label\21\f\244H\6 hook\21\23\240\r\0\u340\1\375\fs\21\3api\24\4\21\21\21\5own f\0062\16C\21\17\17\H\n\26\26\26\26\26\241\242\242\244\244\244\242\244\244\242\305\0022\21\20\340\1N\5\U 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\1C\“$\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\0\342\3XAz\v\16>\16G\16?\16@\16A\21\30\341\tT\201\5\1\21\22\200\243\0 B0\6字符串o\4toolsbD\1\16C\260\0D!D\4C\16L\16E!P\0F\3\201T\16G\21\21ckeditor\U集合%\266\0gE\323\0\5%Q\0\4@\345!)\1\1\3\3\3\3\3\4\4\4\4\4\4\4\4\4\4\\4\4\4\4\4\4\4\4\4\4\4\4\4\4\10\3\3\3\3\3\3\3\3\3\3\3\3\3\4\4\3\4\4\4\4\4\\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\\4\4\4\\4\4\4\4\4\4\4\\\\\4\\\4\4\\\4\\4\4\4\4\4\4\4\\4\4\\4\\4\4\4\4\4\4\4\4\4\4\4\4\\\\\\\\\\\\\\4F\35!\340\1\22F\323\0021\21\10\“\311'B\0e@\223A\254&f`\346\“~\6\vcollap&q%\227\340\6\35\2\0\21\t\240\35\344\1a\3009\0\0\0\35;\ 212\300\0001\200L$\247\1enFl\344\0\216\300\0\1G\5\3view\340\0002\300\177\372\0\1K\0T!”!“…,8196,MSG_NOSIGNAL | MSG_MORE,NULL,0)=8196

听起来,这些都是由普通人代表的

我试着在shell中通过
printf
解码它们,比如:

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

在读取行时;do printf“%s”“$line”;done<为什么
读取
的问题不起作用,因为shell已经对字符进行转义,所以字符串被加倍转义,因此
\r\n
被打印为
rn

为了避免这种情况,您可以使用
read-r
,它允许反斜杠转义任何字符(因此它们被逐字处理)。以下是示例:

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

更多的
字符串
,可以使用
grep
替换为更具体的过滤器,以仅获取双引号内的内容:

grep -o '".\+[^"]"' | grep -o '[^"]\+[^"]'
但是,这仍然可以打印二进制格式

为了避免这种情况,让我们简化整个过程,因此让我们定义以下格式化程序别名:

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'[^”]*[^”]
    -选择双引号内的文本
  • 读取时-r行
    -将每行存储到
    $line
    执行一些操作(
    帮助读取
  • printf“%b”$line
    -通过展开反斜杠转义序列打印行
  • tr“\r\n”“\275\276”
    -将
    \r\n
    临时替换为
    \275\276
  • tr-d“[:cntrl:”
    -删除所有控制字符
  • tr“\275\276”“\r\n”
    -恢复新行结尾
然后,跟踪某个命令(例如
php
)的完整示例如下所示:

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


检查类似的示例:在Unix.SE上,
strace
转义它们的原因是它们是二进制数据,而不是纯文本。对于类似
\0\0\0\2\27\10的内容,您希望输出什么?我想从转储及其上下文中提取一些有意义的文本。不管是什么,但转义字符使其无法读取。这很可能是
memcached
之间的通信对我来说不正常。例如,
\0374
printf
解码为
fc
,而实际上它是
1f34
strace -e trace=read,write,recvfrom,sendto -s 1000 -fp $(pgrep -n php) 2>&1 | format-strace