如何使用__cxa_rethrow调试Android堆栈跟踪

问题描述

我正在构建一个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&,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提取某些东西)吗?

我想到的唯一想法是,它不是{{1}},而是引发的另一个(未处理的)异常并导致崩溃。这将是一个简单的修复程序,但是由于我无法重现此错误,而我所拥有的只是这里的堆栈跟踪,而唯一的测试方法是发布新的apk并等待报告进入。这很长来回反馈,因此,我对直接解决问题或至少提高调试可能性以将其修复为两回合非常感兴趣。

问题是:可以从这样的堆栈跟踪中读取什么,以及如何进行调试?

解决方法

在收到用户关于如何完全重现此崩溃的反馈之后,可以通过积极的测试来解决此问题。

如所假设的,这是另一个由transformInPlace()内部调用的库引发的异常。

添加以下内容可修复崩溃并至少在创可贴上提供了帮助。

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

我仍然不清楚在此堆栈跟踪中如何涉及qca。并且是否有任何代码可以处理未处理的异常,或者仅仅是定义某些符号的随机库,还是有其他机制在起作用。我假设__cxa_rethrow发挥了作用,毕竟它与异常处理有关。如果有人能够阐明我,我仍然很高兴。同时,对于将来的读者来说,很高兴知道在此处添加catch all子句是一种可行的方法。