chatterino2 icon indicating copy to clipboard operation
chatterino2 copied to clipboard

Channel Point crash

Open pajlada opened this issue 2 years ago • 2 comments

I had a crash happen earlier when a channel point reward was added through pubsub.

https://github.com/Chatterino/chatterino2/blob/46f43f3ce82fbf6be1f4035d75d5ee8d6685f08d/src/providers/twitch/TwitchChannel.cpp#L254 fires and is consumed here https://github.com/Chatterino/chatterino2/blob/46f43f3ce82fbf6be1f4035d75d5ee8d6685f08d/src/providers/twitch/IrcMessageHandler.cpp#L383 but the connection is never disconnected, nor does it contain any sort of shared pointer logic, so the function can go out of scope causing a segmentation fault

backtrace:

(gdb) bt
#0  0x00007f827d8a14dc in  () at /usr/lib/libc.so.6
#1  0x00007f827d851998 in raise () at /usr/lib/libc.so.6
#2  0x00007f827d83b53d in abort () at /usr/lib/libc.so.6
#3  0x00007f827da99833 in __gnu_cxx::__verbose_terminate_handler() () at /usr/src/debug/gcc/libstdc++-v3/libsupc++/vterminate.cc:95
#4  0x00007f827daa5cfc in __cxxabiv1::__terminate(void (*)()) (handler=<optimized out>) at /usr/src/debug/gcc/libstdc++-v3/libsupc++/eh_terminate.cc:48
#5  0x00007f827daa4cba in __cxa_call_terminate(_Unwind_Exception*) (ue_header=0x55aa14094c10) at /usr/src/debug/gcc/libstdc++-v3/libsupc++/eh_call.cc:54
#6  0x00007f827daa543a in __cxxabiv1::__gxx_personality_v0(int, _Unwind_Action, _Unwind_Exception_Class, _Unwind_Exception*, _Unwind_Context*)
    (version=<optimized out>, actions=6, exception_class=5138137972254386944, ue_header=<optimized out>, context=0x7ffd1adb9d10)
    at /usr/src/debug/gcc/libstdc++-v3/libsupc++/eh_personality.cc:688
#7  0x00007f827f286774 in _Unwind_RaiseException_Phase2 (exc=0x55aa14094c10, context=0x7ffd1adb9d10, frames_p=0x7ffd1adb9c18) at /usr/src/debug/gcc/libgcc/unwind.inc:64
#8  0x00007f827f2871ed in _Unwind_Resume (exc=0x55aa14094c10) at /usr/src/debug/gcc/libgcc/unwind.inc:242
#9  0x000055a9fb2d581e in chatterino::TwitchChannel::addChannelPointReward(chatterino::ChannelPointReward const&) (this=0x55a9ffc25610, reward=...)
    at /home/pajlada/git/chatterino2/src/providers/twitch/TwitchChannel.cpp:254
#10 0x000055a9faf9c889 in operator()() const (__closure=0x7f8210065bc8) at /home/pajlada/git/chatterino2/src/Application.cpp:498
#11 0x000055a9faf9ed12 in Event::~Event() (this=0x7f8210065bb0, __in_chrg=<optimized out>) at /home/pajlada/git/chatterino2/src/util/PostToThread.hpp:53
#12 0x000055a9faf9ed4a in Event::~Event() (this=0x7f8210065bb0, __in_chrg=<optimized out>) at /home/pajlada/git/chatterino2/src/util/PostToThread.hpp:54
#13 0x00007f827e88e48d in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () at /usr/lib/libQt5Core.so.5
#14 0x00007f827e8d4478 in  () at /usr/lib/libQt5Core.so.5
#15 0x00007f827e289c6b in g_main_context_dispatch () at /usr/lib/libglib-2.0.so.0
#16 0x00007f827e2e0001 in  () at /usr/lib/libglib-2.0.so.0
#17 0x00007f827e287392 in g_main_context_iteration () at /usr/lib/libglib-2.0.so.0
#18 0x00007f827e8d825c in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/libQt5Core.so.5
#19 0x00007f827e88611c in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/libQt5Core.so.5
#20 0x00007f827e890c49 in QCoreApplication::exec() () at /usr/lib/libQt5Core.so.5
#21 0x000055a9faf9a252 in chatterino::Application::run(QApplication&) (this=0x7ffd1adba3a0, qtApp=...) at /home/pajlada/git/chatterino2/src/Application.cpp:182
#22 0x000055a9fafe62d9 in chatterino::runGui(QApplication&, chatterino::Paths&, chatterino::Settings&) (a=..., paths=..., settings=...)
    at /home/pajlada/git/chatterino2/src/RunGui.cpp:245
