tcp сервер libuv работает корректно, только если работает под Valgrind - PullRequest
0 голосов
/ 23 октября 2019

Я нашел это Гист пару дней назад. Я немного адаптировал его в своем репозитории проекта CMake и обнаружил странное поведение: он корректно работает только под valgrind. Ничего не печатается, когда работает нормально или под GDB. Я думаю, что это состояние гонки, но не могу его выяснить. Кто-нибудь может помочь в этом исследовании?

Вальгринд печатает:

/usr/bin/valgrind --tool=memcheck --xml=yes --xml-file=/tmp/valgrind --gen-suppressions=all /home/fiorentinoing/devel/libuv_tls/cmake-build-debug/test/bin/libuv_tls
int main()
void prepare_if_need_to_flush_ssl_state(uv_prepare_t*)
void try_flush_ssl_state(uv_handle_t*)
void on_new_connection(uv_stream_t*, int)
tls_uv_connection_state_t* on_create_connection(uv_tcp_t*)
int on_connection_established(tls_uv_connection_state_t*)
int connection_write(tls_uv_connection_state_t*, void*, int)
void maybe_flush_ssl(tls_uv_connection_state_t*)
void check_if_need_to_flush_ssl_state(uv_check_t*)
void try_flush_ssl_state(uv_handle_t*)
void prepare_if_need_to_flush_ssl_state(uv_prepare_t*)
void try_flush_ssl_state(uv_handle_t*)
void alloc_buffer(uv_handle_t*, size_t, uv_buf_t*)
void handle_read(uv_stream_t*, ssize_t, const uv_buf_t*)
rc: -1
void maybe_flush_ssl(tls_uv_connection_state_t*)
void check_if_need_to_flush_ssl_state(uv_check_t*)
void try_flush_ssl_state(uv_handle_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void complete_write(uv_write_t*, int)
void prepare_if_need_to_flush_ssl_state(uv_prepare_t*)
void try_flush_ssl_state(uv_handle_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void alloc_buffer(uv_handle_t*, size_t, uv_buf_t*)
void handle_read(uv_stream_t*, ssize_t, const uv_buf_t*)
rc: 78
int on_read(tls_uv_connection_state_t*, void*, ssize_t)
int connection_write(tls_uv_connection_state_t*, void*, int)
void maybe_flush_ssl(tls_uv_connection_state_t*)
rc: -1
void maybe_flush_ssl(tls_uv_connection_state_t*)
void check_if_need_to_flush_ssl_state(uv_check_t*)
void try_flush_ssl_state(uv_handle_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void remove_connection_from_queue(tls_uv_connection_state_t*)
void complete_write(uv_write_t*, int)
void complete_write(uv_write_t*, int)
void prepare_if_need_to_flush_ssl_state(uv_prepare_t*)
void try_flush_ssl_state(uv_handle_t*)

в то время как под печатью GDB:

/home/fiorentinoing/devel/libuv_tls/cmake-build-debug/test/bin/libuv_tls
int main()
void prepare_if_need_to_flush_ssl_state(uv_prepare_t*)
void try_flush_ssl_state(uv_handle_t*)
void on_new_connection(uv_stream_t*, int)
tls_uv_connection_state_t* on_create_connection(uv_tcp_t*)
int on_connection_established(tls_uv_connection_state_t*)
int connection_write(tls_uv_connection_state_t*, void*, int)
void maybe_flush_ssl(tls_uv_connection_state_t*)
void check_if_need_to_flush_ssl_state(uv_check_t*)
void try_flush_ssl_state(uv_handle_t*)
void prepare_if_need_to_flush_ssl_state(uv_prepare_t*)
void try_flush_ssl_state(uv_handle_t*)
void alloc_buffer(uv_handle_t*, size_t, uv_buf_t*)
void handle_read(uv_stream_t*, ssize_t, const uv_buf_t*)
rc: -1
void maybe_flush_ssl(tls_uv_connection_state_t*)
void check_if_need_to_flush_ssl_state(uv_check_t*)
void try_flush_ssl_state(uv_handle_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void complete_write(uv_write_t*, int)
void prepare_if_need_to_flush_ssl_state(uv_prepare_t*)
void try_flush_ssl_state(uv_handle_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void alloc_buffer(uv_handle_t*, size_t, uv_buf_t*)
void handle_read(uv_stream_t*, ssize_t, const uv_buf_t*)
rc: -1
void maybe_flush_ssl(tls_uv_connection_state_t*)
void check_if_need_to_flush_ssl_state(uv_check_t*)
void try_flush_ssl_state(uv_handle_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void remove_connection_from_queue(tls_uv_connection_state_t*)
void complete_write(uv_write_t*, int)
void complete_write(uv_write_t*, int)
void prepare_if_need_to_flush_ssl_state(uv_prepare_t*)
void try_flush_ssl_state(uv_handle_t*)
void alloc_buffer(uv_handle_t*, size_t, uv_buf_t*)
void handle_read(uv_stream_t*, ssize_t, const uv_buf_t*)
rc: 78
int on_read(tls_uv_connection_state_t*, void*, ssize_t)
int connection_write(tls_uv_connection_state_t*, void*, int)
void maybe_flush_ssl(tls_uv_connection_state_t*)
rc: -1
void maybe_flush_ssl(tls_uv_connection_state_t*)
void check_if_need_to_flush_ssl_state(uv_check_t*)
void try_flush_ssl_state(uv_handle_t*)
void flush_ssl_buffer(tls_uv_connection_state_t*)
void remove_connection_from_queue(tls_uv_connection_state_t*)
void complete_write(uv_write_t*, int)
void prepare_if_need_to_flush_ssl_state(uv_prepare_t*)
void try_flush_ssl_state(uv_handle_t*)

В соответствии с просьбой на русском Я добавляю разницу в две "стены текста":

28a29,41
> rc: -1
> void maybe_flush_ssl(tls_uv_connection_state_t*)
> void check_if_need_to_flush_ssl_state(uv_check_t*)
> void try_flush_ssl_state(uv_handle_t*)
> void flush_ssl_buffer(tls_uv_connection_state_t*)
> void flush_ssl_buffer(tls_uv_connection_state_t*)
> void remove_connection_from_queue(tls_uv_connection_state_t*)
> void complete_write(uv_write_t*, int)
> void complete_write(uv_write_t*, int)
> void prepare_if_need_to_flush_ssl_state(uv_prepare_t*)
> void try_flush_ssl_state(uv_handle_t*)
> void alloc_buffer(uv_handle_t*, size_t, uv_buf_t*)
> void handle_read(uv_stream_t*, ssize_t, const uv_buf_t*)
38d50
< void flush_ssl_buffer(tls_uv_connection_state_t*)
40d51
< void complete_write(uv_write_t*, int)
...