win和linux下Breakpad编译使用

 

1、下载安装python2.7.13 
https://www.python.org/ftp/python/2.7.13/python-2.7.13.amd64.msi
python27-x64和C:\python27-x64\Scripts添加到Path环境变量中。
python -v 验证

2、下载gyp
https://gitee.com/merlindu/chromium.googlesource.com-external-gyp
cd gyp
python setup.py install

3、下载breakpad
https://gitee.com/mirrors/Breakpad1
拷贝gyp文件夹到breakpad\src\tools文件夹下
cd gyp
gyp.bat --no-circular-check  "../../client/windows/breakpad_client.gyp"


4、使用vs2017生成工程文件

 生成库文件lib

 

 

注意:编译库的工程:项目=》属性=》c++》生成代码=》多线程调试 (/MTd) 和 项目的属性,尽量一致。

设置好库头文件、库文件路径和依赖(common.lib与其他库冲突, 改名crash_command.lib)

 

 

#pragma once

#ifdef WIN32
#include "client/windows/handler/exception_handler.h"

bool dumpCallback(const wchar_t *dump_path, const wchar_t *id, void *context, 
    EXCEPTION_POINTERS *exinfo,
    MDRawAssertionInfo *assertion,
    bool succeeded)
{
#ifndef CONSOLEAPP
    FatalAppExit(-1, ("程序异常,生成DMP文件"));
#else
    std::cout << "程序异常,生成DMP文件\ n";
#endif // _WIN32

    return succeeded;
}

void breakpadDump()
{
    google_breakpad::ExceptionHandler  * eh = new google_breakpad::ExceptionHandler(
        L"./", NULL, dumpCallback, NULL,
        google_breakpad::ExceptionHandler::HANDLER_ALL);
}

#else
#include "client/linux/handler/exception_handler.h"

static bool dumpCallback(const google_breakpad::MinidumpDescriptor &descriptor,
    void *context,
    bool succeeded)
{
    std::string strPath = std::string("./");
    remove(strPath.c_str());
    rename(descriptor.path(), strPath.c_str());

    printf("程序异常,生成DMP文件\n");
    return succeeded;
}

void breakpadDump()
{
    google_breakpad::MinidumpDescriptor descriptor("./");
    google_breakpad::ExceptionHandler *eh = new google_breakpad::ExceptionHandler(descriptor,
        NULL,
        dumpCallback,
        NULL,
        true,
        -1);
}

#endif // !WIN32


//运行异常处理
void RunCrashHandler()
{
    breakpadDump();
}

 

#include "breakpad.h"

int main()
{
    RunCrashHandler();

    int* pTest = NULL;
    *pTest = 1;
}

 调试:使用vs2017,打开dmp文件,设置符号路径,进行调试。

 

 

linux下分析dmp文件

Breakpad为我们提供了两个工具dump_syms和minidump_stackwalk,我们将用他们来分析dump,定位bug。

1、dump_syms,将程序导出符号文件;
dump_syms libxxx.so.1.0.0 >libxxx.so.1.0.0.sym

2、获取头信息并创建相关文件夹
获取头信息:head –n 1 libxxx.so.1.0.0.sym
创建文件夹并将放置.sym文件 libxxx.so.1.0.0/7B035BDD487A36C81FA905286ED6D0EB0/libxxx.so.1.0.0.sym

3、使用符号文件解析dmp文件 minidump_stackwalk error.dmp symbols

 

 

 

 其他:

1、在dockerfile中添加:

RUN echo "kernel.core_pattern = /cms/log/core.%e.%p.%t">/etc/sysctl.conf    //指定coredump文件路径/cms/log/
RUN sysctl -p   //使设定生效



2、docker run 时 添加 --privileged=true

如:docker run --name coredumpDemo --privileged=true -v /usr/local/cms_yd/log:/cms/log -v /etc/localtime:/etc/localtime -d coredump

 

posted @ 2020-12-09 23:39  osbreak  阅读(856)  评论(0编辑  收藏  举报