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)

 


// breakpad.h
#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
#include "breakpad.h"

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

int main()
{
    RunCrashHandler();

    int* pTest = NULL;
    *pTest = 1;
}
vs2017分析dmp文件
调试:使用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
posted @ 2020-12-09 23:39  osbreak  阅读(1020)  评论(0)    收藏  举报