Commit 5722b52d authored by Hugo Beauzée-Luyssen's avatar Hugo Beauzée-Luyssen

win32: Use breakpad for crash reporting

(cherry picked from commit 80f61c83)
Signed-off-by: default avatarHugo Beauzée-Luyssen <hugo@beauzee.fr>
parent 1b38faa1
......@@ -32,6 +32,16 @@ vlc_SOURCES = winvlc.c
vlc_DEPENDENCIES = vlc_win32_rc.$(OBJEXT)
vlc_LDFLAGS = -mwindows
vlc_LDADD += vlc_win32_rc.$(OBJEXT)
vlc_CPPFLAGS = $(AM_CPPFLAGS)
libbreakpad_wrapper_la_SOURCES = breakpad.cpp
libbreakpad_wrapper_la_LIBADD = $(BREAKPAD_LIBS)
libbreakpad_wrapper_la_LDFLAGS = -static
libbreakpad_wrapper_la_CXXFLAGS = $(AM_CXXFLAGS) $(BREAKPAD_CFLAGS) -DBREAKPAD_URL=\"@BREAKPAD_URL@\"
if HAVE_BREAKPAD
noinst_LTLIBRARIES = libbreakpad_wrapper.la
vlc_LDADD += libbreakpad_wrapper.la -lstdc++ -lwininet
vlc_CPPFLAGS += -DHAVE_BREAKPAD
endif
endif
vlc_osx_SOURCES = darwinvlc.m
......@@ -69,6 +79,7 @@ vlc_static_CFLAGS = $(AM_CFLAGS) \
-DTOP_BUILDDIR=\"$$(cd "$(top_builddir)"; pwd)\" \
-DTOP_SRCDIR=\"$$(cd "$(top_srcdir)"; pwd)\" \
$(NULL)
vlc_static_CPPFLAGS = $(vlc_CPPFLAGS)
vlc_static_DEPENDENCIES = $(vlc_DEPENDENCIES)
vlc_static_LDADD = $(vlc_LDADD)
vlc_static_LDFLAGS = $(vlc_LDFLAGS) -no-install -static
......
/*****************************************************************************
* breakpad.cpp: Wrapper to breakpad crash handler
*****************************************************************************
* Copyright (C) 1998-2017 VLC authors
*
* Authors: Hugo Beauzée-Luyssen <hugo@beauzee.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <windows.h>
#include "client/windows/handler/exception_handler.h"
#include "common/windows/http_upload.h"
#include <memory>
#include <map>
#include <string>
using google_breakpad::ExceptionHandler;
static bool FilterCallback(void*, EXCEPTION_POINTERS*, MDRawAssertionInfo*)
{
// Don't spam breakpad if we're debugging
return !IsDebuggerPresent();
}
extern "C"
{
void CheckCrashDump( const wchar_t* path )
{
wchar_t pattern[MAX_PATH];
WIN32_FIND_DATA data;
_snwprintf( pattern, MAX_PATH, L"%s/*.dmp", path );
HANDLE h = FindFirstFile( pattern, &data );
if (h == INVALID_HANDLE_VALUE)
return;
int answer = MessageBox( NULL, L"Ooops: VLC media player just crashed.\n" \
"Would you like to send a bug report to the developers team?",
L"VLC crash reporting", MB_YESNO);
std::map<std::wstring, std::wstring> params;
params[L"prod"] = L"VLC";
params[L"ver"] = TEXT(PACKAGE_VERSION);
do
{
wchar_t fullPath[MAX_PATH];
_snwprintf( fullPath, MAX_PATH, L"%s/%s", path, data.cFileName );
if( answer == IDYES )
{
std::map<std::wstring, std::wstring> files;
files[L"upload_file_minidump"] = fullPath;
google_breakpad::HTTPUpload::SendRequest(
TEXT( BREAKPAD_URL "/reports" ), params, files,
NULL, NULL, NULL );
}
DeleteFile( fullPath );
} while ( FindNextFile( h, &data ) );
FindClose(h);
}
void* InstallCrashHandler( const wchar_t* crashdump_path )
{
// Breakpad needs the folder to exist to generate the crashdump
CreateDirectory( crashdump_path, NULL );
return new(std::nothrow) ExceptionHandler( crashdump_path, FilterCallback,
NULL, NULL, ExceptionHandler::HANDLER_ALL);
}
void ReleaseCrashHandler( void* handler )
{
ExceptionHandler* eh = reinterpret_cast<ExceptionHandler*>( handler );
delete eh;
}
}
......@@ -43,7 +43,12 @@
#include <io.h>
#include <shlobj.h>
#define HeapEnableTerminationOnCorruption (HEAP_INFORMATION_CLASS)1
static const wchar_t *crashdump_path;
#ifdef HAVE_BREAKPAD
void CheckCrashDump( const wchar_t* crashdump_path );
void* InstallCrashHandler( const wchar_t* crashdump_path );
void ReleaseCrashHandler( void* handler );
#endif
static char *FromWide (const wchar_t *wide)
{
......@@ -198,14 +203,18 @@ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
argv[argc] = NULL;
LocalFree (wargv);
void* eh = NULL;
if(crash_handling)
{
#ifdef HAVE_BREAKPAD
static wchar_t path[MAX_PATH];
if( S_OK != SHGetFolderPathW( NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE,
NULL, SHGFP_TYPE_CURRENT, path ) )
fprintf( stderr, "Can't open the vlc conf PATH\n" );
_snwprintf( path+wcslen( path ), MAX_PATH, L"%s", L"\\vlc\\crashdump" );
crashdump_path = &path[0];
CheckCrashDump( &path[0] );
eh = InstallCrashHandler( &path[0] );
#endif
}
_setmode( _fileno( stdin ), _O_BINARY ); /* Needed for pipes */
......@@ -254,6 +263,9 @@ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
MB_OK|MB_ICONERROR);
#ifdef HAVE_BREAKPAD
ReleaseCrashHandler( eh );
#endif
for (int i = 0; i < argc; i++)
free (argv[i]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment