google breakpad /qbreakpad 在 arm移植

来源:互联网 发布:gtx1050ti 知乎 编辑:程序博客网 时间:2024/06/09 23:46

google breakpad /qbreakpad 在 arm移植

breakpad在arm-linux上移植,集成到qt中生成qbreakpad
参考文档:
Google Breakpad 之一,跨平台crash 处理上报系统简介 http://blog.csdn.net/wpc320/article/details/8290501
Google Breakpad 之二,实战Linux平台本地crash http://blog.csdn.net/wpc320/article/details/8291296
Google Breakpad 之三,实战Windows平台crash http://blog.csdn.net/wpc320/article/details/8291857
Google Breakpad 之四,客户端设计 http://blog.csdn.net/wpc320/article/details/8298524

breakpad移植过程

breakpad源码下载:https://github.com/google/breakpad/tree/6f045df4f0d976ee196221f7dc51dadfd245a738

注意:最新版的google breakpad需要支持C++ 11属性,对应比较老的交叉编译工具,需要下载前几个版本的breakpad才能编译通过,上述地址是google 2013 年commit的一个版本稍加修改即可编译通过

一、修改源码

  • 修改src\common\memory.h + 117为:
   void *a = sys_mmap(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE,                        MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); #else-    void *a = sys_mmap2(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE,+    void *a = sys_mmap(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE,                         MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); #endif     if (a == MAP_FAILED)
  • 修改\src\tools\linux\md2core\minidump-2-core.cc +128为:
  long tv_sec;                  /* Seconds                                   */   long tv_usec;                 /* Microseconds                              */ } elf_timeval;--typedef struct elf_siginfo {    /* Information about signal (unused)         */+#if 0+struct elf_siginfo {    /* Information about signal (unused)         */   int32_t si_signo;             /* Signal number                             */   int32_t si_code;              /* Extra code                                */   int32_t si_errno;             /* Errno                                     */-} elf_siginfo;-+};+#endif typedef struct prstatus {       /* Information about thread; includes CPU reg*/   elf_siginfo    pr_info;       /* Info associated with signal               */   uint16_t       pr_cursig;     /* Current signal      
  • 修改src\common\linux\memory_mapped_file.cc +87为:
 #if defined(__x86_64__)   void* data = sys_mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); #else-  void* data = sys_mmap2(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);+  void* data = sys_mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); #endif   sys_close(fd);   if (data == MAP_FAILED) {
  • 新建src/third_party/lss/linux_syscall_support.h ;文件太大google搜索添加即可

二、编译

在源码目录下

export CC=arm-arago-linux-gnueabi-gccexport CXX=arm-arago-linux-gnueabi-g++./configure --host=arm-arago-linux-gnueabi --prefix=/home/xxx/xxxmake -j4make install

其中 –host为你的交叉编译工具前缀,执行完上述命令可在你的-prefix设置的目录下生成具体的库文件

其实完成上述移植可满足当前需求,我们现在的需求是在qt中使用breakpad,所以还需要移植一个qbreakpad,qbreakpad基于breakpad生成,所以我们可修改qbreakpad源码编译即可

qbreakpad移植

qbreakpad源码下载 : https://github.com/buzzySmile/qBreakpad

qbreakpad是基于breakpad编译生成的库从而集成到qt中

一、qbreakpad介绍

  • 具体功能介绍可参考github,我们的需求实在嵌入式qt中使用breakpad,所以将他制作成qt库
  • qbreakpad源码结构我们只需要编译handler目录下的工程生成libqbreakpad.so动态库即可,其他的都是他的实例程序和测试

二、qbreakpad源码修改

  • 拷贝breakpad src目录及其子目录下的所有的*.h文件到当前目录
  • 在qBreakpad-master\handler\QBreakpadHttpUploader.h加入头文件
    c
    #include <qDebug>
  • 修改qBreakpad-master\handler\handler.pro为以下结构,注意修改启动LIBS链接为上面编译的libbreakpad_client.a文件的路径

    TEMPLATE = libTARGET = qBreakpadApplication versionVERSION = 0.4.0CONFIG += warn_on thread exceptions rtti stlQT -= guiQT += core networkLIBS += -L/home/lingfuyi/it7000/pack/qBreakpad-master/handler/ -lbreakpad_clientOBJECTS_DIR = _build/objMOC_DIR = _buildwin32 {DESTDIR = $$OUT_PWD}HEADERS += \    $$PWD/singletone/call_once.h \$$PWD/singletone/singleton.h \    $$PWD/QBreakpadHandler.h \$$PWD/QBreakpadHttpUploader.h \    $$PWD/exception_handler.hSOURCES += \$$PWD/QBreakpadHandler.cpp \    $$PWD/QBreakpadHttpUploader.cpp
  • 修改所有cpp文件对应breakpad头文件路径为你具体的路径

  • qt版本过低的需要注释掉handler\QBreakpadHttpUploader.cpp 下的

    //#include <QMimeDatabase>

    编译可生成libqBreakpad.so文件即可