def parse_thread_stacktrace(lines, thread_id, is_crashed_thread)
      # remove the 1st line
      lines.pop

      stacktrace = []
      process_matching_lines(lines, BACKTRACE_LINE_REGEX) do |match|
        stacktrace << parse_crashed_thread_stacktrace_line(match, is_crashed_thread)
      end

      # sentry wants their stacktrace with the oldest frame first
      stacktrace = stacktrace.reverse

      if is_crashed_thread
        @crashed_thread_stacktrace = stacktrace
        @extra[:crashed_thread_id] = thread_id
      else
        @other_threads_stacktraces[thread_id] = stacktrace
      end
    end
def parse_thread_stacktrace(lines, thread_id, is_crashed_thread)
      # remove the 1st line
      lines.pop

      stacktrace = []
      process_matching_lines(lines, BACKTRACE_LINE_REGEX) do |match|
        stacktrace << parse_crashed_thread_stacktrace_line(match, is_crashed_thread)
      end

      # sentry wants their stacktrace with the oldest frame first
      stacktrace = stacktrace.reverse

      if is_crashed_thread
        @crashed_thread_stacktrace = stacktrace
        @extra[:crashed_thread_id] = thread_id
      else
        @other_threads_stacktraces[thread_id] = stacktrace
      end
    end
rubocop:disable Metrics/LineLength
 rubocop:disable Metrics/LineLength
 Parses something of the form
 Thread 0 (crashed)
  0  ETClient.exe!QString::~QString() [qstring.h : 992 + 0xa]
     eip = 0x00d74e3a   esp = 0x0018d1b4   ebp = 0x0018d1b8   ebx = 0x01ad947c
     esi = 0x05850000   edi = 0x058277f8   eax = 0xfee1dead   ecx = 0xfee1dead
     edx = 0x00000004   efl = 0x00210282
     Found by: given as instruction pointer in context
  1  ETClient.exe!QString::`scalar deleting destructor'(unsigned int) + 0xf
     eip = 0x00d9161f   esp = 0x0018d1c0   ebp = 0x0018d1c4
     Found by: call frame info
  2  ETClient.exe!buggyFunc() [machinelistitem.cpp : 181 + 0x1d]
     eip = 0x00daaea3   esp = 0x0018d1cc   ebp = 0x0018d1dc
     Found by: call frame info
  3  ETClient.exe!MachineListItem::on_EditButtonClicked() [machinelistitem.cpp : 197 + 0x5]
     eip = 0x00da5dd4   esp = 0x0018d1e4   ebp = 0x0018d250
     Found by: call frame info
  4  ETClient.exe!MachineListItem::qt_static_metacall(QObject *,QMetaObject::Call,int,void * *) [moc_machinelistitem.cpp : 115 + 0x8]
     eip = 0x00de14a1   esp = 0x0018d258   ebp = 0x0018d27c
     Found by: call frame info
  5  ETClient.exe!QMetaObject::activate(QObject *,int,int,void * *) + 0x4cf
     eip = 0x0135329f   esp = 0x0018d284   ebp = 0x00000000
     Found by: call frame info
  6  ETClient.exe!QMetaObject::activate(QObject *,QMetaObject const *,int,void * *) + 0x1e
     eip = 0x0135345e   esp = 0x0018d304   ebp = 0x0018d32c
     Found by: call frame info
  7  ETClient.exe!ToggleButtonWid::sig_buttonClicked() [moc_togglebuttonwid.cpp : 123 + 0x12]
     eip = 0x00de2759   esp = 0x0018d318   ebp = 0x0018d32c
     Found by: call frame info
  8  ETClient.exe!ToggleButtonWid::mousePressEvent(QMouseEvent *) [togglebuttonwid.cpp : 122 + 0x8]
     eip = 0x00dcac14   esp = 0x0018d334   ebp = 0x0018d338
     Found by: call frame info
  9  ETClient.exe!QWidget::event(QEvent *) + 0x89
     eip = 0x00df4fa9   esp = 0x0018d340   ebp = 0x05821ae0
     Found by: call frame info
 10  ETClient.exe!QFrame::event(QEvent *) + 0x20
     eip = 0x00e17280   esp = 0x0018d40c   ebp = 0x0018d7f8
     Found by: call frame info
 11  ETClient.exe!QLabel::event(QEvent *) + 0xdf
     eip = 0x00e0714f   esp = 0x0018d420   ebp = 0x0018d7f8
     Found by: call frame info
 12  ETClient.exe!QApplicationPrivate::notify_helper(QObject *,QEvent *) + 0x98
     eip = 0x00e1de08   esp = 0x0018d434   ebp = 0x0033c6f8
     Found by: call frame info
 13  ETClient.exe!QApplication::notify(QObject *,QEvent *) + 0x659
     eip = 0x00e1c5e9   esp = 0x0018d448   ebp = 0x0018d7f8
     Found by: call frame info
 14  ETClient.exe!WinMain + 0x21358
     eip = 0x015bb068   esp = 0x0018d690   ebp = 0x0018d7f8
     Found by: call frame info
 rubocop:enable Metrics/LineLength