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