Closed HengXin666 closed 5 days ago
非常抱歉! 我会马上修复的!qwq...
非常糟糕! 甚至因此(如果超时)内存泄漏:
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
读取任务
而导致的内存泄漏/段错误等问题 (已经在examples
的ChatServerByJson.cpp
、WsServer.cpp
、HttpsServer.cpp
以及HttpsFileServer.cpp
分别进行5min
的压力测试和浏览器随机访问(比如等到其超时后, 再操作xxx等..), 目前没有发现任何问题!)
HttpsFileServer.cpp
在高并发情况下, 如果在浏览器刷新页面, 似乎会打断压力测试的客户端的连接? 目前还不知道是怎么回事qwq...Await
中进行控制: (默认的成员变量_cancel
是true, 即需要被取消(也就是可取消
, 因为任务并没有完成))
int await_resume() const noexcept {
_task->_cancel = false; // 设置为false 表示已经完成 io_uring 的某个任务, 不用取消
return _task->_res;
}
inline static HX::STL::coroutine::task::TimerTask cancel(IoUringTask* op) {
// 如果这个fd被关闭, 那么会自动取消(无效化)等待队列的任务
// printf("正在取消 %p\n", (void *)op);
co_await HX::STL::coroutine::loop::IoUringTask().prepCancel(op, IORING_ASYNC_CANCEL_ALL);
// printf("正在取消了 %p\n", (void *)op);
co_return;
}
IoUringTask::~IoUringTask() {
if (_cancel) {
// printf("营长! 快取消!\n");
HX::STL::coroutine::loop::AsyncLoop::getLoop().getTimerLoop().addInitiationTask(
std::make_shared
- 重中之重: 执行时机: 我们必须要在 `whenAny(定时器, io._recv())` 触发超时时候, 马上执行`~IoUringTask`的协程, 以防止某些问题
因此需要执行:
```cpp
HX::STL::coroutine::loop::AsyncLoop::getLoop().getTimerLoop().startHostingTasks();
来启动托管任务...
致命问题
之前学习io_uring的时候, 被某个
三流文章误导了, 以为 使用 io_uring 关闭文件的时候会自动删除 等待队列里面的 和这个fd 有关的任务.但是我错了qwq, 为什么现在才发现? 原来是我的超时时间调的太长了?! 怎么之前又没有遇到?! 难道和某一个bug给弄混了?
烦人qwq...