From 70c33ffe390661359bf6e9220f40e0a725ff3270 Mon Sep 17 00:00:00 2001 From: Sigurdur Asgeirsson Date: Fri, 9 Feb 2018 20:08:06 +0000 Subject: [PATCH] Expose the Crashpad database path for direct use in the browser process. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This also paves the way for removing the awkward cross-module marshaling of crash reports. With the Crasphad database path available, it's a simple matter to construct a new database instance at need. Bug: 806661 Change-Id: Ifd64f02bd7855de32163d91b6d2ad52404f9883e Reviewed-on: https://chromium-review.googlesource.com/911594 Reviewed-by: Robert Shield Reviewed-by: Scott Graham Commit-Queue: Sigurður Ásgeirsson Cr-Commit-Position: refs/heads/master@{#535792} --- chrome_elf/chrome_elf_x64.def | 1 + chrome_elf/chrome_elf_x86.def | 1 + .../crash/content/app/crash_export_stubs.cc | 4 +++ .../crash/content/app/crash_export_thunks.cc | 4 +++ .../crash/content/app/crash_export_thunks.h | 3 +++ components/crash/content/app/crashpad.cc | 26 +++++++++++++++++++ components/crash/content/app/crashpad.h | 6 +++++ 7 files changed, 45 insertions(+) diff --git a/chrome_elf/chrome_elf_x64.def b/chrome_elf/chrome_elf_x64.def index e1ec2a5c8074db..0f0d6b890e9fac 100644 --- a/chrome_elf/chrome_elf_x64.def +++ b/chrome_elf/chrome_elf_x64.def @@ -9,6 +9,7 @@ EXPORTS ; From components/crash/content/app/crash_export_stubs.cc CrashForException_ExportThunk + GetCrashpadDatabasePath_ExportThunk GetCrashReports_ExportThunk InjectDumpForHungInput_ExportThunk RequestSingleCrashUpload_ExportThunk diff --git a/chrome_elf/chrome_elf_x86.def b/chrome_elf/chrome_elf_x86.def index be256778a69e3a..53a46bb1a3459a 100644 --- a/chrome_elf/chrome_elf_x86.def +++ b/chrome_elf/chrome_elf_x86.def @@ -9,6 +9,7 @@ EXPORTS ; From components/crash/content/app/crash_export_stubs.cc CrashForException_ExportThunk + GetCrashpadDatabasePath_ExportThunk GetCrashReports_ExportThunk InjectDumpForHungInput_ExportThunk RequestSingleCrashUpload_ExportThunk diff --git a/components/crash/content/app/crash_export_stubs.cc b/components/crash/content/app/crash_export_stubs.cc index 462b5d8bfba11f..995756cb5fc76d 100644 --- a/components/crash/content/app/crash_export_stubs.cc +++ b/components/crash/content/app/crash_export_stubs.cc @@ -31,6 +31,10 @@ HANDLE InjectDumpForHungInput_ExportThunk(HANDLE process) { return nullptr; } +const wchar_t* GetCrashpadDatabasePath_ExportThunk() { + return nullptr; +} + #if defined(ARCH_CPU_X86_64) void RegisterNonABICompliantCodeRange_ExportThunk(void* start, diff --git a/components/crash/content/app/crash_export_thunks.cc b/components/crash/content/app/crash_export_thunks.cc index ea2ffdacda9de5..68903b26b0cb81 100644 --- a/components/crash/content/app/crash_export_thunks.cc +++ b/components/crash/content/app/crash_export_thunks.cc @@ -60,6 +60,10 @@ HANDLE InjectDumpForHungInput_ExportThunk(HANDLE process) { nullptr); } +const wchar_t* GetCrashpadDatabasePath_ExportThunk() { + return crash_reporter::GetCrashpadDatabasePathImpl(); +} + #if defined(ARCH_CPU_X86_64) void RegisterNonABICompliantCodeRange_ExportThunk(void* start, diff --git a/components/crash/content/app/crash_export_thunks.h b/components/crash/content/app/crash_export_thunks.h index 43d0a4eae34ca4..7c5d9d729f52f2 100644 --- a/components/crash/content/app/crash_export_thunks.h +++ b/components/crash/content/app/crash_export_thunks.h @@ -55,6 +55,9 @@ void SetUploadConsent_ExportThunk(bool consent); // This method is used solely to classify hung input. HANDLE InjectDumpForHungInput_ExportThunk(HANDLE process); +// Returns the crashpad database path. +const wchar_t* GetCrashpadDatabasePath_ExportThunk(); + #if defined(ARCH_CPU_X86_64) // V8 support functions. void RegisterNonABICompliantCodeRange_ExportThunk(void* start, diff --git a/components/crash/content/app/crashpad.cc b/components/crash/content/app/crashpad.cc index dde11eab445da3..36ff7c219ad535 100644 --- a/components/crash/content/app/crashpad.cc +++ b/components/crash/content/app/crashpad.cc @@ -46,6 +46,8 @@ namespace crash_reporter { namespace { +base::FilePath* g_database_path; + crashpad::CrashReportDatabase* g_database; bool LogMessageHandler(int severity, @@ -87,6 +89,13 @@ bool LogMessageHandler(int severity, return false; } +void InitializeDatabasePath(const base::FilePath& database_path) { + DCHECK(!g_database_path); + + // Intentionally leaked. + g_database_path = new base::FilePath(database_path); +} + void InitializeCrashpadImpl(bool initial_client, const std::string& process_type, const std::string& user_data_dir, @@ -172,6 +181,8 @@ void InitializeCrashpadImpl(bool initial_client, const bool should_initialize_database_and_set_upload_policy = initial_client; #endif if (should_initialize_database_and_set_upload_policy) { + InitializeDatabasePath(database_path); + g_database = crashpad::CrashReportDatabase::Initialize(database_path).release(); @@ -275,6 +286,14 @@ void RequestSingleCrashUpload(const std::string& local_id) { #endif } +base::FilePath GetCrashpadDatabasePath() { +#if defined(OS_WIN) + return base::FilePath(GetCrashpadDatabasePath_ExportThunk()); +#else + return base::FilePath(GetCrashpadDatabasePathImpl()); +#endif +} + void GetReportsImpl(std::vector* reports) { reports->clear(); @@ -343,4 +362,11 @@ void RequestSingleCrashUploadImpl(const std::string& local_id) { g_database->RequestUpload(uuid); } +base::FilePath::StringType::const_pointer GetCrashpadDatabasePathImpl() { + if (!g_database_path) + return nullptr; + + return g_database_path->value().c_str(); +} + } // namespace crash_reporter diff --git a/components/crash/content/app/crashpad.h b/components/crash/content/app/crashpad.h index b77e1cc88d5f48..e47748158932ad 100644 --- a/components/crash/content/app/crashpad.h +++ b/components/crash/content/app/crashpad.h @@ -114,12 +114,18 @@ void RequestSingleCrashUpload(const std::string& local_id); void DumpWithoutCrashing(); +// Returns the Crashpad database path, only valid in the browser. +base::FilePath GetCrashpadDatabasePath(); + // The implementation function for GetReports. void GetReportsImpl(std::vector* reports); // The implementation function for RequestSingleCrashUpload. void RequestSingleCrashUploadImpl(const std::string& local_id); +// The implementation function for GetCrashpadDatabasePath. +base::FilePath::StringType::const_pointer GetCrashpadDatabasePathImpl(); + namespace internal { #if defined(OS_WIN)