美文网首页Qt学习
Qt for Android 集成 Bugly 捕获错误

Qt for Android 集成 Bugly 捕获错误

作者: 蓝点工坊 | 来源:发表于2018-09-22 17:06 被阅读14次

一.错误现象

一个Qt 蓝牙程序,在Andorid第一次未扫描到设备就闪退,

D BluetoothAdapter: cancelDiscovery
D BluetoothAdapter: cancelDiscovery = true
D BT8510  : (null):0 ((null)): qt.bluetooth.android: DeviceDiscoveryBroadcastReceiver::onReceive() - event: "android.bluetooth.adapter.action.DISCOVERY_FINISHED"

Qt Android Fatal signal 11 (SIGSEGV), code 1, fault addr 0x63002d in tid 5248 (qtMainLoopThrea) 定位

"org.qtproject.example" died.

二.集成bugly 机制

在Android原生下,使用各种统计和错误上报机制很常见,如umeng,bugly等.
其中bugly 功能很强,而且NDK 报错功能,这样我们Qt C++错误可以直接提示出错类和方法, 这个为最终解决bug提供很好条件

  1. 准备条件,首在http://bugly.qq.com 注册成开发者,并注册一个Android应用
    image.png

这里最关键是一个App ID 形如 "7b422b4b78"字符串.

  1. 在Qt 增加对Android 单独支持,首选建立一个Qt Android Template


    image.png

成功后,在other file 会增加相应的Android支持


image.png

3.在Android项目增加相关值.
bugly 官方集成文档
https://bugly.qq.com/docs/user-guide/instruction-manual-android/?v=20180913155123
3.1 增加引用库语句
这里文档是针对Android studio 的model/build.gradle的.但Qt生成没有 ,可直接在build.gradle 修改也没问题,

//对NDK支持,必加
android {
    defaultConfig {
        ndk {
            // 设置支持的SO库架构
            abiFilters 'armeabi-v7a'  //<---注意这里要与Qt Android支持cpu一致
        }
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.tencent.bugly:crashreport:latest.release' //手动增加的bugly的引用
    compile 'com.tencent.bugly:nativecrashreport:latest.release' ///手动增加的bugly NDK 的引用
}

3.2 增加一个QtApplication子类,用于全局初始化
这里需要用到java相关知识,如果这个类包是 cn.bluedrum.则要手工创建 src/cn/bluedrum 目录(QtCreator 不会自动创建)
在这个目录创建java文件

package cn.bluedrum;
import com.tencent.bugly.Bugly;
import android.util.Log;

//注意这里的基类,必须是QtApplication
public class BDQApplication extends org.qtproject.qt5.android.bindings.QtApplication{

    @Override
        public void onCreate() {
            super.onCreate();

              Log.d("BDQ","show front activity ");
//这里对bugly进行初始化,里面是你申请的App ID
             Bugly.init(getApplicationContext(), "7b422b4b78", true);
            

        }

}

3.3 修改AndroidManifest.xml

增加对本Application类的引用,以及bugly所需要权限

  <application android:hardwareAccelerated="true" android:name="cn.bluedrum.BDQApplication" android:label="-- %%INSERT_APP_NAME%% --">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />

然后编译接入wifi后即可在后台查看相关数据

三.最终解决

image.png

因为支持ndk捕获,所以直接显示C++哪个类的方法出错,

提示在HBluetoothManager::StopScan() 中的qDebug() <<出错
代码如下:

if(mScanState == WORK_SCAN){
        qDebug() << "work scan ,device "<< getCurrentDevice();  //<-造成段错误地方
        if(getCurrentDevice()==NULL)
           emit deviceConnectTimeout();
    }

原因是getCurrentDevice() 为NULL直接赋给qDebug() <<NULL ; 即会造成段错误,(后来发现,一个对象指针没有赋初值NULL)
改正很简单,

 if(mScanState == WORK_SCAN){
        
        if(getCurrentDevice()==NULL){
             qDebug() << "work scan ,none device find. "; 
           emit deviceConnectTimeout();
        }
        else{
           qDebug() << "work scan ,device "<< getCurrentDevice()->getAddress(); 
        }
    }

相关文章

网友评论

    本文标题:Qt for Android 集成 Bugly 捕获错误

    本文链接:https://www.haomeiwen.com/subject/velxoftx.html