strace:连续<未完成...>系统调用没有<resumed>意义是什么?



我正试图用strace -tt -f调试一个用Python编写的多线程网络服务器,strace输出让我感到困惑,因为在同一个线程上似乎有多个连续的<unfinished...>系统调用,之后没有观察到恢复:

9675  22:58:28.407844 <... recvfrom resumed> "22RT21Qn", 7, 0, NULL, NULL) = 7
9675  22:58:28.518079 recvfrom(3, "22RV21Q3n", 7, 0, NULL, NULL) = 7
9675  22:58:28.518672 sendto(7, "622RV21Qn", 12, 0, NULL, 0) = 12
9675  22:58:28.536676 poll([{fd=7, events=POLLIN|POLLPRI}], 1, 0 <unfinished ...>
9675  22:58:28.536739 <... poll resumed> ) = 1 ([{fd=7, revents=POLLIN}])
9675  22:58:28.538515 recvfrom(7,  <unfinished ...>
9675  22:58:28.539400 recvfrom(7,  <unfinished ...>
9675  22:58:28.539768 sendto(7, "622RW21Qn", 12, 0, NULL, 0 <unfinished ...>
9675  22:58:28.540629 poll([{fd=7, events=POLLIN|POLLPRI}], 1, 0 <unfinished ...>
9675  22:58:28.540666 <... poll resumed> ) = 1 ([{fd=7, revents=POLLIN|POLLERR|POLLHUP}])
9675  22:58:28.541170 recvfrom(7,  <unfinished ...>
9675  22:58:28.542603 recvfrom(7,  <unfinished ...>
9675  22:58:28.543449 shutdown(7, SHUT_RDWR <unfinished ...>
9675  22:58:28.544451 close(7 <unfinished ...>
9656  22:58:28.555189 accept4(5, {sa_family=AF_INET, sin_port=htons(38282), sin_addr=inet_addr("127.0.0.1")}, [16], SOCK_CLOEXEC) = 7
9656  22:58:28.555288 ioctl(7, FIONBIO, [0]) = 0
9656  22:58:28.555338 ioctl(7, FIONBIO, [0]) = 0
9656  22:58:28.555749 getpeername(7, {sa_family=AF_INET, sin_port=htons(38282), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0
9656  22:58:28.555810 getsockname(7, {sa_family=AF_INET, sin_port=htons(6000), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0
9656  22:58:28.555929 getpeername(7, {sa_family=AF_INET, sin_port=htons(38282), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0
9675  22:58:28.560799 sendto(7, "1022QP21R21Q2n", 14, 0, NULL, 0) = 14

根据@OznOg的建议,这是因为多线程应用程序运行得太快,因此strace会丢弃一些结果。

作为一个更好的选择,我切换到更快的perf trace ./app,问题得到了解决。注意,如果您看到perf trace抱怨ignored trace,您可以简单地将事件缓冲区大小增加sudo sh -c "echo 1032 > /proc/sys/kernel/perf_event_mlock_kb"

请确保您试图使用"recvfrom"从中获取数据的套接字是打开的,并且正在返回数据,因为套接字没有返回任何数据,所以看起来您的线程在这一点上卡住了。

还可以尝试将异常处理添加到代码中,以便更好地调试它。

最新更新