window平台下VS2013结合Qt的google breakpad异常捕捉

来源:互联网 发布:安卓e4a编程工具手机版 编辑:程序博客网 时间:2024/04/28 19:35

google-breakpad,这是谷歌的一个开源项目,是一个非常实用的跨平台的异常处理系统
开发工具 :
VS2013 +QT 5.3.1

源文件,以及需要搭建的环境文件 :
链接:http://pan.baidu.com/s/1cvDnae 密码:r1mn
其中项目文件.rar是我写的源码,googleBreakpad.rar是官方的示例,Python_X64_2.7.11_AnXia.zip是python的安装文件

  • 首先对官方的的实例googleBreakpad进行编译(此处参考了http://blog.csdn.net/xiexievv/article/details/44673345的编译方法)

    1. 安装python 2.x.x就行
    2. 跳转到你下载文件的这个目录下“googleBreakpad\src\tools\gyp”
    3. 在gyp目录下打开控制台 (可以用在这个文件夹的文件路径中输入cmd或者在cmd下cd 到具体的路径,这个应该没什么障碍)输入命令:

gyp.bat "../../client/windows/breakpad_client.gyp"


    如果报错,试试下面这个命令

gyp.bat --no-circular-check "../../client/windows/breakpad_client.gyp"(注:我就是使用这条命令成功的)
这个时候,编译成功了,就会在你的\googleBreakpad\src\client\windows目录下生成一个.sln的解决方案文件,用VS打开,即可。

  • 进入生成的解决方案后,生成所需要的lib库文件

这里有几个特别要注意的地方,我就是在这几各地方困扰了很久

  1. 如果需要把breakpad部署到自己的项目中,有两种方法。

    ①很直接也很蠢的方法,因为这毕竟是个开源项目,所以是直接提供源码的,你可以将你需要的头文件和源文件直接复制到你自己的工程目录下(我这里是直接将src文件夹复制到自己的项目文件目录下,因为后面要用的那些头文件里面会引用其它的头文件,就是以这个文件夹目录为基础目录的),然后按照需要在项目属性-> 配置属性 -> C/C++ -> 常规 ->附加包含目录 添加包含这些头文件和源文件的目标文件夹路径,如图所示:这里写图片描述这里写图片描述

    ②不直接使用源文件,而是使用官方源码所生成的库文件(lib文件),推荐使用这种方法,这里就是需要运行之前编译的解决方法,生成库文件,然后将库文件和要用到的头文件导入自己的项目。

    那么这里问题就来了,我就是在这里卡了,每次把生成的库导入到自己的项目后,各种error,无法识别的外部符号,XX在XX里面被引用之类的,然后在网上查了几天都没什么头绪,最后偶然看一篇帖子才发现原因,毫无疑问地暴露了基础较差。。。静态库使用的时候注意运行库版本要一致。

    即现在你自己的项目的运行库版本要和需要被导入的lib文件版本要一致。自己项目的运行库版本在项目属性-> 配置属性 -> C/C++ -> 代码生成 -> 运行库 查看,如图:
    运行库版本我这里是多线程DLL/MDd,而我之前出错原因是每次都是在修改自己当前项目的运行库,虽然和要导入的lib文件版本一致了,但是会导致MSVCRTD.lib和qtmaind.lib等头文件又出现error,所以这里应该修改的是breakpad源码中生成lib文件的项目的运行库,使要导入的lib文件运行库版本和你当前的项目运行库版本一致。下图是源码demo中各个项目所对应的生成的lib文件,我们用到的就是这几个。项目以及对应的库文件

    所以需要修改项目中运行库版本的属性的就是上面对应的用来生成lib文件的项目,如何修改,以crash_generation_server为例,参照下图:
    调整

把每个项目的运行库版本修改以后,可以挨个生成(注意这里生成就是单纯的生成lib文件,它们的运行结果就是生成lib文件,不是生成可执行文件exe的),如果直接解决方案右键生成解决方案或者直接点windos本地调试也行,但是如果报错了,不要以为是生成lib文件没有成功,那是因为,整个解决方案里面除了生成lib文件的项目,还有一个是google官方的样例项目crash_generation_app,他就是生成exe的,而不是生成lib文件,而在你改动之前,它和其他项目的运行库版本都是多线程调试(/MTd),改动以后,这个样例引用了新生成的lib文件,自然会因为运行库版本不匹配而报错,只需要去查看对应的lib文件时间是不是现在的时间,就可以判断是不是新生成的了,然后就可以拿过去用了。

慢慢更新。。。。

0 0
原创粉丝点击