Skip to content

Android release: F libc : Fatal signal 7 (SIGBUS), code 1 #166

Description

@DD-L

qt for android release gcc

问题:

包含 store.lockfree.queue, 用 qt 5.5.1 编译 android release 版本的程序,在运行时就会出现:

F libc    : Fatal signal 7 (SIGBUS), code 1, fault addr 0x9da51154 in tid 25836 (.example.lproxy)
"org.qtproject.example.lproxy" died.

此时,程序尚未进入 qt.main 函数, 看来是全局区(静态区)出了问题。但是 编译 debug 版本的 android 程序,则运行正常,很奇怪的现象。其他平台:win32/linux 不管是 debug 还是 release 也都不会出现这个问题。

qt android release 的 gcc 编译指令示例:

D:\Qt\android\android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++  \
-c -Wno-psabi \
-march=armv7-a -mfloat-abi=softfp -mfpu=vfp -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums \
-DANDROID -Wa,--noexecstack -fno-builtin-memmove \
-std=c++11 -pthread -O2 -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -mthumb \ 
-Wall -Wno-psabi -W -D_REENTRANT -fPIC -DLOG_LOCKFREE_QUEUE -D_REENTRANT -DBOOST_REGEX_NO_LIB -DBOOST_DATE_TIME_SOURCE -DBOOST_SYSTEM_NO_LIB -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_WEBSOCKETS_LIB -DQT_NETWORK_LIB -DQT_WEBCHANNEL_LIB -DQT_CORE_LIB -I../lproxy-local-test -I. -I../lproxy-local-test/lproxy/contrib/boost/boost_1_57_0 -I../lproxy-local-test/lproxy/contrib/cryptopp -I../lproxy-local-test/lproxy/src/core -I../lproxy-local-test/lproxy/src/core/boost_build -ID:/Qt/QtDev/5.5/android_armv7/include -ID:/Qt/QtDev/5.5/android_armv7/include/QtQuick -ID:/Qt/QtDev/5.5/android_armv7/include/QtGui -ID:/Qt/QtDev/5.5/android_armv7/include/QtQml -ID:/Qt/QtDev/5.5/android_armv7/include/QtWebSockets -ID:/Qt/QtDev/5.5/android_armv7/include/QtNetwork -ID:/Qt/QtDev/5.5/android_armv7/include/QtWebChannel -ID:/Qt/QtDev/5.5/android_armv7/include/QtCore -I. -isystem D:/Qt/android/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/include -isystem D:/Qt/android/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -isystem D:/Qt/android/android-ndk-r10e/platforms/android-9/arch-arm/usr/include -ID:/Qt/QtDev/5.5/android_armv7/mkspecs/android-g++ -o websocketclientwrapper.obj ../lproxy-local-test/websocketchannel/websocketclientwrapper.cpp

debug 是没问题的:

D:\Qt\android\android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ \
-c -Wno-psabi \
-march=armv7-a -mfloat-abi=softfp -mfpu=vfp -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums \
-DANDROID -Wa,--noexecstack -fno-builtin-memmove \
-std=c++11 -pthread -g -g -marm -O0 -fno-omit-frame-pointer \
-Wall -Wno-psabi -W -D_REENTRANT -fPIC -DLOG_LOCKFREE_QUEUE -D_REENTRANT -DBOOST_REGEX_NO_LIB -DBOOST_DATE_TIME_SOURCE -DBOOST_SYSTEM_NO_LIB -DQT_QML_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_WEBSOCKETS_LIB -DQT_NETWORK_LIB -DQT_WEBCHANNEL_LIB -DQT_CORE_LIB -I../lproxy-local-test -I. -I../lproxy-local-test/lproxy/contrib/boost/boost_1_57_0 -I../lproxy-local-test/lproxy/contrib/cryptopp -I../lproxy-local-test/lproxy/src/core -I../lproxy-local-test/lproxy/src/core/boost_build -ID:/Qt/QtDev/5.5/android_armv7/include -ID:/Qt/QtDev/5.5/android_armv7/include/QtQuick -ID:/Qt/QtDev/5.5/android_armv7/include/QtGui -ID:/Qt/QtDev/5.5/android_armv7/include/QtQml -ID:/Qt/QtDev/5.5/android_armv7/include/QtWebSockets -ID:/Qt/QtDev/5.5/android_armv7/include/QtNetwork -ID:/Qt/QtDev/5.5/android_armv7/include/QtWebChannel -ID:/Qt/QtDev/5.5/android_armv7/include/QtCore -I. -isystem D:/Qt/android/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/include -isystem D:/Qt/android/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -isystem D:/Qt/android/android-ndk-r10e/platforms/android-9/arch-arm/usr/include -ID:/Qt/QtDev/5.5/android_armv7/mkspecs/android-g++ -o webchannelobject.obj ../lproxy-local-test/webchannelobject/webchannelobject.cpp

release 和 debug 链接指令相同。

最终定位到问题代码 store.h

#include <boost/lockfree/queue.hpp>
template <typename T>
class Store<T, boost::lockfree::queue<T> > : 
        public boost::serialization::singleton<
                    Store<T, boost::lockfree::queue<T> > >,
        public boost::lockfree::queue<T> {
public:
    //using boost::lockfree::queue<T>::push;
    //using boost::lockfree::queue<T>::pop;
    typedef boost::lockfree::queue<T> BASETYPE;

    bool push(const T* element_ptr) {
        if (element_ptr) {
            return this->push(*element_ptr);
        }
        else {
            return false;
        }
    }
    bool push(const T& element) {
        return BASETYPE::push(element);
    }

    bool pop(T* element_ptr) {
        if (element_ptr) {
            return this->pop(*element_ptr);
        }
        else {
            return false;
        }
    }
    bool pop(T& element) {
        return BASETYPE::pop(element);
    }

    // 继承父类的reserve
    //void reserve(size_t);
    //void reserve_unsafe(size_t);
protected:
    Store(size_t _capacity = __STORECAPACITY__s) :
        boost::lockfree::queue<T>(_capacity) {}
    Store(const Store&) {}
private:
    // 屏蔽下面接口
    size_t size() const { return 0; }  
    bool full()   const { return false; }
};

对两个基类虚继承也照旧同一个问题。

gcc 版本

D:\Qt\android\android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ --version

arm-linux-androideabi-g++ (GCC) 4.9 20140827 (prerelease)
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Android 版本:

Android 6.0 ABI:armeabi-v7a

解决办法:去掉 public boost::serialization::singleton<Store<T, boost::lockfree::queue<T> > > , 改用单继承。

更深层次的原因不详,有可能和 boost::serialization::singleton 有关,也可能和 boost::lockfree 有关,也可能和内存字节对齐有关。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions