HengXin666 / HXNet

C++20协程和基于io_uringの百万并发服务器; 可异步读写, 支持Transfer-Encoding分块编码传输文件; 基于压缩前缀树编写的路由, 支持通配符解析;+ http/https/websocket、socks5代理、Json解析、Json静态反射到结构体, 静态枚举映射, 支持STL容器的print/toString等
Apache License 2.0
3 stars 0 forks source link

致命问题: 如果触发超时, 则会段错误 #1

Closed HengXin666 closed 5 days ago

HengXin666 commented 5 days ago

致命问题

之前学习io_uring的时候, 被某个三流文章误导了, 以为 使用 io_uring 关闭文件的时候会自动删除 等待队列里面的 和这个fd 有关的任务.

但是我错了qwq, 为什么现在才发现? 原来是我的超时时间调的太长了?! 怎么之前又没有遇到?! 难道和某一个bug给弄混了?

烦人qwq...

HengXin666 commented 5 days ago

非常抱歉! 我会马上修复的!qwq...

HengXin666 commented 5 days ago

非常糟糕! 甚至因此(如果超时)内存泄漏:

AddressSanitizer:DEADLYSIGNAL
=================================================================
==151502==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x7fcfe64c71fc bp 0x7fcfe2ffd420 sp 0x7fcfe2ffd378 T1)
==151502==The signal is caused by a READ memory access.
==151502==Hint: address points to the zero page.
    #0 0x7fcfe64c71fc in std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&) /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++98/tree.cc:370
    #1 0x63c5852acb4d in std::_Rb_tree<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > >, std::pair<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const, std::__n4861::coroutine_handle<void> >, std::_Select1st<std::pair<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const, std::__n4861::coroutine_handle<void> > >, std::less<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > >, std::allocator<std::pair<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const, std::__n4861::coroutine_handle<void> > > >::_M_erase_aux(std::_Rb_tree_const_iterator<std::pair<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const, std::__n4861::coroutine_handle<void> > >) (/home/Heng_Xin/HXcode/HXNet/build/HXNet+0x16eb4d) (BuildId: 07ab9c4517de94ddf5ce3044921b0547edc90c81)
    #2 0x63c5852ab4ff in std::_Rb_tree<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > >, std::pair<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const, std::__n4861::coroutine_handle<void> >, std::_Select1st<std::pair<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const, std::__n4861::coroutine_handle<void> > >, std::less<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > >, std::allocator<std::pair<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const, std::__n4861::coroutine_handle<void> > > >::erase[abi:cxx11](std::_Rb_tree_iterator<std::pair<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const, std::__n4861::coroutine_handle<void> > >) /usr/include/c++/14.1.1/bits/stl_tree.h:1206
    #3 0x63c5852aa405 in std::multimap<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > >, std::__n4861::coroutine_handle<void>, std::less<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > >, std::allocator<std::pair<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const, std::__n4861::coroutine_handle<void> > > >::erase[abi:cxx11](std::_Rb_tree_iterator<std::pair<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const, std::__n4861::coroutine_handle<void> > >) /usr/include/c++/14.1.1/bits/stl_multimap.h:715
    #4 0x63c5852a9ab1 in HX::STL::coroutine::loop::TimerLoop::delTimer(std::_Rb_tree_iterator<std::pair<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const, std::__n4861::coroutine_handle<void> > >) /home/Heng_Xin/HXcode/HXNet/include/HXSTL/coroutine/loop/TimerLoop.h:68
    #5 0x63c5852a9f02 in HX::STL::coroutine::loop::TimerLoop::SleepAwaiter::~SleepAwaiter() /home/Heng_Xin/HXcode/HXNet/include/HXSTL/coroutine/loop/TimerLoop.h:118
    #6 0x63c5852a945a in sleepFor /home/Heng_Xin/HXcode/HXNet/src/HXSTL/coroutine/loop/TimerLoop.cpp:46
    #7 0x63c5852a985d in sleepFor /home/Heng_Xin/HXcode/HXNet/src/HXSTL/coroutine/loop/TimerLoop.cpp:43
    #8 0x63c5851c6a21 in std::__n4861::coroutine_handle<HX::STL::coroutine::promise::Promise<HX::STL::container::NonVoidHelper<void>, true> >::destroy() const /usr/include/c++/14.1.1/coroutine:244
    #9 0x63c5851b913a in HX::STL::coroutine::task::Task<HX::STL::container::NonVoidHelper<void>, HX::STL::coroutine::promise::Promise<HX::STL::container::NonVoidHelper<void>, true>, HX::STL::coroutine::awaiter::ExitAwaiter<HX::STL::container::NonVoidHelper<void>, HX::STL::coroutine::promise::Promise<HX::STL::container::NonVoidHelper<void>, true> > >::~Task() /home/Heng_Xin/HXcode/HXNet/include/HXSTL/coroutine/task/Task.hpp:58
    #10 0x63c5851a154a in operator() /home/Heng_Xin/HXcode/HXNet/examples/ChatServerByJson.cpp:109
    #11 0x63c5851a337c in whenAnyImpl /home/Heng_Xin/HXcode/HXNet/include/HXSTL/coroutine/task/WhenAny.hpp:132
    #12 0x63c5851a4374 in whenAnyHelper /home/Heng_Xin/HXcode/HXNet/include/HXSTL/coroutine/task/WhenAny.hpp:114
    #13 0x63c5852ae3a8 in triggerWait /home/Heng_Xin/HXcode/HXNet/src/HXSTL/coroutine/loop/TriggerWaitLoop.cpp:22
    #14 0x63c5851a6a4d in std::__n4861::coroutine_handle<void>::resume() const (/home/Heng_Xin/HXcode/HXNet/build/HXNet+0x68a4d) (BuildId: 07ab9c4517de94ddf5ce3044921b0547edc90c81)
    #15 0x63c5852ad8f6 in HX::STL::coroutine::loop::TriggerWaitLoop::~TriggerWaitLoop() /home/Heng_Xin/HXcode/HXNet/src/HXSTL/coroutine/loop/TriggerWaitLoop.cpp:9
    #16 0x7fcfe6252fa0  (/usr/lib/libc.so.6+0x3efa0) (BuildId: 32a656aa5562eece8c59a585f5eacd6cf5e2307b)
    #17 0x7fcfe625306d in exit (/usr/lib/libc.so.6+0x3f06d) (BuildId: 32a656aa5562eece8c59a585f5eacd6cf5e2307b)
    #18 0x63c5851acc58 in ChatController::_HX_endpoint_end::{lambda()#1}::operator()() const::{lambda(HX::web::server::IO<void> const&)#1}::operator()(HX::web::server::IO<void> const) const (/home/Heng_Xin/HXcode/HXNet/build/HXNet+0x6ec58) (BuildId: 07ab9c4517de94ddf5ce3044921b0547edc90c81)
    #19 0x63c5851d80a0 in HX::STL::coroutine::task::Task<bool, HX::STL::coroutine::promise::Promise<bool, true>, HX::STL::coroutine::awaiter::ExitAwaiter<bool, HX::STL::coroutine::promise::Promise<bool, true> > > std::__invoke_impl<HX::STL::coroutine::task::Task<bool, HX::STL::coroutine::promise::Promise<bool, true>, HX::STL::coroutine::awaiter::ExitAwaiter<bool, HX::STL::coroutine::promise::Promise<bool, true> > >, ChatController::_HX_endpoint_end::{lambda()#1}::operator()() const::{lambda(HX::web::server::IO<void> const&)#1}&, HX::web::server::IO<void> const>(std::__invoke_other, ChatController::_HX_endpoint_end::{lambda()#1}::operator()() const::{lambda(HX::web::server::IO<void> const&)#1}&, HX::web::server::IO<void> const&&) (/home/Heng_Xin/HXcode/HXNet/build/HXNet+0x9a0a0) (BuildId: 07ab9c4517de94ddf5ce3044921b0547edc90c81)
    #20 0x63c5851cf5fe in std::enable_if<is_invocable_r_v<HX::STL::coroutine::task::Task<bool, HX::STL::coroutine::promise::Promise<bool, true>, HX::STL::coroutine::awaiter::ExitAwaiter<bool, HX::STL::coroutine::promise::Promise<bool, true> > >, ChatController::_HX_endpoint_end::{lambda()#1}::operator()() const::{lambda(HX::web::server::IO<void> const&)#1}&, HX::web::server::IO<void> const&>, HX::STL::coroutine::task::Task<bool, HX::STL::coroutine::promise::Promise<bool, true>, HX::STL::coroutine::awaiter::ExitAwaiter<bool, HX::STL::coroutine::promise::Promise<bool, true> > > >::type std::__invoke_r<HX::STL::coroutine::task::Task<bool, HX::STL::coroutine::promise::Promise<bool, true>, HX::STL::coroutine::awaiter::ExitAwaiter<bool, HX::STL::coroutine::promise::Promise<bool, true> > >, ChatController::_HX_endpoint_end::{lambda()#1}::operator()() const::{lambda(HX::web::server::IO<void> const&)#1}&, HX::web::server::IO<void> const&>(ChatController::_HX_endpoint_end::{lambda()#1}::operator()() const::{lambda(HX::web::server::IO<void> const&)#1}&, HX::web::server::IO<void> const&) (/home/Heng_Xin/HXcode/HXNet/build/HXNet+0x915fe) (BuildId: 07ab9c4517de94ddf5ce3044921b0547edc90c81)
    #21 0x63c5851c57db in std::_Function_handler<HX::STL::coroutine::task::Task<bool, HX::STL::coroutine::promise::Promise<bool, true>, HX::STL::coroutine::awaiter::ExitAwaiter<bool, HX::STL::coroutine::promise::Promise<bool, true> > > (HX::web::server::IO<void> const&), ChatController::_HX_endpoint_end::{lambda()#1}::operator()() const::{lambda(HX::web::server::IO<void> const&)#1}>::_M_invoke(std::_Any_data const&, HX::web::server::IO<void> const&) (/home/Heng_Xin/HXcode/HXNet/build/HXNet+0x877db) (BuildId: 07ab9c4517de94ddf5ce3044921b0547edc90c81)
    #22 0x63c585346089 in std::function<HX::STL::coroutine::task::Task<bool, HX::STL::coroutine::promise::Promise<bool, true>, HX::STL::coroutine::awaiter::ExitAwaiter<bool, HX::STL::coroutine::promise::Promise<bool, true> > > (HX::web::server::IO<void> const&)>::operator()(HX::web::server::IO<void> const&) const /usr/include/c++/14.1.1/bits/std_function.h:591
    #23 0x63c5853407cc in start /home/Heng_Xin/HXcode/HXNet/src/HXWeb/server/ConnectionHandler.cpp:79
    #24 0x63c5852e2341 in whenAnyImpl /home/Heng_Xin/HXcode/HXNet/include/HXSTL/coroutine/task/WhenAny.hpp:132
    #25 0x63c5852e3a6a in whenAnyHelper /home/Heng_Xin/HXcode/HXNet/include/HXSTL/coroutine/task/WhenAny.hpp:114
    #26 0x63c58534b94c in _recvRequest /home/Heng_Xin/HXcode/HXNet/src/HXWeb/server/IO.cpp:68
    #27 0x63c58535e854 in recvN /home/Heng_Xin/HXcode/HXNet/src/HXWeb/socket/IO.cpp:48
    #28 0x63c58535f590 in _recvSpan /home/Heng_Xin/HXcode/HXNet/src/HXWeb/socket/IO.cpp:57
    #29 0x63c5851a6a4d in std::__n4861::coroutine_handle<void>::resume() const (/home/Heng_Xin/HXcode/HXNet/build/HXNet+0x68a4d) (BuildId: 07ab9c4517de94ddf5ce3044921b0547edc90c81)
    #30 0x63c5852a3826 in HX::STL::coroutine::loop::IoUringLoop::run(std::optional<std::chrono::duration<long, std::ratio<1l, 1000000000l> > >) /home/Heng_Xin/HXcode/HXNet/src/HXSTL/coroutine/loop/IoUringLoop.cpp:65
    #31 0x63c58529f0e5 in HX::STL::coroutine::loop::AsyncLoop::run() /home/Heng_Xin/HXcode/HXNet/src/HXSTL/coroutine/loop/AsyncLoop.cpp:11
    #32 0x63c585356fd1 in void HX::STL::coroutine::task::runTask<HX::STL::coroutine::loop::AsyncLoop, void, HX::STL::coroutine::promise::Promise<void, true>, HX::STL::coroutine::awaiter::ExitAwaiter<void, HX::STL::coroutine::promise::Promise<void, true> > >(HX::STL::coroutine::loop::AsyncLoop&, HX::STL::coroutine::task::Task<void, HX::STL::coroutine::promise::Promise<void, true>, HX::STL::coroutine::awaiter::ExitAwaiter<void, HX::STL::coroutine::promise::Promise<void, true> > > const&) /home/Heng_Xin/HXcode/HXNet/include/HXSTL/coroutine/task/Task.hpp:142
    #33 0x63c58535295f in operator() /home/Heng_Xin/HXcode/HXNet/src/HXWeb/server/Server.cpp:27
    #34 0x63c5853564c9 in __invoke_impl<void, HX::web::server::Server::startHttp(const std::string&, const std::string&, std::size_t, std::chrono::seconds)::<lambda()> > /usr/include/c++/14.1.1/bits/invoke.h:61
    #35 0x63c58535644f in __invoke<HX::web::server::Server::startHttp(const std::string&, const std::string&, std::size_t, std::chrono::seconds)::<lambda()> > /usr/include/c++/14.1.1/bits/invoke.h:96
    #36 0x63c5853563a9 in _M_invoke<0> /usr/include/c++/14.1.1/bits/std_thread.h:292
    #37 0x63c585356351 in operator() /usr/include/c++/14.1.1/bits/std_thread.h:299
    #38 0x63c585356319 in _M_run /usr/include/c++/14.1.1/bits/std_thread.h:244
    #39 0x7fcfe64e0c83 in execute_native_thread_routine /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++11/thread.cc:104
    #40 0x7fcfe6e5cc79 in asan_thread_start /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_interceptors.cpp:234
    #41 0x7fcfe62a6dec  (/usr/lib/libc.so.6+0x92dec) (BuildId: 32a656aa5562eece8c59a585f5eacd6cf5e2307b)
    #42 0x7fcfe632a0db  (/usr/lib/libc.so.6+0x1160db) (BuildId: 32a656aa5562eece8c59a585f5eacd6cf5e2307b)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++98/tree.cc:370 in std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)