#23 0x000055a9faf852b1 in main(int, char**) (argc=1, argv=0x7ffd1adbfdd8) at /home/pajlada/git/chatterino2/src/main.cpp:88

Chatterino commit: 46f43f3ce82fbf6be1f4035d75d5ee8d6685f08d

pajlada avatar Sep 01 '22 10:09 pajlada

cc: #2432

Felanbird avatar Sep 02 '22 00:09 Felanbird

Mutex may help:

 

prodigy: does signal have a onConnected callback? e.g., if reward is registered after isChannelPointRewardKnown but before channelPointRewardAdded is connected https://github.com/Chatterino/chatterino2/blob/46f43f3ce82fbf6be1f4035d75d5ee8d6685f08d/src/providers/twitch/IrcMessageHandler.cpp#L383 pajlada: There's no onConnected callback pajlada: The way to solve this would need to be with a mutex pajlada: so on line 378 lock a mutex, then only unlock once the connection to the signal has been made pajlada: and before the signal is invoked, lock the signal to ensure there are no in-flight checks

iProdigy avatar Sep 15 '22 17:09 iProdigy

output

chatterino.twitch: TwitchChannel reward added ADD callback since reward is not known: "429810ea-c898-4517-a5aa-e5fd0c8352c2"
chatterino.twitch: [TwitchChannel "jankos" ] Channel point reward added: "429810ea-c898-4517-a5aa-e5fd0c8352c2" , "Profile background change LoL" , true
chatterino.twitch: TwitchChannel reward added callback: "429810ea-c898-4517-a5aa-e5fd0c8352c2" - ""
chatterino.twitch: TwitchChannel reward added callback: "" - ""
chatterino.twitch: TwitchChannel reward added ADD callback since reward is not known: ""
Exception thrown: read access violation.
**std::_Func_class<bool,chatterino::ChannelPointReward>::_Getimpl**(...) returned 0xFFFFFFFFFFFFFFFF.

crash call stack

chatterino.exe!std::_Func_class<bool,chatterino::ChannelPointReward>::_Reset_copy(const std::_Func_class<bool,chatterino::ChannelPointReward> & _Right) Line 888
chatterino.exe!std::function<bool __cdecl(chatterino::ChannelPointReward)>::function<bool __cdecl(chatterino::ChannelPointReward)>(const std::function<bool __cdecl(chatterino::ChannelPointReward)> & _Right) Line 1033
chatterino.exe!std::remove_if<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::function<bool __cdecl(chatterino::ChannelPointReward)>>>>,bool <lambda>(std::function<bool __cdecl(chatterino::ChannelPointReward)>)>(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::function<bool __cdecl(chatterino::ChannelPointReward)>>>> _First, const std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::function<bool __cdecl(chatterino::ChannelPointReward)>>>> _Last, pajlada::Signals::SelfDisconnectingSignal<chatterino::ChannelPointReward>::invoke::__l2::bool <lambda>(std::function<bool __cdecl(chatterino::ChannelPointReward)>) _Pred) Line 1985
chatterino.exe!pajlada::Signals::SelfDisconnectingSignal<chatterino::ChannelPointReward>::invoke(chatterino::ChannelPointReward <args_0>) Line 155
chatterino.exe!chatterino::TwitchChannel::addChannelPointReward(const chatterino::ChannelPointReward & reward) Line 276
chatterino.exe!chatterino::Application::initPubSub::__l2::<lambda_4cb85ea0fa1139855df2c0c619be71af>::()::__l2::<lambda>() Line 539
chatterino.exe!`chatterino::postToThread<void <lambda>(void)>'::`2'::Event::~Event() Line 68
chatterino.exe!`chatterino::postToThread<void <lambda>(void)>'::`2'::Event::`scalar deleting destructor'(unsigned int)

so it crashed in SelfDisconnectingSignal::invoke while std::remove_if was iterating callbacks vector, possibly one was already freed?

https://github.com/pajlada/signals/blob/25e4ec3b8d6ea94a5e65a26e7cfcbbce3b87c5d6/include/pajlada/signals/signal.hpp#L156

