strace: Что означает последовательный <незаконченный ...> системный вызов без <resumed>? - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь отладить многопоточный сетевой сервер, написанный на Python с strace -tt -f, и вывод данных strace сбивает меня с толку, потому что в одном потоке несколько последовательных системных вызовов с <unfinished...>, и возобновление не наблюдается после этого:

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

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Согласно предложению @ OznOg, это связано с тем, что многопоточное приложение работает слишком быстро, поэтому strace отбрасывает некоторые результаты.

В качестве лучшей альтернативы я переключился на более быстрый perf trace ./app, и проблема была решена. Обратите внимание, что если вы видите perf trace жалобу ignored trace, вы можете просто увеличить размер буфера событий на sudo sh -c "echo 1032 > /proc/sys/kernel/perf_event_mlock_kb"

0 голосов
/ 29 октября 2018

Убедитесь, что сокет, из которого вы пытаетесь получить данные с помощью «recvfrom», открыт и возвращает данные, потому что похоже, что ваш поток застрял в этой точке, так как сокет не вернул данные.

Также попробуйте добавить обработку исключений в код, чтобы улучшить его отладку.

...