Thread T1 created by T0 here:
    #0 0x7fcfe6ef38fb in pthread_create /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_interceptors.cpp:245
    #1 0x7fcfe64e0d81 in __gthread_create /usr/src/debug/gcc/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:676
    #2 0x7fcfe64e0d81 in std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++11/thread.cc:172
    #3 0x63c585355bdc in thread<HX::web::server::Server::startHttp(const std::string&, const std::string&, std::size_t, std::chrono::seconds)::<lambda()> > /usr/include/c++/14.1.1/bits/std_thread.h:164
    #4 0x63c585355a1e in construct_at<std::thread, HX::web::server::Server::startHttp(const std::string&, const std::string&, std::size_t, std::chrono::seconds)::<lambda()> > /usr/include/c++/14.1.1/bits/stl_construct.h:97
    #5 0x63c58535508a in construct<std::thread, HX::web::server::Server::startHttp(const std::string&, const std::string&, std::size_t, std::chrono::seconds)::<lambda()> > /usr/include/c++/14.1.1/bits/alloc_traits.h:536
    #6 0x63c58535508a in _M_realloc_append<HX::web::server::Server::startHttp(const std::string&, const std::string&, std::size_t, std::chrono::seconds)::<lambda()> > /usr/include/c++/14.1.1/bits/vector.tcc:634
    #7 0x63c585354aab in emplace_back<HX::web::server::Server::startHttp(const std::string&, const std::string&, std::size_t, std::chrono::seconds)::<lambda()> > /usr/include/c++/14.1.1/bits/vector.tcc:123
    #8 0x63c585352c99 in HX::web::server::Server::startHttp(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, std::chrono::duration<long, std::ratio<1l, 1l> >) /home/Heng_Xin/HXcode/HXNet/src/HXWeb/server/Server.cpp:26
    #9 0x63c5851a266b in main /home/Heng_Xin/HXcode/HXNet/examples/ChatServerByJson.cpp:138
    #10 0x7fcfe6239c87  (/usr/lib/libc.so.6+0x25c87) (BuildId: 32a656aa5562eece8c59a585f5eacd6cf5e2307b)
    #11 0x7fcfe6239d4b in __libc_start_main (/usr/lib/libc.so.6+0x25d4b) (BuildId: 32a656aa5562eece8c59a585f5eacd6cf5e2307b)
    #12 0x63c58519de24 in _start (/home/Heng_Xin/HXcode/HXNet/build/HXNet+0x5fe24) (BuildId: 07ab9c4517de94ddf5ce3044921b0547edc90c81)

==151502==ABORTING
HengXin666 commented 5 days ago

解决方案

IoUringTask::~IoUringTask() { if (_cancel) { // printf("营长! 快取消!\n"); HX::STL::coroutine::loop::AsyncLoop::getLoop().getTimerLoop().addInitiationTask( std::make_shared( cancel(this) ) ); } }

- 重中之重: 执行时机: 我们必须要在 `whenAny(定时器, io._recv())` 触发超时时候, 马上执行`~IoUringTask`的协程, 以防止某些问题
因此需要执行:
```cpp
HX::STL::coroutine::loop::AsyncLoop::getLoop().getTimerLoop().startHostingTasks();

来启动托管任务...