Python strace:没有恢复的连续系统调用意味着什么?

Python strace:没有恢复的连续系统调用意味着什么?,python,linux,operating-system,system-calls,strace,Python,Linux,Operating System,System Calls,Strace,我正在尝试用strace-tt-f调试一个用Python编写的多线程网络服务器,strace输出使我感到困惑,因为在同一线程上似乎有多个连续的系统调用,并且在这之后没有观察到恢复: 9675 22:58:28.407844 <... recvfrom resumed> "\22RT\21Q\0\n", 7, 0, NULL, NULL) = 7 9675 22:58:28.518079 recvfrom(3, "\22RV\21Q\3\n", 7, 0, NULL, NULL)

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

9675  22:58:28.407844 <... recvfrom resumed> "\22RT\21Q\0\n", 7, 0, NULL, NULL) = 7
9675  22:58:28.518079 recvfrom(3, "\22RV\21Q\3\n", 7, 0, NULL, NULL) = 7
9675  22:58:28.518672 sendto(7, "\0\0\0\6\0\22RV\21Q\0\n", 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, "\0\0\0\6\0\22RW\21Q\0\n", 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, "\0\0\0\10\0\22QP\21R\21Q\2\n", 14, 0, NULL, 0) = 14

确保您尝试使用recvfrom获取数据的套接字已打开并正在返回数据,因为您的线程似乎在该点卡住,因为套接字未返回任何数据


还可以尝试向代码中添加异常处理,以便更好地进行调试。

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


作为更好的选择,我切换到更快的性能跟踪。/app,问题就解决了。请注意,如果您看到perf trace抱怨忽略了跟踪,您只需通过sudo sh-c echo 1032>/proc/sys/kernel/perf_event\u mlock\u kb来增加事件缓冲区大小即可。我认为有些日志是在此处丢弃的,应用程序运行得太快了,请尝试使用选项在此时检查单个系统调用-e@OznOg谢谢我将使用perf trace再试一次,它似乎很快。如果recvfrom从未返回,9675在返回后如何调用shutdown?