chatterino2
chatterino2 copied to clipboard
Channel Point crash
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
cc: #2432
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
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.
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.
Very interested in someone confirming a crash from this after 829c48d79aff6efd6f6a1d73c2a4609e8c331c30
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:
-
[0x9] std::_Func_class::_Tidy
-
[0xa] std::function::operator=
-
[0xb] std::_Move_unchecked
-
[0xc] std::vector::erase
-
[0xd] pajlada::Signals::SelfDisconnectingSignal::invoke
-
[0xe] chatterino::TwitchChannel::addChannelPointReward
-
[0xf] chatterino::Application::initPubSub lambda
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.
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.
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
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.
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