another comment points out use-after-free heap in same location https://pastebin.com/raw/wbcGYDfd, where mem was freed by std::vector deallocator

another thing is chatterino output logs above, where reward.ID and rewardId happens to be empty just before crash, at one occasion this evaled to true https://github.com/Chatterino/chatterino2/blob/2f4272cc2a2d99cc127eb86e38e869cfaf431796/src/providers/twitch/IrcMessageHandler.cpp#L465 with both IDs being empty, what could go wrong :D

might be relevant: crashed while PC was idle for few h, so no user input. Also that redemption ID could be freshly added, because i checked afterwards on twitch and it had "new" label in UI, but not sure.

kornes avatar Nov 19 '22 00:11 kornes

I captured another crash:

[omitted]
ntdll!RtlRaiseException + 0x185   
KERNELBASE!RaiseException + 0x69   
VCRUNTIME140!_CxxThrowException + 0x90   
MSVCP140!std::_Xbad_function_call + 0x1f   
chatterino!std::_Func_class<bool,chatterino::ChannelPointReward>::operator() + 0xe2   
chatterino!pajlada::Signals::SelfDisconnectingSignal<chatterino::ChannelPointReward>::invoke::__l2::<lambda_1>::operator() + 0x1c6   
chatterino!std::remove_if<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::function<bool __cdecl(chatterino::ChannelPointReward)> > > >,`pajlada::Signals::SelfDisconnectingSignal<chatterino::ChannelPointReward>::invoke'::`2'::<lambda_1> > + 0x224   
chatterino!pajlada::Signals::SelfDisconnectingSignal<chatterino::ChannelPointReward>::invoke + 0x1e   
chatterino!chatterino::TwitchChannel::addChannelPointReward + 0x2fb   
chatterino!chatterino::Application::initPubSub::__l2::<lambda_11>::()::__l2::<lambda_1>::operator() + 0x32   
chatterino!chatterino::postToThread::__l2::Event::{dtor} + 0x3c   
chatterino!`chatterino::postToThread<``chatterino::Application::initPubSub'::`2'::<lambda_11>::operator()<QJsonObject const >'::`2'::<lambda_1> >'::`2'::Event::`scalar deleting destructor' + 0x55   
[omitted]

I don't have the exact state of the repository, but checking out the current master branch (6defee0) is enough. chatterino-crash.zip (contains the crash and debug symbols).

Notably, the crash happens when invoking the signal. A std::bad_function_call is thrown for the callback function. I'd naively try to add a try-catch when invoking the signal:

https://github.com/Chatterino/chatterino2/blob/6defee06150fa9f38acb41be53f84df903a9e32f/src/providers/twitch/TwitchChannel.cpp#L307

This doesn't fix the actual problem, but could avoid a crash.

Nerixyz avatar Feb 07 '23 18:02 Nerixyz

Very interested in someone confirming a crash from this after 829c48d79aff6efd6f6a1d73c2a4609e8c331c30

pajlada avatar Feb 09 '23 08:02 pajlada

I encountered another crash.

[...]
[0x7]   ntdll!RtlDispatchException + 0x244   
[0x8]   ntdll!KiUserExceptionDispatch + 0x2e   
[0x9]   chatterino!std::_Func_class<bool,chatterino::ChannelPointReward>::_Tidy + 0x19   
[0xa]   chatterino!std::function<bool __cdecl(chatterino::ChannelPointReward)>::operator= + 0x22   
[0xb]   chatterino!std::_Move_unchecked + 0x2d   
[0xc]   chatterino!std::vector<std::function<bool __cdecl(chatterino::ChannelPointReward)>,std::allocator<std::function<bool __cdecl(chatterino::ChannelPointReward)> > >::erase + 0x3d   
[0xd]   chatterino!pajlada::Signals::SelfDisconnectingSignal<chatterino::ChannelPointReward>::invoke + 0x75   
[0xe]   chatterino!chatterino::TwitchChannel::addChannelPointReward + 0x312   
[0xf]   chatterino!chatterino::Application::initPubSub::__l2::<lambda_11>::()::__l2::<lambda_1>::operator() + 0x32
[...]

It's at the same location, but here, no (C++) exception is thrown, but an access violation is encountered (much like in the original report). The exception record looks like this:

