Как отлаживать трассировку стека Android с помощью __cxa_rethrow

Я создаю приложение для Android, которое в последней версии имеет много отчетов о сбоях, таких как следующий в google play dash. Он состоит из нескольких библиотек, скомпилированных с помощью android-ndk.

Начиная с кадра № 05, я понимаю это наполовину. Интересно, как сделать вторую половину и что сделать из верхних рамок.

След:

  #00  pc 0000000000083134  /apex/com.android.runtime/lib64/bionic/libc.so (abort+160)
  #01  pc 000000000017cf00  /data/app/[...]==/lib/arm64/libqca-qt5_arm64-v8a.so
  #02  pc 000000000017d070  /data/app/[...]==/lib/arm64/libqca-qt5_arm64-v8a.so
  #03  pc 0000000000179f48  /data/app/[...]==/lib/arm64/libqca-qt5_arm64-v8a.so
  #04  pc 0000000000179850  /data/app/[...]==/lib/arm64/libqca-qt5_arm64-v8a.so (__cxa_rethrow+196)
  #05  pc 0000000000c0e10c  /data/app/[...]==/lib/arm64/libqgis_core_arm64-v8a.so (QgsCoordinateTransform::transformInPlace(double&, double&, double&, QgsCoordinateTransform::TransformDirection) const+300)
  #06  pc 00000000000340d8  /data/app/[...]==/lib/arm64/libqfield_qgsquick_arm64-v8a.so (QgsQuickCoordinateTransformer::updatePosition()+136)
  #07  pc 0000000000034350  /data/app/[...]==/lib/arm64/libqfield_qgsquick_arm64-v8a.so (QgsQuickCoordinateTransformer::setDestinationCrs(QgsCoordinateReferenceSystem const&)+176)
  #08  pc 0000000000028488  /data/app/[...]==/lib/arm64/libqfield_qgsquick_arm64-v8a.so
  #09  pc 0000000000028a18  /data/app/[...]==/lib/arm64/libqfield_qgsquick_arm64-v8a.so (QgsQuickCoordinateTransformer::qt_metacall(QMetaObject::Call, int, void**)+316)
  #10  pc 00000000002f36a8  /data/app/[...]==/lib/arm64/libQt5Qml_arm64-v8a.so (QV4::QQmlValueTypeWrapper::write(QObject*, int) const+180)

Что я знаю: QgsCoordinateTransform::transformInPlace может бросить QgsCsException, который ловится и обрабатывается внутри updatePosition().

  try
  {
    mCoordinateTransform.transformInPlace( x, y, z );
  }
  catch ( const QgsCsException &exp )
  {
    QgsDebugMsg( exp.what() );
  }

Учитывая, что это обработано, я не уверен, как это связано с аварией, тем не менее, я думаю, что это может быть интересная информация.

Что я не могу понять, так это то, как libqca-qt5 вступает в игру, это никогда не используется внутри transformInPlace. Может быть, у него есть какая-то магия для обработки необработанных исключений (можно ли что-то извлечь из __cxa_rethrow)?

Единственная идея, которая приходит мне в голову, заключается в том, что это не QgsCsException, а другое (необработанное) исключение, которое возникает и вызывает сбой. Это было бы легко исправить, но поскольку я не могу воспроизвести это, и все, что у меня есть, это трассировка стека здесь, и единственный способ проверить - отправить новый apk и дождаться получения отчетов. Это долгий туда и обратно для обратной связи, поэтому я очень заинтересован в том, чтобы исправить ситуацию напрямую или, по крайней мере, улучшить возможности отладки, чтобы исправить это за два раунда.

Итак, вопрос: что можно прочитать из такой трассировки стека и как ее отлаживать?


person Matthias Kuhn    schedule 18.08.2020    source источник
comment
Перед тем как голосовать против, пожалуйста, задавайте вопросы, которые могут помочь улучшить пост, спасибо :-)   -  person Matthias Kuhn    schedule 18.08.2020
comment
Я не знаю, почему вам отказали, вопрос кажется мне твердым. У меня нет другого ответа, кроме как если бы я был в вашей ситуации, я бы попытался зафиксировать как можно больше журналов вокруг этого кода и вставить еще один улов для общего исключения, зарегистрировать это и посмотреть, что вы можете найти. Если вы не можете воспроизвести себя в отладчике, вы зависите от файлов журналов.   -  person spartygw    schedule 18.08.2020


Ответы (1)


После получения отзыва от пользователя о том, как именно воспроизвести этот сбой, можно было решить эту проблему с уверенностью в положительном результате теста.

Как и предполагалось, это было другое исключение, вызванное другой библиотекой, которая была вызвана из transformInPlace().

Добавление следующей строки устранило сбой и помогло, по крайней мере, в качестве пластыря.

  try
  {
    mCoordinateTransform.transformInPlace( x, y, z );
  }
  catch ( const QgsCsException &exp )
  {
    QgsDebugMsg( exp.what() );
  }
  catch ( ... )
  {
    QgsDebugMsg( "Unknown exception caught" );
  }

Мне до сих пор неясно, как qca участвует в трассировке стека. И есть ли какой-либо код для обработки необработанных исключений, или это просто случайная библиотека, определяющая некоторые символы, или есть другие механизмы. Я предполагаю, что __cxa_rethrow играет роль, в конце концов, это связано с обработкой исключений. Я все равно был бы счастлив, если бы кто-нибудь пролил свет. Между тем, будущим читателям будет полезно знать, что добавление предложения "поймать все" - это возможный подход.

person Matthias Kuhn    schedule 19.08.2020