* minidumper.cc (filter_minidump_type): New function.
(minidump): Change default dump type from MiniDumpNormal to something with more useful information without getting too big. Use filter_minidump_type() to filter out unsupported dump types.
This commit is contained in:
parent
8f8e7757cf
commit
2915feb81e
|
@ -1,3 +1,11 @@
|
|||
2014-04-21 Jon TURNEY <jon.turney@dronecode.org.uk>
|
||||
|
||||
* minidumper.cc (filter_minidump_type): New function.
|
||||
(minidump): Change default dump type from MiniDumpNormal to
|
||||
something with more useful information without getting too
|
||||
big. Use filter_minidump_type() to filter out unsupported dump
|
||||
types.
|
||||
|
||||
2014-04-21 Jon TURNEY <jon.turney@dronecode.org.uk>
|
||||
|
||||
* Makefile.in (minidumper.exe): Link directly with dbghelp.
|
||||
|
|
|
@ -28,9 +28,57 @@
|
|||
#include <windows.h>
|
||||
#include <dbghelp.h>
|
||||
|
||||
DEFINE_ENUM_FLAG_OPERATORS(MINIDUMP_TYPE);
|
||||
|
||||
BOOL verbose = FALSE;
|
||||
BOOL nokill = FALSE;
|
||||
|
||||
/* Not yet in dbghelp.h */
|
||||
#define MiniDumpWithModuleHeaders (static_cast<MINIDUMP_TYPE>(0x00080000))
|
||||
#define MiniDumpFilterTriage (static_cast<MINIDUMP_TYPE>(0x00100000))
|
||||
|
||||
static MINIDUMP_TYPE
|
||||
filter_minidump_type(MINIDUMP_TYPE dump_type)
|
||||
{
|
||||
API_VERSION build_version = { 6, 0, API_VERSION_NUMBER, 0 };
|
||||
API_VERSION *v = ImagehlpApiVersionEx(&build_version);
|
||||
|
||||
if (verbose)
|
||||
printf ("dbghelp version %d.%d.%d.%d\n", v->MajorVersion,
|
||||
v->MinorVersion, v->Revision, v->Reserved);
|
||||
|
||||
MINIDUMP_TYPE supported_types = MiniDumpNormal | MiniDumpWithDataSegs
|
||||
| MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpFilterMemory
|
||||
| MiniDumpScanMemory;
|
||||
|
||||
/*
|
||||
This mainly trial and error and guesswork, as the MSDN documentation only
|
||||
says what version of "Debugging Tools for Windows" added these flags, but
|
||||
doesn't actually tell us the dbghelp.dll version which was contained in that
|
||||
(and seems to have errors as well)
|
||||
*/
|
||||
|
||||
if (v->MajorVersion >= 5)
|
||||
supported_types |= MiniDumpWithUnloadedModules
|
||||
| MiniDumpWithIndirectlyReferencedMemory | MiniDumpFilterModulePaths
|
||||
| MiniDumpWithProcessThreadData | MiniDumpWithPrivateReadWriteMemory;
|
||||
|
||||
if (v->MajorVersion >= 6)
|
||||
supported_types |= MiniDumpWithoutOptionalData | MiniDumpWithFullMemoryInfo
|
||||
| MiniDumpWithThreadInfo | MiniDumpWithCodeSegs
|
||||
| MiniDumpWithoutAuxiliaryState | MiniDumpWithFullAuxiliaryState // seems to be documentation error that these two aren't listed as 'Not supported prior to 6.1'
|
||||
| MiniDumpWithPrivateWriteCopyMemory | MiniDumpIgnoreInaccessibleMemory
|
||||
| MiniDumpWithTokenInformation;
|
||||
|
||||
if ((v->MajorVersion*10 + v->MinorVersion) >= 62)
|
||||
supported_types |= MiniDumpWithModuleHeaders | MiniDumpFilterTriage; // seems to be documentation error that these two are listed as 'Not supported prior to 6.1'
|
||||
|
||||
if (verbose)
|
||||
printf ("supported MINIDUMP_TYPE flags 0x%x\n", supported_types);
|
||||
|
||||
return (dump_type & supported_types);
|
||||
}
|
||||
|
||||
static void
|
||||
minidump(DWORD pid, MINIDUMP_TYPE dump_type, const char *minidump_file)
|
||||
{
|
||||
|
@ -137,6 +185,7 @@ main (int argc, char **argv)
|
|||
int opt;
|
||||
const char *p = "";
|
||||
DWORD pid;
|
||||
BOOL default_dump_type = TRUE;
|
||||
MINIDUMP_TYPE dump_type = MiniDumpNormal;
|
||||
|
||||
while ((opt = getopt_long (argc, argv, opts, longopts, NULL) ) != EOF)
|
||||
|
@ -145,6 +194,7 @@ main (int argc, char **argv)
|
|||
case 't':
|
||||
{
|
||||
char *endptr;
|
||||
default_dump_type = FALSE;
|
||||
dump_type = (MINIDUMP_TYPE)strtoul(optarg, &endptr, 0);
|
||||
if (*endptr != '\0')
|
||||
{
|
||||
|
@ -201,6 +251,21 @@ main (int argc, char **argv)
|
|||
}
|
||||
sprintf (minidump_file, "%s.dmp", p);
|
||||
|
||||
if (default_dump_type)
|
||||
{
|
||||
dump_type = MiniDumpWithHandleData | MiniDumpWithFullMemoryInfo
|
||||
| MiniDumpWithThreadInfo | MiniDumpWithFullAuxiliaryState
|
||||
| MiniDumpIgnoreInaccessibleMemory | MiniDumpWithTokenInformation
|
||||
| MiniDumpWithIndirectlyReferencedMemory;
|
||||
|
||||
/*
|
||||
Only filter out unsupported dump_type flags if we are using the default
|
||||
dump type, so that future dump_type flags can be explicitly used even if
|
||||
we don't know about them
|
||||
*/
|
||||
dump_type = filter_minidump_type(dump_type);
|
||||
}
|
||||
|
||||
if (verbose)
|
||||
printf ("dumping process %u to %s using dump type flags 0x%x\n", (unsigned int)pid, minidump_file, (unsigned int)dump_type);
|
||||
|
||||
|
|
Loading…
Reference in New Issue