ExceptionRecord {
    ExceptionCode: 0xc0000005 (EXCEPTION_ACCESS_VIOLATION)
    ExceptionFlags: 0x0 (continueable)
    ExceptionRecord: 0x0 (nullptr)
    ExceptionAddress: 0x00007ff746d77625 (more on that later)
    Parameters: {
        0x0 (violation was read access),
        0x000001c997904038 (memory address)
    }
}
ContextRecord {
    Rbx: 0x000001c997903fc0
    Rdi: 0x40
}

To save you the work of checking the functions, I'll put links to them here:

This stack-trace doesn't include the code that triggered the access violation (0x00007ff746d77625) - essentially between [9] and [8].

Disassembly:

00007ff746d77621 4c896338     mov     qword ptr [_Dest->_Mystorage{._Ptrs[7]} (rbx+38h)], r12
00007ff746d77625 488b4c1f38   mov     rcx, qword ptr _Dest->_Mystorage{._Ptrs[7]} (rbx+38h)[rdi] # <- access violation
00007ff746d7762a 4885c9       test    rcx, rcx

This line seems to correspond to this location.

Nerixyz avatar Feb 11 '23 20:02 Nerixyz

Very interested in someone confirming a crash from this after 829c48d

Regarding the underlying bug, I had previously analyzed what was happening and found that std::bad_function_call was being thrown because this code is reached even when the event is custom-reward-updated, not reward-redeemed. custom-reward-updated does not have a listener and will throw. I don't remember if that accounted for all std::bad_function_call occurrences here or only some.

thekalio avatar Apr 07 '23 19:04 thekalio

Regarding the underlying bug, I had previously analyzed what was happening and found that std::bad_function_call was being thrown because this code is reached even when the event is custom-reward-updated, not reward-redeemed. custom-reward-updated does not have a listener and will throw.

I don't follow; only reward-redemeed has logic attached (not custom-reward-updated/custom-reward-created/custom-reward-deleted): https://github.com/Chatterino/chatterino2/blob/5c08e996c6a8ed01edae9ac4a882eb935fc570c4/src/providers/twitch/PubSubManager.cpp#L1136-L1151

iProdigy avatar Apr 07 '23 22:04 iProdigy

I just found some notes I took, let me recall... Sorry, I investigated this a couple years ago and forgot some of the details. The code seems basically the same as it was back then, though. I stopped my investigation before finding the root cause because it was getting pretty messy.

I don't want to confuse things with outdated or fuzzy data, but just wanted to drop it here in case it helps. The code snippet links below reference the commit used at the time.

This was the output and gdb backtrace of the crash at the time:

Invalid point event type: custom-reward-updated
terminate called after throwing an instance of 'std::bad_function_call'
  what():  bad_function_call

Thread 1 "chatterino" received signal SIGABRT, Aborted.
0x00007ffff5c8b615 in raise () from /usr/lib/libc.so.6
(gdb) bt
#0  0x00007ffff5c8b615 in raise () at /usr/lib/libc.so.6
#1  0x00007ffff5c74862 in abort () at /usr/lib/libc.so.6
#2  0x00007ffff600d81d in __gnu_cxx::__verbose_terminate_handler() () at /build/gcc/src/gcc/libstdc++-v3/libsupc++/vterminate.cc:95
#3  0x00007ffff601a4da in __cxxabiv1::__terminate(void (*)()) (handler=<optimized out>) at /build/gcc/src/gcc/libstdc++-v3/libsupc++/eh_terminate.cc:47
#4  0x00007ffff60194aa in __cxa_call_terminate(_Unwind_Exception*) (ue_header=ue_header@entry=0x55558b70fd50) at /build/gcc/src/gcc/libstdc++-v3/libsupc++/eh_call.cc:54
#5  0x00007ffff6019e75 in __cxxabiv1::__gxx_personality_v0(int, _Unwind_Action, _Unwind_Exception_Class, _Unwind_Exception*, _Unwind_Context*)
    (version=<optimized out>, actions=6, exception_class=5138137972254386944, ue_header=0x55558b70fd50, context=<optimized out>) at /build/gcc/src/gcc/libstdc++-v3/libsupc++/eh_personality.cc:677
