Index: third_party/breakpad/src/client/windows/crash_generation/minidump_generator.cc |
diff --git a/third_party/breakpad/src/client/windows/crash_generation/minidump_generator.cc b/third_party/breakpad/src/client/windows/crash_generation/minidump_generator.cc |
deleted file mode 100644 |
index 37bd55e45ebeb50c5d37d8b2e91330599116b466..0000000000000000000000000000000000000000 |
--- a/third_party/breakpad/src/client/windows/crash_generation/minidump_generator.cc |
+++ /dev/null |
@@ -1,309 +0,0 @@ |
-// Copyright (c) 2008, Google Inc. |
-// All rights reserved. |
-// |
-// Redistribution and use in source and binary forms, with or without |
-// modification, are permitted provided that the following conditions are |
-// met: |
-// |
-// * Redistributions of source code must retain the above copyright |
-// notice, this list of conditions and the following disclaimer. |
-// * Redistributions in binary form must reproduce the above |
-// copyright notice, this list of conditions and the following disclaimer |
-// in the documentation and/or other materials provided with the |
-// distribution. |
-// * Neither the name of Google Inc. nor the names of its |
-// contributors may be used to endorse or promote products derived from |
-// this software without specific prior written permission. |
-// |
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- |
-#include "client/windows/crash_generation/minidump_generator.h" |
-#include <cassert> |
-#include "client/windows/common/auto_critical_section.h" |
-#include "common/windows/guid_string.h" |
- |
-using std::wstring; |
- |
-namespace google_breakpad { |
- |
-MinidumpGenerator::MinidumpGenerator(const wstring& dump_path) |
- : dbghelp_module_(NULL), |
- rpcrt4_module_(NULL), |
- dump_path_(dump_path), |
- write_dump_(NULL), |
- create_uuid_(NULL) { |
- InitializeCriticalSection(&module_load_sync_); |
- InitializeCriticalSection(&get_proc_address_sync_); |
-} |
- |
-MinidumpGenerator::~MinidumpGenerator() { |
- if (dbghelp_module_) { |
- FreeLibrary(dbghelp_module_); |
- } |
- |
- if (rpcrt4_module_) { |
- FreeLibrary(rpcrt4_module_); |
- } |
- |
- DeleteCriticalSection(&get_proc_address_sync_); |
- DeleteCriticalSection(&module_load_sync_); |
-} |
- |
-bool MinidumpGenerator::WriteMinidump(HANDLE process_handle, |
- DWORD process_id, |
- DWORD thread_id, |
- DWORD requesting_thread_id, |
- EXCEPTION_POINTERS* exception_pointers, |
- MDRawAssertionInfo* assert_info, |
- MINIDUMP_TYPE dump_type, |
- bool is_client_pointers, |
- wstring* dump_path) { |
- // Just call the full WriteMinidump with NULL as the full_dump_path. |
- return this->WriteMinidump(process_handle, process_id, thread_id, |
- requesting_thread_id, exception_pointers, |
- assert_info, dump_type, is_client_pointers, |
- dump_path, NULL); |
-} |
- |
-bool MinidumpGenerator::WriteMinidump(HANDLE process_handle, |
- DWORD process_id, |
- DWORD thread_id, |
- DWORD requesting_thread_id, |
- EXCEPTION_POINTERS* exception_pointers, |
- MDRawAssertionInfo* assert_info, |
- MINIDUMP_TYPE dump_type, |
- bool is_client_pointers, |
- wstring* dump_path, |
- wstring* full_dump_path) { |
- MiniDumpWriteDumpType write_dump = GetWriteDump(); |
- if (!write_dump) { |
- return false; |
- } |
- |
- wstring dump_file_path; |
- if (!GenerateDumpFilePath(&dump_file_path)) { |
- return false; |
- } |
- |
- // If the client requests a full memory dump, we will write a normal mini |
- // dump and a full memory dump. Both dump files use the same uuid as file |
- // name prefix. |
- bool full_memory_dump = (dump_type & MiniDumpWithFullMemory) != 0; |
- wstring full_dump_file_path; |
- if (full_memory_dump) { |
- full_dump_file_path.assign(dump_file_path); |
- full_dump_file_path.resize(full_dump_file_path.size() - 4); // strip .dmp |
- full_dump_file_path.append(TEXT("-full.dmp")); |
- } |
- |
- HANDLE dump_file = CreateFile(dump_file_path.c_str(), |
- GENERIC_WRITE, |
- 0, |
- NULL, |
- CREATE_NEW, |
- FILE_ATTRIBUTE_NORMAL, |
- NULL); |
- |
- if (dump_file == INVALID_HANDLE_VALUE) { |
- return false; |
- } |
- |
- HANDLE full_dump_file = INVALID_HANDLE_VALUE; |
- if (full_memory_dump) { |
- full_dump_file = CreateFile(full_dump_file_path.c_str(), |
- GENERIC_WRITE, |
- 0, |
- NULL, |
- CREATE_NEW, |
- FILE_ATTRIBUTE_NORMAL, |
- NULL); |
- |
- if (full_dump_file == INVALID_HANDLE_VALUE) { |
- CloseHandle(dump_file); |
- return false; |
- } |
- } |
- |
- MINIDUMP_EXCEPTION_INFORMATION* dump_exception_pointers = NULL; |
- MINIDUMP_EXCEPTION_INFORMATION dump_exception_info; |
- |
- // Setup the exception information object only if it's a dump |
- // due to an exception. |
- if (exception_pointers) { |
- dump_exception_pointers = &dump_exception_info; |
- dump_exception_info.ThreadId = thread_id; |
- dump_exception_info.ExceptionPointers = exception_pointers; |
- dump_exception_info.ClientPointers = is_client_pointers; |
- } |
- |
- // Add an MDRawBreakpadInfo stream to the minidump, to provide additional |
- // information about the exception handler to the Breakpad processor. |
- // The information will help the processor determine which threads are |
- // relevant. The Breakpad processor does not require this information but |
- // can function better with Breakpad-generated dumps when it is present. |
- // The native debugger is not harmed by the presence of this information. |
- MDRawBreakpadInfo breakpad_info = {0}; |
- if (!is_client_pointers) { |
- // Set the dump thread id and requesting thread id only in case of |
- // in-process dump generation. |
- breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | |
- MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; |
- breakpad_info.dump_thread_id = thread_id; |
- breakpad_info.requesting_thread_id = requesting_thread_id; |
- } |
- |
- // Leave room in user_stream_array for a possible assertion info stream. |
- MINIDUMP_USER_STREAM user_stream_array[2]; |
- user_stream_array[0].Type = MD_BREAKPAD_INFO_STREAM; |
- user_stream_array[0].BufferSize = sizeof(breakpad_info); |
- user_stream_array[0].Buffer = &breakpad_info; |
- |
- MINIDUMP_USER_STREAM_INFORMATION user_streams; |
- user_streams.UserStreamCount = 1; |
- user_streams.UserStreamArray = user_stream_array; |
- |
- MDRawAssertionInfo* actual_assert_info = assert_info; |
- MDRawAssertionInfo client_assert_info = {0}; |
- |
- if (assert_info) { |
- // If the assertion info object lives in the client process, |
- // read the memory of the client process. |
- if (is_client_pointers) { |
- SIZE_T bytes_read = 0; |
- if (!ReadProcessMemory(process_handle, |
- assert_info, |
- &client_assert_info, |
- sizeof(client_assert_info), |
- &bytes_read)) { |
- CloseHandle(dump_file); |
- if (full_dump_file != INVALID_HANDLE_VALUE) |
- CloseHandle(full_dump_file); |
- return false; |
- } |
- |
- if (bytes_read != sizeof(client_assert_info)) { |
- CloseHandle(dump_file); |
- if (full_dump_file != INVALID_HANDLE_VALUE) |
- CloseHandle(full_dump_file); |
- return false; |
- } |
- |
- actual_assert_info = &client_assert_info; |
- } |
- |
- user_stream_array[1].Type = MD_ASSERTION_INFO_STREAM; |
- user_stream_array[1].BufferSize = sizeof(MDRawAssertionInfo); |
- user_stream_array[1].Buffer = actual_assert_info; |
- ++user_streams.UserStreamCount; |
- } |
- |
- bool result_minidump = write_dump( |
- process_handle, |
- process_id, |
- dump_file, |
- static_cast<MINIDUMP_TYPE>((dump_type & (~MiniDumpWithFullMemory)) |
- | MiniDumpNormal), |
- exception_pointers ? &dump_exception_info : NULL, |
- &user_streams, |
- NULL) != FALSE; |
- |
- bool result_full_memory = true; |
- if (full_memory_dump) { |
- result_full_memory = write_dump( |
- process_handle, |
- process_id, |
- full_dump_file, |
- static_cast<MINIDUMP_TYPE>(dump_type & (~MiniDumpNormal)), |
- exception_pointers ? &dump_exception_info : NULL, |
- &user_streams, |
- NULL) != FALSE; |
- } |
- |
- bool result = result_minidump && result_full_memory; |
- |
- CloseHandle(dump_file); |
- if (full_dump_file != INVALID_HANDLE_VALUE) |
- CloseHandle(full_dump_file); |
- |
- // Store the path of the dump file in the out parameter if dump generation |
- // succeeded. |
- if (result && dump_path) { |
- *dump_path = dump_file_path; |
- } |
- if (result && full_memory_dump && full_dump_path) { |
- *full_dump_path = full_dump_file_path; |
- } |
- |
- return result; |
-} |
- |
-HMODULE MinidumpGenerator::GetDbghelpModule() { |
- AutoCriticalSection lock(&module_load_sync_); |
- if (!dbghelp_module_) { |
- dbghelp_module_ = LoadLibrary(TEXT("dbghelp.dll")); |
- } |
- |
- return dbghelp_module_; |
-} |
- |
-MinidumpGenerator::MiniDumpWriteDumpType MinidumpGenerator::GetWriteDump() { |
- AutoCriticalSection lock(&get_proc_address_sync_); |
- if (!write_dump_) { |
- HMODULE module = GetDbghelpModule(); |
- if (module) { |
- FARPROC proc = GetProcAddress(module, "MiniDumpWriteDump"); |
- write_dump_ = reinterpret_cast<MiniDumpWriteDumpType>(proc); |
- } |
- } |
- |
- return write_dump_; |
-} |
- |
-HMODULE MinidumpGenerator::GetRpcrt4Module() { |
- AutoCriticalSection lock(&module_load_sync_); |
- if (!rpcrt4_module_) { |
- rpcrt4_module_ = LoadLibrary(TEXT("rpcrt4.dll")); |
- } |
- |
- return rpcrt4_module_; |
-} |
- |
-MinidumpGenerator::UuidCreateType MinidumpGenerator::GetCreateUuid() { |
- AutoCriticalSection lock(&module_load_sync_); |
- if (!create_uuid_) { |
- HMODULE module = GetRpcrt4Module(); |
- if (module) { |
- FARPROC proc = GetProcAddress(module, "UuidCreate"); |
- create_uuid_ = reinterpret_cast<UuidCreateType>(proc); |
- } |
- } |
- |
- return create_uuid_; |
-} |
- |
-bool MinidumpGenerator::GenerateDumpFilePath(wstring* file_path) { |
- UUID id = {0}; |
- |
- UuidCreateType create_uuid = GetCreateUuid(); |
- if (!create_uuid) { |
- return false; |
- } |
- |
- create_uuid(&id); |
- wstring id_str = GUIDString::GUIDToWString(&id); |
- |
- *file_path = dump_path_ + TEXT("\\") + id_str + TEXT(".dmp"); |
- return true; |
-} |
- |
-} // namespace google_breakpad |