سلام. اون نسخه ای از breakpad که من در اون پست توضیح دادم وابسته به QT بود ولی در کل نسخه رسمی وابسته به Qt نیست .یک بار نسخه اصلی را براتون توضیح میدم شاید بدردتون خورد:
۱- از گیت هاب نسخه رسمی breakpad را دانلود کنید.
۲- از گیت هاب gyp (Generate Your Projects) را دانلود کنید.
۳- پایتون هم روی سیستم تون نصب باشه .
۴- از این طریق breakpad را جنریت کنید
tools\gyp\gyp.bat --no-circular-check client\windows\breakpad_client.gyp
۵- پروژه ها را بیلد کنید.
۶- برای dumpکردن شما به ۳ کتابخانه زیر نیاز دارید:
-
common.lib
-
crash_generation_client.lib
-
exception_handler.lib
۷- کد زیر را به پروژه خودتون اضاففه کنید:
#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;
}
اگر هم قصد دارید به صورت پیشرفته تر dump را مدیریت کنید از مثال زیر استفاده کنید:
#include "client/windows/handler/exception_handler.h"
// Minidump with stacks, PEB, TEB, and unloaded module list.
const MINIDUMP_TYPE kSmallDumpType = static_cast<MINIDUMP_TYPE>(
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<MINIDUMP_TYPE>(
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<MINIDUMP_TYPE>(
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 = "";
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<wchar_t>(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;
}
در هر دو کد خطای زیر هم قرار داده شده تا بتونید به راحتی تستش هم کنید:
char *pBuf = NULL;
*pBuf = 'a';
یادتون باشه اگر قرار dump فایل در فلدری ذخیره بشه اون فلدر را باید خودتون بسازید.
پس از برخورد با خطا در فلدر موردنظر dump فایل ایجاد میشه که می تونید در file->open در ویژوال استدیو بازش کنید و سپس با کلید play با عنوان debug with native onlyاجراش کنید و خطی که خطا در آن ایجاد شده ظاهر خواهد شد.
فقط دو نکته هست که باید رعایت کنید
-
پروژه در کلاینت و سرور باید کاملا یکسان باشه اینطور نباشه که شما در سمت سرور تغییرات بدید بعد انتظار داشته باشید dump مربوط به کلاینت کار کنه .
-
مسیر پروژه ها را در کلاینت و سرور یکسان در نظر بگیرید.