#6  0x00007ffff5e27723 in _Unwind_RaiseException_Phase2 (exc=0x55558b70fd50, context=0x7fffffff7d60, frames_p=0x7fffffff7c68) at /build/gcc/src/gcc/libgcc/unwind.inc:64
#7  0x00007ffff5e2801e in _Unwind_Resume (exc=0x55558b70fd50) at /build/gcc/src/gcc/libgcc/unwind.inc:241
#8  0x0000555555917a82 in chatterino::TwitchChannel::addChannelPointReward(chatterino::ChannelPointReward const&) (this=0x5555575bfff0, reward=...) at ../src/providers/twitch/TwitchChannel.cpp:272
#9  0x00005555556888d0 in chatterino::Application::<lambda(auto:31&)>::<lambda()>::operator()(void) const (this=0x7fffb803dd78) at ../src/Application.cpp:336
#10 0x000055555568a23a in chatterino::Event::~Event() (this=0x7fffb803dd60, __in_chrg=<optimized out>) at ../src/util/PostToThread.hpp:53
#11 0x000055555568a272 in chatterino::Event::~Event() (this=0x7fffb803dd60, __in_chrg=<optimized out>) at ../src/util/PostToThread.hpp:54
#12 0x00007ffff64c80a0 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () at /usr/lib/libQt5Core.so.5
#13 0x00007ffff651e674 in  () at /usr/lib/libQt5Core.so.5
#14 0x00007ffff7c3d39e in g_main_context_dispatch () at /usr/lib/libglib-2.0.so.0
#15 0x00007ffff7c3f1b1 in  () at /usr/lib/libglib-2.0.so.0
#16 0x00007ffff7c3f1f1 in g_main_context_iteration () at /usr/lib/libglib-2.0.so.0
#17 0x00007ffff651dcc0 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/libQt5Core.so.5
#18 0x00007ffff64c439c in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/libQt5Core.so.5
#19 0x00007ffff64cc3a6 in QCoreApplication::exec() () at /usr/lib/libQt5Core.so.5
#20 0x0000555555687214 in chatterino::Application::run(QApplication&) (this=0x7fffffff8360, qtApp=...) at ../src/Application.cpp:156
#21 0x0000555555957a5f in chatterino::runGui(QApplication&, chatterino::Paths&, chatterino::Settings&) (a=..., paths=..., settings=...) at ../src/RunGui.cpp:217
#22 0x0000555555778137 in main(int, char**) (argc=1, argv=0x7fffffffd318) at ../src/main.cpp:82

Which indeed shows the "Invalid point event type" error message, originating from the block you show. I recall reproducing this multiple times, and the crashes coincided with the "Invalid point event type" message.

It was throwing on this line: https://github.com/Chatterino/chatterino2/blob/7d2b640874d1975492bb6c814acd2bba944e72be/src/providers/twitch/TwitchChannel.cpp#L272

The contents of reward at the time of the crash was:

reward = (const chatterino::ChannelPointReward &) @0x7fffb803dd88:
    {
        id = "41bbaf00-0fcc-400f-86e0-ec55c8c01cbc" {static null = {<No data fields>}, d = 0x7fffb80033a0},
        channelId = "21841789" {static null = {<No data fields>}, d = 0x7fffb803c980},
        title = "Lights" {static null = {<No data fields>}, d = 0x7fffb8046640},
        cost = 25000,
        image = {imageX1_ = std::shared_ptr<chatterino::Image> (use count 28, weak count 2) = {get() = 0x7fffb8036a40}, imageX2_ = std::shared_ptr<chatterino::Image> (use count 20, weak count 2) = { get() = 0x7fffb803f970}, imageX3_ = std::shared_ptr<chatterino::Image> (use count 20, weak count 2) = {get() = 0x7fffb8006f10}},
        hasParsedSuccessfully = true,
        isUserInputRequired = true,
        user = {
            id = "" {static null = {<No data fields>}, d = 0x7ffff65ad840 <QArrayData::shared_null>},
            login = "" {static null = {<No data fields>}, d = 0x7ffff65ad840 <QArrayData::shared_null>},
            displayName = "" {static null = {<No data fields>}, d = 0x7ffff65ad840 <QArrayData::shared_null>}
        }
    }                                                                                                                                                                                          

This was a reward that already existed on the channel at the time, although I suppose the data structure doesn't prove that this was a custom-reward-updated event. I recall adding a debug print here upon catching std::bad_function_call, and reward always described an existing reward on channels that were offline and not receiving user redemptions. Point redemptions seemed to work fine in general, showed in the chat, etc.

