Я создаю приложение для 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 и дождаться получения отчетов. Это долгий туда и обратно для обратной связи, поэтому я очень заинтересован в том, чтобы исправить ситуацию напрямую или, по крайней мере, улучшить возможности отладки, чтобы исправить это за два раунда.
Итак, вопрос: что можно прочитать из такой трассировки стека и как ее отлаживать?