【问题标题】:strace: What do consecutive <unfinished...> syscall with no <resumed> mean?strace:没有 <resumed> 的连续 <unfinished...> 系统调用是什么意思?
【发布时间】:2019-04-02 01:12:11
【问题描述】:

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

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

【问题讨论】:

  • 我认为有些日志被丢弃在这里应用程序运行速度太快
  • 尝试使用选项 -e 检查单个系统调用
  • @OznOg 谢谢。我会用perf trace 再试一次,这似乎更快

标签: python linux operating-system system-calls strace


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    确保您尝试使用“recvfrom”获取数据的套接字已打开并且正在返回数据,因为看起来您的线程此时卡住了,因为套接字没有返回任何数据。

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

    【讨论】:

    • 如果recvfrom永远回不来,9675怎么会在它之后调用shutdown
    猜你喜欢
    • 2014-09-03
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多