I never figured out how this->signals_.pointReward.redeemed.invoke(redemption); could ever be called on custom-reward-updated, because per the block you show, it should never happen.

I noticed that channel->channelPointRewardAdded would only have a callback handler attached if an associated IRC message was received: https://github.com/Chatterino/chatterino2/blob/7d2b640874d1975492bb6c814acd2bba944e72be/src/providers/twitch/IrcMessageHandler.cpp#L224-L240

So, I figured that no associated IRC message was received for whichever event was invoking the callback. Or some double-firing, race condition, etc. that caused the callback handler to disconnect itself too early or never be connected in the first place. It would've required deeper debug prints of the IRC messages and all pubsub events to debug further.

thekalio avatar Apr 08 '23 00:04 thekalio

Here's a crash log after 36 (35.93) days uptime

Crash reason:  EXCEPTION_ACCESS_VIOLATION_READ
Crash address: 0xffffffffffffffff
Process uptime: 3104353 seconds

Thread 0  (crashed)
 0  Qt5Core.dll + 0x266a0
     rax = 0x8800156c80532f39    rdx = 0x00000000ffffffff
     rcx = 0x00000171e39213f8    rbx = 0x8800156c80532f39
     rsi = 0x00000000ffffffff    rdi = 0x00000171e39213f8
     rbp = 0x0000000000000001    rsp = 0x0000000187343870
      r8 = 0x0000000000000000     r9 = 0x0000000000000040
     r10 = 0x0000000000000240    r11 = 0x0000400000000000
     r12 = 0x0000000000000000    r13 = 0x000001719c2c8200
     r14 = 0x00007ffb6bf785c0    r15 = 0x00007ffb6c1cc0c0
     rip = 0x00007ffb6bca66a0
    Found by: given as instruction pointer in context
 1  Qt5Core.dll + 0x250a9
     rsp = 0x0000000187343890    rip = 0x00007ffb6bca50aa
    Found by: stack scanning
 2  Qt5Core.dll + 0x2650a
     rsp = 0x00000001873438c0    rip = 0x00007ffb6bca650b
    Found by: stack scanning
 3  Qt5Core.dll + 0x1d2ce9
     rsp = 0x00000001873438f0    rip = 0x00007ffb6be52cea
    Found by: stack scanning
 4  Qt5Core.dll + 0x2dc0d2
     rsp = 0x0000000187343940    rip = 0x00007ffb6bf5c0d3
    Found by: stack scanning
 5  ntdll.dll + 0x25ba0
     rsp = 0x0000000187343950    rip = 0x00007ffba87f5ba1
    Found by: stack scanning
 6  Qt5Core.dll + 0x1f654f
     rsp = 0x0000000187343970    rip = 0x00007ffb6be76550
    Found by: stack scanning
 7  chatterino.exe!`chatterino::IrcMessageHandler::addMessage'::`20'::<lambda_1>::operator()(chatterino::ChannelPointReward) const [IrcMessageHandler.cpp : 483 + 0x9]
     rsp = 0x00000001873439a0    rip = 0x00007ff7a2943f75
    Found by: stack scanning
 8  chatterino.exe!std::_Func_impl_no_alloc<`chatterino::IrcMessageHandler::addMessage'::`20'::<lambda_1>,bool,chatterino::ChannelPointReward>::_Do_call(chatterino::ChannelPointReward&&) [functional : 833 + 0x94]
     rbx = 0x0000000187343ad0    rsi = 0x0000000187343df8
     rdi = 0x00000171dfb4a010    rsp = 0x0000000187343a10
     rip = 0x00007ff7a29442ac
    Found by: call frame info
 9  chatterino.exe!std::find_if<std::function<bool __cdecl(chatterino::ChannelPointReward)> *,`pajlada::Signals::SelfDisconnectingSignal<chatterino::ChannelPointReward>::invoke'::`2'::<lambda_1> >(std::function<bool __cdecl(chatterino::ChannelPointReward)>*, std::function<bool __cdecl(chatterino::ChannelPointReward)>* const, pajlada::Signals::SelfDisconnectingSignal<chatterino::ChannelPointReward>::invoke::__l2::<lambda_1>) [xutility : 5610 + 0x107]
     rbx = 0x0000000187343d98    rdi = 0x000001720342ed60
     rsp = 0x0000000187343ab0    rip = 0x00007ff7a297e596
    Found by: call frame info
