pjlt / lanthing-pc

BSD 3-Clause "New" or "Revised" License
92 stars 12 forks source link

测试nbp2p的潜在崩溃 #56

Closed numbaa closed 8 months ago

numbaa commented 12 months ago

已修复一处公网下的空指针引用。

numbaa commented 12 months ago

某用户中转环境必现崩溃,似乎是跨dll传STL对象导致的,可以尝试合并rtc.dll和nbp2p.dll解决这个问题

    00007ff900000000()  未知
>   [内联框架] nbp2p.dll!std::_Func_class<void>::operator()() 行 883 C++
    [内联框架] nbp2p.dll!nbp2p::NbP2PImpl::post_delayed_task::__l2::<lambda_5d3c7f43397c161d4b124c6b6ec817b8>::operator()() 行 359   C++
    [内联框架] nbp2p.dll!std::invoke(nbp2p::NbP2PImpl::post_delayed_task::__l2::<lambda_5d3c7f43397c161d4b124c6b6ec817b8> &) 行 1752 C++
    nbp2p.dll!std::_Func_impl_no_alloc<<lambda_5d3c7f43397c161d4b124c6b6ec817b8>,void>::_Do_call() 行 839    C++
    [内联框架] rtc.dll!std::_Func_class<void>::operator()() 行 883   C++
    rtc.dll!webrtc::webrtc_new_closure_impl::ClosureTask<std::function<void __cdecl(void)> const &>::Run() 行 33 C++
    rtc.dll!rtc::Thread::QueuedTaskHandler::OnMessage(rtc::Message * msg) 行 1046    C++
    rtc.dll!rtc::Thread::Dispatch(rtc::Message * pmsg) 行 714    C++
    rtc.dll!rtc::Thread::ProcessMessages(int cmsLoop) 行 1159    C++
    rtc.dll!rtc::Thread::PreRun(void * pv) 行 894    C++
    [外部代码]  
numbaa commented 12 months ago

偶现bug,无论是分开rtc.dll、nbp2p.dll还是合并成一个dll都出现过,花了10分钟没看出问题在哪,记下,下次专门复现和修复这个问题:

>   rtc.dll!srtp_auth_get_tag_length(const srtp_auth_t * a) 行 68    C
    rtc.dll!srtp_unprotect_mki(srtp_ctx_t_ * ctx, void * srtp_hdr, int * pkt_octet_len, unsigned int use_mki) 行 2497    C
    rtc.dll!cricket::SrtpSession::UnprotectRtp(void * p, int in_len, int * out_len) 行 163   C++
    rtc.dll!webrtc::SrtpTransport::UnprotectRtp(void * p, int in_len, int * out_len) 行 415  C++
    rtc.dll!webrtc::SrtpTransport::OnRtpPacketReceived(rtc::CopyOnWriteBuffer packet, __int64 packet_time_us) 行 211 C++
    rtc.dll!webrtc::RtpTransport::OnReadPacket(rtc::PacketTransportInternal * transport, const char * data, unsigned __int64 len, const __int64 & packet_time_us, int flags) 行 270  C++
    [内联框架] rtc.dll!sigslot::_opaque_connection::emit(rtc::PacketTransportInternal *) 行 331  C++
    rtc.dll!sigslot::signal_with_thread_policy<sigslot::single_threaded,rtc::PacketTransportInternal *,char const *,unsigned __int64,__int64 const &,int>::emit(rtc::PacketTransportInternal * <args_0>, const char * <args_1>, unsigned __int64 <args_2>, const __int64 & <args_3>, int <args_4>) 行 563    C++
    rtc.dll!cricket::DtlsTransport::OnReadPacket(rtc::PacketTransportInternal * transport, const char * data, unsigned __int64 size, const __int64 & packet_time_us, int flags) 行 636   C++
    [内联框架] rtc.dll!sigslot::_opaque_connection::emit(rtc::PacketTransportInternal *) 行 331  C++
    rtc.dll!sigslot::signal_with_thread_policy<sigslot::single_threaded,rtc::PacketTransportInternal *,char const *,unsigned __int64,__int64 const &,int>::emit(rtc::PacketTransportInternal * <args_0>, const char * <args_1>, unsigned __int64 <args_2>, const __int64 & <args_3>, int <args_4>) 行 563    C++
    [内联框架] rtc.dll!sigslot::signal_with_thread_policy<sigslot::single_threaded,rtc::PacketTransportInternal *,char const *,unsigned __int64,__int64 const &,int>::operator()(rtc::PacketTransportInternal *) 行 570  C++
    rtc.dll!ltrtc::P2PAdapter::on_read(const void * data, unsigned int size, __int64 timestamp_us) 行 307    C++
    rtc.dll!nbp2p::NbP2PImpl::on_read(const std::shared_ptr<nbp2p::Endpoint> & endpoint, const void * data, unsigned int len, __int64 timestamp_us) 行 311   C++
    [内联框架] rtc.dll!std::_Func_class<void,std::shared_ptr<nbp2p::Endpoint> const &,void const *,unsigned int,__int64>::operator()(const std::shared_ptr<nbp2p::Endpoint> & <_Args_1>, const void * <_Args_2>, unsigned int <_Args_3>, __int64) 行 883 C++
    rtc.dll!nbp2p::Endpoint::on_read(std::weak_ptr<nbp2p::Endpoint> weak_this, const void * data, unsigned int size, const nbp2p::Address & local_addr, const nbp2p::Address & remote_addr, const __int64 & packet_time_us) 行 259   C++
    rtc.dll!nbp2p::RelayClientEndpoint::on_read(const std::weak_ptr<nbp2p::Endpoint> & weak_this, const void * data, unsigned int size, const nbp2p::Address & local_addr, const nbp2p::Address & remote_addr, const __int64 & packet_time_us) 行 469    C++
    [外部代码]  
    [内联框架] rtc.dll!std::_Func_class<void,void const *,unsigned int,nbp2p::Address const &,nbp2p::Address const &,__int64 const &>::operator()(const void * <_Args_0>, unsigned int <_Args_1>, const nbp2p::Address &) 行 883 C++
    rtc.dll!ltrtc::UDPSocketImpl::on_read_packet(rtc::AsyncPacketSocket * sock, const char * data, unsigned __int64 len, const rtc::SocketAddress & local_addr, const rtc::SocketAddress & remote_addr, const __int64 & timestamp) 行 114    C++
    [内联框架] rtc.dll!sigslot::_opaque_connection::emit(rtc::AsyncPacketSocket *) 行 331    C++
    rtc.dll!sigslot::signal_with_thread_policy<sigslot::single_threaded,rtc::AsyncPacketSocket *,char const *,unsigned __int64,rtc::SocketAddress const &,rtc::SocketAddress const &,__int64 const &>::emit(rtc::AsyncPacketSocket * <args_0>, const char * <args_1>, unsigned __int64 <args_2>, const rtc::SocketAddress & <args_3>, const rtc::SocketAddress & <args_4>, const __int64 & <args_5>) 行 563  C++
    [内联框架] rtc.dll!sigslot::signal_with_thread_policy<sigslot::single_threaded,rtc::AsyncPacketSocket *,char const *,unsigned __int64,rtc::SocketAddress const &,rtc::SocketAddress const &,__int64 const &>::operator()(rtc::AsyncPacketSocket *) 行 570    C++
    rtc.dll!rtc::AsyncUDPSocket::RecvMsg(rtc::Socket * socket) 行 176    C++
    [内联框架] rtc.dll!sigslot::_opaque_connection::emit(rtc::Socket *) 行 331   C++
    rtc.dll!sigslot::signal_with_thread_policy<sigslot::multi_threaded_local,rtc::Socket *>::emit(rtc::Socket * <args_0>) 行 563 C++
    [内联框架] rtc.dll!sigslot::signal_with_thread_policy<sigslot::multi_threaded_local,rtc::Socket *>::operator()(rtc::Socket *) 行 570 C++
    rtc.dll!rtc::SocketDispatcher::OnEvent(unsigned int ff, int err) 行 1079 C++
    rtc.dll!rtc::PhysicalSocketServer::Wait(int cmsWait, bool process_io) 行 1955    C++
    rtc.dll!rtc::Thread::Get(rtc::Message * pmsg, int cmsWait, bool process_io) 行 549   C++
    rtc.dll!rtc::Thread::ProcessMessages(int cmsLoop) 行 1155    C++
    rtc.dll!rtc::Thread::PreRun(void * pv) 行 894    C++
    [外部代码]  
numbaa commented 12 months ago

https://github.com/pjlt/lanthing-pc/issues/56#issuecomment-1775035333

上面提到的问题,合并nbp2p.dll和rtc.dll后还会出现,看代码看不出任何问题,本地也无法复现。

numbaa commented 10 months ago

有用户环境频繁出现下列崩溃,而且是在析构时出现。可能析构逻辑没做好。

            00007fff00000000()
            [内联框架] rtc.dll!std::_Func_class<void>::operator()() 行 883
            [内联框架] rtc.dll!nbp2p::Endpoint::post_delayed_task::__l2::<lambda_f3b9dc8094998a1b4b043a6cd430718d>::operator()() 行 142
            [内联框架] rtc.dll!std::invoke(nbp2p::Endpoint::post_delayed_task::__l2::<lambda_f3b9dc8094998a1b4b043a6cd430718d> &) 行 1752
            rtc.dll!std::_Func_impl_no_alloc<<lambda_f3b9dc8094998a1b4b043a6cd430718d>,void>::_Do_call() 行 839
            [内联框架] rtc.dll!std::_Func_class<void>::operator()() 行 883
            rtc.dll!webrtc::webrtc_new_closure_impl::ClosureTask<std::function<void __cdecl(void)> const &>::Run() 行 33
            rtc.dll!rtc::Thread::QueuedTaskHandler::OnMessage(rtc::Message * msg) 行 1046
            rtc.dll!rtc::Thread::Dispatch(rtc::Message * pmsg) 行 714
            rtc.dll!rtc::Thread::ProcessMessages(int cmsLoop) 行 1159
            rtc.dll!rtc::Thread::PreRun(void * pv) 行 894
            [可能缺少框架,没有为 kernel32.dll 加载二进制文件]
            [外部代码]
numbaa commented 10 months ago

准备给ioloop的post和post delay增加source_location参数,帮助排错

numbaa commented 10 months ago

不是崩溃,但是有人反馈局域网下出现KeepAliveTimeout,但是这个错误只会在TpConnected上之后出现。 于是问题就变为:“局域网下,Client侧已经Connected,仍然出现KeepAliveTimeout” 推测是P2P一侧Connected,另一侧没有(可能吗?),或者其它P2P bug。

没拿到日志,无法确认。

numbaa commented 9 months ago

已添加逻辑:IOLoop析构时,向任务线程删除所有自己Post的任务。 继续观察会不会出现上面的崩溃。

numbaa commented 9 months ago

又发现一处崩溃:Session析构后,成员变量std::shared_ptr\<MappingEndpoint>在别处有强引用,它回调到Session,崩溃了。

numbaa commented 8 months ago

应该没有崩溃了,先关闭。