2

“strace wget grooveshark.com”以错误的字符串长度停止奇怪的套接字调用,我必须按 Ctrl+C 来终止。

write(2, "Connecting to grooveshark.com (g"..., 67Connecting to grooveshark.com (grooveshark.com)|8.20.213.76|:80... ) = 67
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("8.20.213.76")}, 16) = 0
write(2, "connected.\n", 11connected.
)            = 11
select(4, NULL, [3], NULL, {900, 0})    = 1 (out [3], left {899, 999993})
write(3, "GET / HTTP/1.1\r\nUser-Agent: Wget"..., 115) = 115
write(2, "HTTP request sent, awaiting resp"..., 40HTTP request sent, awaiting response... ) = 40 [[ Check this line ]]
select(4, [3], NULL, NULL, {900, 0} ^C 

write(2, "HTTP request sent, awaiting resp"..., 40HTTP request sent, awaiting response...) = 40

应该

write(2, "HTTP 请求已发送,等待响应...", 40 ) = 40

但是 strace wget google.com 给出了

write(3, "GET / HTTP/1.1\r\nUser-Agent: Wget"..., 116) = 116
write(2, "HTTP request sent, awaiting resp"..., 40) = 40
select(4, [3], NULL, NULL, {900, 0})    = 1 (in [3], left {899, 932611})

并正确终止。

谢谢

4

2 回答 2

5

您看到 wget 的输出与 strace 的输出混合在一起。使用 -o 选项strace将跟踪存储在文件中,这样就不会发生这种情况。

write(2, "HTTP request sent, awaiting resp"..., 40HTTP request sent, awaiting response...) = 40

wget 中的这个 write 调用将消息打印到 stderr,在它返回之前,它的输出会在终端中看到,介于 40 和右括号之间

于 2012-06-13T07:30:27.393 回答
3

默认情况下stracestderr上输出,这通常是您的终端窗口。因此,由 给出的跟踪strace与被跟踪程序的输出混合在一起。

您可以运行strace -o /tmp/wget.tr wget http://grooveshark.com/以获取文件中的跟踪/tmp/wget.tr(您可以同时tail -f /tmp/wget.tr在另一个终端中运行以查看内部)。

我建议仔细阅读man strace的输出。

于 2012-06-13T07:28:40.130 回答