Generate Windows full memory dumps as a separate file. Patch by Huan Ren

<huanr@google.com>.  r=me


git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@285 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
mmentovai 2008-09-16 18:50:02 +00:00
parent 9fcf4db315
commit a509f4ec4b

View file

@ -78,6 +78,17 @@ bool MinidumpGenerator::WriteMinidump(HANDLE process_handle,
return false; 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;
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(), HANDLE dump_file = CreateFile(dump_file_path.c_str(),
GENERIC_WRITE, GENERIC_WRITE,
0, 0,
@ -90,6 +101,22 @@ bool MinidumpGenerator::WriteMinidump(HANDLE process_handle,
return false; 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_pointers = NULL;
MINIDUMP_EXCEPTION_INFORMATION dump_exception_info; MINIDUMP_EXCEPTION_INFORMATION dump_exception_info;
@ -142,11 +169,15 @@ bool MinidumpGenerator::WriteMinidump(HANDLE process_handle,
sizeof(client_assert_info), sizeof(client_assert_info),
&bytes_read)) { &bytes_read)) {
CloseHandle(dump_file); CloseHandle(dump_file);
if (full_dump_file != INVALID_HANDLE_VALUE)
CloseHandle(full_dump_file);
return false; return false;
} }
if (bytes_read != sizeof(client_assert_info)) { if (bytes_read != sizeof(client_assert_info)) {
CloseHandle(dump_file); CloseHandle(dump_file);
if (full_dump_file != INVALID_HANDLE_VALUE)
CloseHandle(full_dump_file);
return false; return false;
} }
@ -159,15 +190,33 @@ bool MinidumpGenerator::WriteMinidump(HANDLE process_handle,
++user_streams.UserStreamCount; ++user_streams.UserStreamCount;
} }
bool result = write_dump(process_handle, bool result_minidump = write_dump(
process_id, process_handle,
dump_file, process_id,
dump_type, dump_file,
exception_pointers ? &dump_exception_info : NULL, static_cast<MINIDUMP_TYPE>((dump_type & (~MiniDumpWithFullMemory))
&user_streams, | MiniDumpNormal),
NULL) != FALSE; 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); 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 // Store the path of the dump file in the out parameter if dump generation
// succeeded. // succeeded.