strace指定-e write=all仍无法显示完整HTTP Socket写入数据咨询
关于strace write调用内容截断的原因与解决方法
我来帮你拆解这个问题——你遇到的截断现象其实是strace的默认行为导致的,下面给你详细说清楚:
为什么会出现截断?
strace默认会限制每个系统调用输出的字符串长度(默认是32字节),当write的数据超过这个长度时,就会用...来省略后面的内容。你看到有些socket能显示完整数据,只是因为那些write的数据刚好没超过这个默认长度而已,和socket类型无关。
怎么获取所有write的完整数据?
很简单,只需要在你的strace命令里加上-s参数,指定一个足够大的字符串显示长度就行:
- 比如你想显示最多4096字节的内容,命令改成:
strace -o /tmp/capture.log -p <pid> -e trace=all -e write=all -e read=all -f -tt -s 4096 - 如果想完全不限制长度(不建议对超大数据这么做,会让日志变得无比庞大),可以把
-s的值设为0:strace -o /tmp/capture.log -p <pid> -e trace=all -e write=all -e read=all -f -tt -s 0
另外补充一点:如果write的数据包含非文本的二进制内容,strace会自动切换成十六进制+明文的混合显示模式,这也是你看到部分socket显示十六进制的原因,和截断是两回事哦。
内容的提问来源于stack exchange,提问作者Sony Antony
相关产品推荐
相关产品推荐