10  chatterino.exe!std::remove_if<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::function<bool __cdecl(chatterino::ChannelPointReward)> > > >,`pajlada::Signals::SelfDisconnectingSignal<chatterino::ChannelPointReward>::invoke'::`2'::<lambda_1> >(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::function<bool __cdecl(chatterino::ChannelPointReward)> > > >, const std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::function<bool __cdecl(chatterino::ChannelPointReward)> > > >, pajlada::Signals::SelfDisconnectingSignal<chatterino::ChannelPointReward>::invoke::__l2::<lambda_1>) [xmemory : 2070 + 0xd]
     rbx = 0x0000000187343d98    rsi = 0x00000171ea3320a0
     rdi = 0x000001720342efa0    rbp = 0x0000000187343c69
     rsp = 0x0000000187343bc0    r12 = 0x0000000187343d20
     r13 = 0x00000171ea24c910    r14 = 0x0000000187343d98
     r15 = 0x00000171ea24c5f8    rip = 0x00007ff7a297e936
    Found by: call frame info
11  chatterino.exe!pajlada::Signals::SelfDisconnectingSignal<chatterino::ChannelPointReward>::invoke(chatterino::ChannelPointReward) [signal.hpp : 155 + 0x16]
     rbx = 0x00000171ea332001    rsi = 0x00000171ea3320a0
     rdi = 0x000001720342efa0    rbp = 0x0000000187343f30
     rsp = 0x0000000187343cd0    r12 = 0x00000171ea24c900
     r13 = 0x00000171ea24c910    r14 = 0x0000000187343d98
     r15 = 0x00000171ea24c5f8    rip = 0x00007ff7a2985098
    Found by: call frame info
12  chatterino.exe!chatterino::TwitchChannel::addChannelPointReward(chatterino::ChannelPointReward const&) [TwitchChannel.cpp : 312 + 0x1b]
     rbx = 0x00000171ea332001    rsi = 0x00000171ea3320a0
     rdi = 0x00000171f10af6e0    rbp = 0x0000000187343f30
     rsp = 0x0000000187343d20    r12 = 0x00000171ea24c900
     r13 = 0x00000171ea24c910    r14 = 0x0000017204937908
     r15 = 0x00000171ea24be10    rip = 0x00007ff7a2983aa2
    Found by: call frame info
13  chatterino.exe!`chatterino::postToThread<``chatterino::Application::initPubSub'::`2'::<lambda_11>::operator()<QJsonObject const >'::`2'::<lambda_1> >'::`2'::Event::`scalar deleting destructor'(unsigned int) + 0x4f
     rbx = 0x00000172049378e0    rsi = 0x0000000000000001
     rdi = 0x00000171e3919610    rbp = 0x0000000187343f30
     rsp = 0x0000000187343e70    r12 = 0x00000171e3919634
     r13 = 0x0000000000000000    r14 = 0x00000001873473c0
     r15 = 0x0000000000000000    rip = 0x00007ff7a27add10
    Found by: call frame info
14  Qt5Core.dll + 0x1d4857
     rbx = 0x00000172049378e0    rsi = 0x0000000000000000
     rdi = 0x00000171e3919610    rbp = 0x0000000187343f30
     rsp = 0x0000000187343eb0    r12 = 0x00000171e3919634
     r13 = 0x0000000000000000    r14 = 0x00000001873473c0
     r15 = 0x0000000000000000    rip = 0x00007ffb6be54858
    Found by: call frame info
15  USER32.dll + 0xa500
     rbp = 0x0000000187343f30    rsp = 0x0000000187343f30
     rip = 0x00007ffba75da501
    Found by: stack scanning
16  qwindows.dll + 0x62dfe
     rsp = 0x0000000187343f70    rip = 0x00007ffb7b632dff
    Found by: stack scanning
17  Qt5Core.dll + 0x21ba59
     rsp = 0x0000000187343fa0    rip = 0x00007ffb6be9ba5a
    Found by: stack scanning
18  combase.dll + 0x30374f
     rsp = 0x0000000187344018    rip = 0x00007ffba7b33750
    Found by: stack scanning
19  ntdll.dll + 0x1d699
     rsp = 0x0000000187344020    rip = 0x00007ffba87ed69a
    Found by: stack scanning

Felanbird avatar Jun 19 '23 02:06 Felanbird