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;
long tv_usec;
} elf_timeval;
-
-typedef struct elf_siginfo {
+#if 0
+struct elf_siginfo {
int32_t si_signo;
int32_t si_code;
int32_t si_errno;
-} elf_siginfo;
-
+};
+#endif
typedef struct prstatus {
elf_siginfo pr_info;
uint16_t pr_cursig;
- 修改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-gcc
export CXX=arm-arago-linux-gnueabi-g++
./configure --host=arm-arago-linux-gnueabi --prefix=/home/xxx/xxx
make -j4
make 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 = lib
TARGET = qBreakpad
Application version
VERSION = 0.4.0
CONFIG += warn_on thread exceptions rtti stl
QT -= gui
QT += core network
LIBS += -L/home/lingfuyi/it7000/pack/qBreakpad-master/handler/ -lbreakpad_client
OBJECTS_DIR = _build/obj
MOC_DIR = _build
win32 {
DESTDIR = $$OUT_PWD
}
HEADERS += \
$$PWD/singletone/call_once.h \
$$PWD/singletone/singleton.h \
$$PWD/QBreakpadHandler.h \
$$PWD/QBreakpadHttpUploader.h \
$$PWD/exception_handler.h
SOURCES += \
$$PWD/QBreakpadHandler.cpp \
$$PWD/QBreakpadHttpUploader.cpp
修改所有cpp文件对应breakpad头文件路径为你具体的路径
qt版本过低的需要注释掉handler\QBreakpadHttpUploader.cpp 下的
编译可生成libqBreakpad.so文件即可
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)