breakpad是google开源的一套用于进程crash的处理方案,跨平台。应该是早期版本crash report的升级版本,以前的crashrpt仅支持win平台。
不过好像由于现在有沙盒技术,会导致breakpad无法生成dump,所以google又开发了一个crashpad项目,用来替代breakpad。
从http://www.goubanjia.com/找了个代理访问的。使用git下载,也需要设置代理
git config --global http.proxy 203.189.147.33:46631
google好多源码都是使用depot_tools下载,其可以将第三方依赖文件也下载下来。不过访问googlesource需要,如果不能,本工具就不用下载了。
下载地址:
git:
https://chromium.googlesource.com/chromium/tools/depot_tools.git
git clone https://chromium.googlesource.com/chromium/tools/depot_tools
压缩包:
https://storage.googleapis.com/chrome-infra/depot_tools.zip
下载解压后,获取breakpad源码:
fetch breakpad
同样的需要,如果不能访问可以使用github上的分支版本。
git下载地址:
https://chromium.googlesource.com/breakpad/breakpad
$ git clone https://chromium.googlesource.com/breakpad/breakpad
github下载地址:
https://github.com/google/breakpad
gyp是chromium开发的跨平台自动化项目构建工具,gyp工具下载地址:
https://chromium.googlesource.com/external/gyp/
$ git clone https://chromium.googlesource.com/external/gyp
不能就随便找个下载吧,附一个github上的地址:
https://github.com/bnoordhuis/gyp
使用gyp时需要python的支持,好像只能支持python2.7.x,不支持python 3.x。
自行官网下载python。
下载地址:
https://github.com/abseil/googletest
在breakpad\src
下新建testing
目录,将gtest解压后的googlemock和googletest拷贝到新建的testing
下。
使用gyp生成sln文件。
tools\gyp\gyp.bat --no-circular-check client\windows\breakpad_client.gyp
成功后在breakpad\src\client\windows\目录下有生成的breakpad_client.sln工程文件。
vs打开sln文件,breakpad使用了Unicode编码,如果更改字符集会编译失败。
win下如果使用进程内dump,需要链接下面几个库
common.lib
crash_generation_client.lib
exception_handler.lib
code1:
#include "client/windows/handler/exception_handler.h"
int main()
{
google_breakpad::ExceptionHandler *pCrashHandel =
new google_breakpad::ExceptionHandler(
L".",
NULL,
NULL,
NULL,
google_breakpad::ExceptionHandler::HANDLER_ALL,
NULL);
char *pBuf = NULL;
*pBuf = 'a';
return 0;
}
code2:
#include "client/windows/handler/exception_handler.h"
// Minidump with stacks, PEB, TEB, and unloaded module list.
const MINIDUMP_TYPE kSmallDumpType = static_cast(
MiniDumpWithProcessThreadData | // Get PEB and TEB.
MiniDumpWithUnloadedModules); // Get unloaded modules when available.
// Minidump with all of the above, plus memory referenced from stack.
const MINIDUMP_TYPE kLargerDumpType = static_cast(
MiniDumpWithProcessThreadData | // Get PEB and TEB.
MiniDumpWithUnloadedModules | // Get unloaded modules when available.
MiniDumpWithIndirectlyReferencedMemory); // Get memory referenced by stack.
// Large dump with all process memory.
const MINIDUMP_TYPE kFullDumpType = static_cast(
MiniDumpWithFullMemory | // Full memory from process.
MiniDumpWithProcessThreadData | // Get PEB and TEB.
MiniDumpWithHandleData | // Get all handle information.
MiniDumpWithUnloadedModules); // Get unloaded modules when available.
static google_breakpad:Exception *sg_pCrash = NULL;
static std::string sg_strDumpPath = "";
//此方法可以不实现,本示例只是为了实现:出现异常时才产生dump文件夹,没有异常时不创建文件夹
bool FilterCallback(void *context,
EXCEPTION_POINTERS *exinfo,
MDRawAssertionInfo *assertion)
{
if(CFileUtil::createMultiDir(sg_strDumpPath))
{
return false;
}
return true;
}
bool installBreakpad()
{
enum {BUF_LEN = 1024};
char szBuf[BUF_LEN];
memset(szBuf,0,sizeof(szBuf));
GetModuleFileNameA(NULL,szBuf,BUF_LEN);
boost::filesystem::path objPath(szBuf);
std::string strFileName = objPath.stem().string();
objPath.remove_filename();
objPath /= "../../minidump";
objPath /= strFileName;
sg_strDumpPath = objPath.string();
std::string strCodePage = boost::locale::util::get_system_locale();
std::locale loc = boost::locale::generator().generate(strCodePage);
std::wstring wstrPath = boost::locale::conv::to_utf(sg_strDumpPath,loc);
sg_pCrash = new google_breakpad::ExceptionHandler(wstrPath,
FilterCallback,
NULL,
NULL,
google_breakpad::ExceptionHandler::HANDLER_ALL,
kFullDumpType,
(HANDLE)NULL,
NULL);
return (sg_pCrash != NULL);
}
bool uninstallBreakpad()
{
if(sg_pCrash != NULL)
{
delete sg_pCrash;
sg_pCrash = NULL;
}
return true;
}
int main()
{
installBreakpad();
char *pBuf = NULL;
*pBuf = 'a';
uninstallBreakpad();
return 0;
}