Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 The Crashpad Authors. All rights reserved. | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 | |
| 15 #ifndef CRASHPAD_COMPAT_NON_WIN_DBGHELP_H_ | |
| 16 #define CRASHPAD_COMPAT_NON_WIN_DBGHELP_H_ | |
| 17 | |
| 18 #include <stdint.h> | |
| 19 | |
| 20 #include "base/strings/string16.h" | |
| 21 #include "compat/non_win/timezoneapi.h" | |
| 22 #include "compat/non_win/verrsrc.h" | |
| 23 #include "compat/non_win/winnt.h" | |
| 24 | |
| 25 //! \file | |
|
Robert Sesek
2014/07/31 16:55:41
Not sure you need a file-level comment here, if no
Mark Mentovai
2014/07/31 17:06:54
rsesek wrote:
| |
| 26 | |
| 27 //! \brief The magic number for a minidump file, stored in | |
| 28 //! MINIDUMP_HEADER::Signature. | |
| 29 //! | |
| 30 //! A hex dump of a little-endian minidump file will begin with the string | |
| 31 //! “MDMP”. | |
| 32 #define MINIDUMP_SIGNATURE ('PMDM') // 0x4d444d50 | |
| 33 | |
| 34 //! \brief The version of a minidump file, stored in MINIDUMP_HEADER::Version. | |
| 35 #define MINIDUMP_VERSION (42899) | |
| 36 | |
| 37 //! \brief An offset within a minidump file, relative to the start of its | |
| 38 //! MINIDUMP_HEADER. | |
| 39 //! | |
| 40 //! RVA stands for “relative virtual address”. Within a minidump file, RVAs are | |
| 41 //! used as pointers to link structures together. | |
| 42 //! | |
| 43 //! \sa MINIDUMP_LOCATION_DESCRIPTOR | |
| 44 typedef uint32_t RVA; | |
| 45 | |
| 46 //! \brief A pointer to a structure or union within a minidump file. | |
| 47 struct __attribute__((packed, aligned(4))) MINIDUMP_LOCATION_DESCRIPTOR { | |
| 48 //! \brief The size of the referenced structure or union, in bytes. | |
| 49 uint32_t DataSize; | |
| 50 | |
| 51 //! \brief The relative virtual address of the structure or union within the | |
| 52 //! minidump file. | |
| 53 RVA Rva; | |
| 54 }; | |
| 55 | |
| 56 //! \brief A pointer to a snapshot of a region of memory contained within a | |
| 57 //! minidump file. | |
| 58 //! | |
| 59 //! \sa MINIDUMP_MEMORY_LIST | |
| 60 struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_DESCRIPTOR { | |
| 61 //! \brief The base address of the memory region in the address space of the | |
| 62 //! process that the minidump file contains a snapshot of. | |
| 63 uint64_t StartOfMemoryRange; | |
| 64 | |
| 65 //! \brief The contents of the memory region. | |
| 66 MINIDUMP_LOCATION_DESCRIPTOR Memory; | |
| 67 }; | |
| 68 | |
| 69 //! \brief The top-level structure identifying a minidump file. | |
| 70 //! | |
| 71 //! This structure contains a pointer to the stream directory, a second-level | |
| 72 //! structure which in turn contains pointers to third-level structures | |
| 73 //! (“streams”) containing the data within the minidump file. This structure | |
| 74 //! also contains the minidump file’s magic numbers, and other bookkeeping data. | |
| 75 //! | |
| 76 //! This structure must be present at the beginning of a minidump file (at ::RVA | |
|
Robert Sesek
2014/07/31 16:55:41
Does Doxygen do something special to ::RVA, or is
Mark Mentovai
2014/07/31 17:06:54
rsesek wrote:
Robert Sesek
2014/07/31 17:25:36
Got it, I thought that might be the case.
| |
| 77 //! 0). | |
| 78 struct __attribute__((packed, aligned(4))) MINIDUMP_HEADER { | |
| 79 //! \brief The minidump file format magic number, ::MINIDUMP_SIGNATURE. | |
| 80 uint32_t Signature; | |
| 81 | |
| 82 //! \brief The minidump file format version number, ::MINIDUMP_VERSION. | |
| 83 uint32_t Version; | |
| 84 | |
| 85 //! \brief The number of MINIDUMP_DIRECTORY elements present in the directory | |
| 86 //! referenced by #StreamDirectoryRva. | |
| 87 uint32_t NumberOfStreams; | |
| 88 | |
| 89 //! \brief A pointer to an array of MINIDUMP_DIRECTORY structures that | |
| 90 //! identify all of the streams within this minidump file. The array has | |
| 91 //! #NumberOfStreams elements present. | |
| 92 RVA StreamDirectoryRva; | |
| 93 | |
| 94 //! \brief The minidump file’s checksum. This can be `0`, and in practice, `0` | |
| 95 //! is the only value that has ever been seen in this field. | |
| 96 uint32_t CheckSum; | |
| 97 | |
| 98 //! \brief The time that the minidump file was generated, in `time_t` format, | |
| 99 //! the number of seconds since the POSIX epoch. | |
| 100 uint32_t TimeDateStamp; | |
| 101 | |
| 102 //! \brief A bitfield containing members of ::MINIDUMP_TYPE, describing the | |
| 103 //! types of data carried within this minidump file. | |
| 104 uint64_t Flags; | |
| 105 }; | |
| 106 | |
| 107 //! \brief A pointer to a stream within a minidump file. | |
| 108 //! | |
| 109 //! Each stream present in a minidump file will have a corresponding | |
| 110 //! MINIDUMP_DIRECTORY entry in the stream directory referenced by | |
| 111 //! MINIDUMP_HEADER::StreamDirectoryRva. | |
| 112 struct __attribute__((packed, aligned(4))) MINIDUMP_DIRECTORY { | |
| 113 //! \brief The type of stream referenced, a value of ::MINIDUMP_STREAM_TYPE. | |
| 114 uint32_t StreamType; | |
| 115 | |
| 116 //! \brief A pointer to the stream data within the minidump file. | |
| 117 MINIDUMP_LOCATION_DESCRIPTOR Location; | |
| 118 }; | |
| 119 | |
| 120 //! \brief A variable-length UTF-16-encoded string carried within a minidump | |
|
Robert Sesek
2014/07/31 16:55:41
UTF-16 LE or BE, or is it the same as the minidump
| |
| 121 //! file. | |
| 122 //! | |
| 123 //! \sa crashpad::MinidumpUTF8String | |
| 124 struct __attribute__((packed, aligned(4))) MINIDUMP_STRING { | |
| 125 //! \brief The length of the #Buffer field in bytes, not including the `NUL` | |
| 126 //! terminator. | |
| 127 //! | |
| 128 //! \note This field is interpreted as a byte count, not a count of UTF-16 | |
| 129 //! code units or Unicode code points. | |
| 130 uint32_t Length; | |
| 131 | |
| 132 //! \brief The string, encoded in UTF-16, and terminated with a UTF-16 `NUL` | |
| 133 //! code unit (two `NUL` bytes). | |
| 134 char16 Buffer[0]; | |
| 135 }; | |
| 136 | |
| 137 //! \brief Minidump stream type values for MINIDUMP_DIRECTORY::StreamType. Each | |
| 138 //! stream structure has a corresponding stream type value to identify it. | |
| 139 //! | |
| 140 //! \sa crashpad::MinidumpStreamType | |
| 141 enum MINIDUMP_STREAM_TYPE { | |
| 142 //! \brief The stream type for MINIDUMP_THREAD_LIST. | |
| 143 ThreadListStream = 3, | |
| 144 | |
| 145 //! \brief The stream type for MINIDUMP_MODULE_LIST. | |
| 146 ModuleListStream = 4, | |
| 147 | |
| 148 //! \brief The stream type for MINIDUMP_MEMORY_LIST. | |
| 149 MemoryListStream = 5, | |
| 150 | |
| 151 //! \brief The stream type for MINIDUMP_EXCEPTION_STREAM. | |
| 152 ExceptionStream = 6, | |
| 153 | |
| 154 //! \brief The stream type for MINIDUMP_SYSTEM_INFO. | |
| 155 SystemInfoStream = 7, | |
| 156 | |
| 157 //! \brief The stream type for MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2, | |
| 158 //! MINIDUMP_MISC_INFO_3, and MINIDUMP_MISC_INFO_4. | |
| 159 //! | |
| 160 //! More recent versions of this stream are supersets of earlier versions. | |
| 161 //! | |
| 162 //! The exact version of the stream that is present is implied by the stream’s | |
| 163 //! size. Furthermore, this stream contains a field, | |
| 164 //! MINIDUMP_MISC_INFO_STREAM::Flags1, that indicates which data is present | |
| 165 //! and valid. | |
| 166 MiscInfoStream = 15, | |
| 167 }; | |
| 168 | |
| 169 //! \brief Information about the CPU (or CPUs) that ran the process that the | |
| 170 //! minidump file contains a snapshot of. | |
| 171 //! | |
| 172 //! This union only appears as MINIDUMP_SYSTEM_INFO::Cpu. Its interpretation is | |
| 173 //! controlled by MINIDUMP_SYSTEM_INFO::ProcessorArchitecture. | |
| 174 union __attribute__((packed, aligned(4))) CPU_INFORMATION { | |
| 175 //! \brief Information about 32-bit x86 CPUs, or x86_64 CPUs when running | |
| 176 //! 32-bit x86 processes. | |
| 177 struct __attribute__((packed, aligned(4))) { | |
| 178 //! \brief The CPU’s vendor identification string as encoded in `cpuid 0` | |
| 179 //! `ebx`, `edx`, and `ecx`, represented as it appears in these | |
| 180 //! registers. | |
| 181 //! | |
| 182 //! For Intel CPUs, `[0]` will encode “Genu”, `[1]` will encode “ineI”, and | |
| 183 //! `[2]` will encode “ntel”, for a vendor ID string “GenuineIntel”. | |
| 184 //! | |
| 185 //! \note The Windows documentation incorrectly states that these fields are | |
| 186 //! to be interpreted as `cpuid 0` `eax`, `ebx`, and `ecx`. | |
| 187 uint32_t VendorId[3]; | |
| 188 | |
| 189 //! \brief Family, model, and stepping ID values as encoded in `cpuid 1` | |
| 190 //! `eax`. | |
| 191 uint32_t VersionInformation; | |
| 192 | |
| 193 //! \brief A bitfield containing supported CPU capabilities as encoded in | |
| 194 //! `cpuid 1` `edx`. | |
| 195 uint32_t FeatureInformation; | |
| 196 | |
| 197 //! \brief A bitfield containing supported CPU capabalities as encoded in | |
| 198 //! `cpuid 0x80000001` `edx`. | |
| 199 //! | |
| 200 //! This field is only valid if #VendorId identifies the CPU vendor as | |
| 201 //! “AuthenticAMD”. | |
| 202 uint32_t AMDExtendedCpuFeatures; | |
| 203 } X86CpuInfo; | |
| 204 | |
| 205 //! \brief Information about non-x86 CPUs, and x86_64 CPUs when not running | |
| 206 //! 32-bit x86 processes. | |
| 207 struct __attribute__((packed, aligned(4))) { | |
| 208 //! \brief Bitfields containing supported CPU capabilities as identified by | |
| 209 //! bits corresponding to `PF_*` values passed to | |
| 210 //! `IsProcessorFeaturePresent()`. | |
| 211 uint64_t ProcessorFeatures[2]; | |
| 212 } OtherCpuInfo; | |
| 213 }; | |
| 214 | |
| 215 //! \brief Information about the system that hosted the process that the | |
| 216 //! minidump file contains a snapshot of. | |
| 217 struct __attribute__((packed, aligned(4))) MINIDUMP_SYSTEM_INFO { | |
| 218 // The next 4 fields are from the SYSTEM_INFO structure returned by | |
| 219 // GetSystemInfo(). | |
| 220 | |
| 221 //! \brief The system’s CPU architecture. This may be a \ref | |
| 222 //! PROCESSOR_ARCHITECTURE_x "PROCESSOR_ARCHITECTURE_*" value, or a member | |
| 223 //! of crashpad::MinidumpCPUArchitecture. | |
| 224 //! | |
| 225 //! In some cases, a system may be able to run processes of multiple specific | |
| 226 //! architecture types. For example, systems based on 64-bit architectures | |
| 227 //! such as x86_64 are often able to run 32-bit code of another architecture | |
| 228 //! in the same family, such as 32-bit x86. On these systems, this field will | |
| 229 //! identify the architecture of the process that the minidump file contains a | |
| 230 //! snapshot of. | |
| 231 uint16_t ProcessorArchitecture; | |
| 232 | |
| 233 //! \brief General CPU version information. | |
| 234 //! | |
| 235 //! The precise interpretation of this field is specific to each CPU | |
| 236 //! architecture. For x86-family CPUs (including x86_64 and 32-bit x86), this | |
| 237 //! field contains the CPU family ID value from `cpuid 1` `eax`, adjusted to | |
| 238 //! take the extended family ID into account. | |
| 239 uint16_t ProcessorLevel; | |
| 240 | |
| 241 //! \brief Specific CPU version information. | |
| 242 //! | |
| 243 //! The precise interpretation of this field is specific to each CPU | |
| 244 //! architecture. For x86-family CPUs (including x86_64 and 32-bit x86), this | |
| 245 //! field contains values obtained from `cpuid 1` `eax`: the high byte | |
| 246 //! contains the CPU model ID value adjusted to take the extended model ID | |
| 247 //! into account, and the low byte contains the CPU stepping ID value. | |
| 248 uint16_t ProcessorRevision; | |
| 249 | |
| 250 //! \brief The total number of CPUs present in the system. | |
| 251 uint8_t NumberOfProcessors; | |
| 252 | |
| 253 // The next 7 fields are from the OSVERSIONINFOEX structure returned by | |
| 254 // GetVersionEx(). | |
| 255 | |
| 256 //! \brief The system’s operating system type, which distinguishes between | |
| 257 //! “desktop” or “workstation” systems and “server” systems. This may be a | |
| 258 //! \ref VER_NT_x "VER_NT_*" value, or a member of | |
| 259 //! crashpad::MinidumpOSType. | |
| 260 uint8_t ProductType; | |
| 261 | |
| 262 //! \brief The system’s operating system version number’s first (major) | |
| 263 //! component. | |
| 264 //! | |
| 265 //! - For Windows 7 (NT 6.1) SP1, version 6.1.7601, this would be `6`. | |
| 266 //! - For Mac OS X 10.9.2, this would be `10`. | |
| 267 uint32_t MajorVersion; | |
| 268 | |
| 269 //! \brief The system’s operating system version number’s second (minor) | |
| 270 //! component. | |
| 271 //! | |
| 272 //! - For Windows 7 (NT 6.1) SP1, version 6.1.7601, this would be `1`. | |
| 273 //! - For Mac OS X 10.9.2, this would be `9`. | |
| 274 uint32_t MinorVersion; | |
| 275 | |
| 276 //! \brief The system’s operating system version number’s third (build or | |
| 277 //! patch) component. | |
| 278 //! | |
| 279 //! - For Windows 7 (NT 6.1) SP1, version 6.1.7601, this would be `7601`. | |
| 280 //! - For Mac OS X 10.9.2, this would be `2`. | |
| 281 uint32_t BuildNumber; | |
| 282 | |
| 283 //! \brief The system’s operating system family. This may be a \ref | |
| 284 //! VER_PLATFORM_x "VER_PLATFORM_*" value, or a member of | |
| 285 //! crashpad::MinidumpOS. | |
| 286 uint32_t PlatformId; | |
| 287 | |
| 288 //! \brief ::RVA of a MINIDUMP_STRING containing operating system-specific | |
| 289 //! version information. | |
| 290 //! | |
| 291 //! This field further identifies an operating system version beyond its | |
| 292 //! version number fields. Historically, “CSD” stands for “corrective service | |
| 293 //! diskette.” | |
| 294 //! | |
| 295 //! - On Windows, this is the name of the installed operating system service | |
| 296 //! pack, such as “Service Pack 1”. If no service pack is installed, this | |
| 297 //! field references an empty string. | |
| 298 //! - On Mac OS X, this is the operating system build number from `sw_vers | |
| 299 //! -buildVersion`. For Mac OS X 10.9.2 on most hardware types, this would | |
| 300 //! be `13C64`. | |
| 301 //! - On Linux and other Unix-like systems, this is the kernel version from | |
| 302 //! `uname -srvm`, possibly with additional information appended. On | |
| 303 //! Android, the `ro.build.fingerprint` system property is appended. | |
| 304 RVA CSDVersionRva; | |
| 305 | |
| 306 //! \brief A bitfield identifying products installed on the system. This is | |
| 307 //! composed of \ref VER_SUITE_x "VER_SUITE_*" values. | |
| 308 //! | |
| 309 //! This field is Windows-specific, and has no meaning on other operating | |
| 310 //! systems. | |
| 311 uint16_t SuiteMask; | |
| 312 | |
| 313 uint16_t Reserved2; | |
| 314 | |
| 315 //! \brief Information about the system’s CPUs. | |
| 316 //! | |
| 317 //! This field is a union. Which of its members should be expressed is | |
| 318 //! controlled by the #ProcessorArchitecture field. If it is set to | |
| 319 //! crashpad::kMinidumpCPUArchitectureX86, the CPU_INFORMATION::X86CpuInfo | |
| 320 //! field is expressed. Otherwise, the CPU_INFORMATION::OtherCpuInfo field is | |
| 321 //! expressed. | |
| 322 //! | |
| 323 //! \note Older Breakpad implementations produce minidump files that express | |
| 324 //! CPU_INFORMATION::X86CpuInfo when #ProcessorArchitecture is set to | |
| 325 //! crashpad::kMinidumpCPUArchitectureAMD64. Minidump files produced by | |
| 326 //! `dbghelp.dll` on Windows express CPU_INFORMATION::OtherCpuInfo in this | |
| 327 //! case. | |
| 328 CPU_INFORMATION Cpu; | |
| 329 }; | |
| 330 | |
| 331 //! \brief Information about a specific thread within the process. | |
| 332 //! | |
| 333 //! \sa MINIDUMP_THREAD_LIST | |
| 334 struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD { | |
| 335 //! \brief The thread’s ID. This may be referenced by | |
| 336 //! MINIDUMP_EXCEPTION_STREAM::ThreadId. | |
| 337 uint32_t ThreadId; | |
| 338 | |
| 339 //! \brief The thread’s suspend count. | |
| 340 //! | |
| 341 //! This field will be `0` if the thread is schedulable (not suspended). | |
| 342 uint32_t SuspendCount; | |
| 343 | |
| 344 //! \brief The thread’s priority class. | |
| 345 //! | |
| 346 //! On Windows, this is a `*_PRIORITY_CLASS` value. `NORMAL_PRIORITY_CLASS` | |
| 347 //! has value `0x20`; higher priority classes have higher values. | |
| 348 uint32_t PriorityClass; | |
| 349 | |
| 350 //! \brief The thread’s priority level. | |
| 351 //! | |
| 352 //! On Windows, this is a `THREAD_PRIORITY_*` value. `THREAD_PRIORITY_NORMAL` | |
| 353 //! has value `0`; higher priorities have higher values, and lower priorities | |
| 354 //! have lower (negative) values. | |
| 355 uint32_t Priority; | |
| 356 | |
| 357 //! \brief The address of the thread’s thread environment block in the address | |
| 358 //! space of the process that the minidump file contains a snapshot of. | |
| 359 //! | |
| 360 //! The thread environment block contains thread-local data. | |
| 361 //! | |
| 362 //! A MINIDUMP_MEMORY_DESCRIPTOR may be present in the MINIDUMP_MEMORY_LIST | |
| 363 //! stream containing the thread-local data pointed to by this field. | |
| 364 uint64_t Teb; | |
| 365 | |
| 366 // \brief A snapshot of the thread’s stack. | |
| 367 // | |
| 368 // A MINIDUMP_MEMORY_DESCRIPTOR may be present in the MINIDUMP_MEMORY_LIST | |
| 369 // stream containing a pointer to the same memory range referenced by this | |
| 370 // field. | |
| 371 MINIDUMP_MEMORY_DESCRIPTOR Stack; | |
| 372 | |
| 373 //! \brief A pointer to a CPU-specific CONTEXT structure containing the | |
| 374 //! thread’s context at the time the snapshot was taken. | |
| 375 //! | |
| 376 //! If the minidump file was generated as a result of an exception taken on | |
| 377 //! this thread, this field may identify a different context than the | |
| 378 //! exception context. For these minidump files, a MINIDUMP_EXCEPTION_STREAM | |
| 379 //! stream will be present, and the context contained within that stream will | |
| 380 //! be the exception context. | |
| 381 //! | |
| 382 //! The interpretation of the context structure is dependent on the CPU | |
| 383 //! architecture identified by MINIDUMP_SYSTEM_INFO::ProcessorArchitecture. | |
| 384 //! For crashpad::kMinidumpCPUArchitectureX86, this will be | |
| 385 //! crashpad::MinidumpContextX86. For crashpad::kMinidumpCPUArchitectureAMD64, | |
| 386 //! this will be crashpad::MinidumpContextAMD64. | |
| 387 MINIDUMP_LOCATION_DESCRIPTOR ThreadContext; | |
| 388 }; | |
| 389 | |
| 390 //! \brief Information about all threads within the process. | |
| 391 struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD_LIST { | |
| 392 //! \brief The number of threads present in the #Threads array. | |
| 393 uint32_t NumberOfThreads; | |
| 394 | |
| 395 //! \brief Structures identifying each thread within the process. | |
| 396 MINIDUMP_THREAD Threads[0]; | |
| 397 }; | |
| 398 | |
| 399 //! \brief Information about an exception that occurred in the process. | |
| 400 struct __attribute__((packed, aligned(4))) MINIDUMP_EXCEPTION { | |
| 401 //! \brief The top-level exception code identifying the exception, in | |
| 402 //! operating system-specific values. | |
| 403 //! | |
| 404 //! For Mac OS X minidumps, this will be a value of | |
| 405 //! crashpad::MinidumpExceptionCodeMac, which corresponds to an `EXC_*` | |
| 406 //! exception type. `EXC_CRASH` will not appear here for exceptions processed | |
| 407 //! as `EXC_CRASH` when generated from another preceding exception: the | |
| 408 //! original exception code will appear instead. The exception type as it was | |
| 409 //! received will appear at index 0 of #ExceptionInformation. | |
| 410 //! | |
| 411 //! \note This field is named ExceptionCode, but what is known as the | |
| 412 //! “exception code” on Mac OS X/Mach is actually stored in the | |
| 413 //! #ExceptionFlags field of a minidump file. | |
| 414 //! | |
| 415 //! \todo Document the possible values by OS. There should be OS-specific | |
| 416 //! enums in minidump_extensions.h. | |
| 417 uint32_t ExceptionCode; | |
| 418 | |
| 419 //! \brief Additional exception flags that further identify the exception, in | |
| 420 //! operating system-specific values. | |
| 421 //! | |
| 422 //! For Mac OS X minidumps, this will be the value of the exception code at | |
| 423 //! index 0 as received by a Mach exception handler. For exception type | |
| 424 //! `EXC_CRASH` generated from another preceding exception, the original | |
| 425 //! exception code will appear here, not the code as received by the Mach | |
| 426 //! exception handler. The code as it was received will appear at index 1 of | |
| 427 //! #ExceptionInformation. | |
| 428 //! | |
| 429 //! \todo Document the possible values by OS. There should be OS-specific | |
| 430 //! enums in minidump_extensions.h. | |
| 431 uint32_t ExceptionFlags; | |
| 432 | |
| 433 //! \brief An address, in the address space of the process that this minidump | |
| 434 //! file contains a snapshot of, of another MINIDUMP_EXCEPTION. This field | |
| 435 //! is used for nested exceptions. | |
| 436 uint64_t ExceptionRecord; | |
| 437 | |
| 438 //! \brief The address that caused the exception. | |
| 439 //! | |
| 440 //! This may be the address that caused a fault on data access, or it may be | |
| 441 //! the instruction pointer that contained an offending instruction. | |
| 442 uint64_t ExceptionAddress; | |
| 443 | |
| 444 //! \brief The number of valid elements in #ExceptionInformation. | |
| 445 uint32_t NumberParameters; | |
| 446 | |
| 447 uint32_t __unusedAlignment; | |
| 448 | |
| 449 //! \brief Additional information about the exception, specific to the | |
| 450 //! operating system and possibly the #ExceptionCode. | |
| 451 //! | |
| 452 //! For Mac OS X minidumps, this will contain the exception type as received | |
| 453 //! by a Mach exception handler and the values of the `codes[0]` and | |
| 454 //! `codes[1]` (exception code and subcode) parameters supplied to the Mach | |
| 455 //! exception handler. Unlike #ExceptionCode and #ExceptionFlags, the values | |
| 456 //! received by a Mach exception handler are used directly here even for the | |
| 457 //! `EXC_CRASH` exception type. | |
| 458 uint64_t ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; | |
| 459 }; | |
| 460 | |
| 461 //! \brief Information about the exception that triggered a minidump file’s | |
| 462 //! generation. | |
| 463 struct __attribute__((packed, aligned(4))) MINIDUMP_EXCEPTION_STREAM { | |
| 464 //! \brief The ID of the thread that caused the exception. | |
| 465 //! | |
| 466 //! \sa MINIDUMP_THREAD::ThreadId | |
| 467 uint32_t ThreadId; | |
| 468 | |
| 469 uint32_t __alignment; | |
| 470 | |
| 471 //! \brief Information about the exception. | |
| 472 MINIDUMP_EXCEPTION ExceptionRecord; | |
| 473 | |
| 474 //! \brief A pointer to a CPU-specific CONTEXT structure containing the | |
| 475 //! thread’s context at the time the exception was caused. | |
| 476 //! | |
| 477 //! The interpretation of the context structure is dependent on the CPU | |
| 478 //! architecture identified by MINIDUMP_SYSTEM_INFO::ProcessorArchitecture. | |
| 479 //! For crashpad::kMinidumpCPUArchitectureX86, this will be | |
| 480 //! crashpad::MinidumpContextX86. For crashpad::kMinidumpCPUArchitectureAMD64, | |
| 481 //! this will be crashpad::MinidumpContextAMD64. | |
| 482 MINIDUMP_LOCATION_DESCRIPTOR ThreadContext; | |
| 483 }; | |
| 484 | |
| 485 //! \brief Information about a specific module loaded within the process at the | |
| 486 //! time the snapshot was taken. | |
| 487 //! | |
| 488 //! A module may be the main executable, a shared library, or a loadable module. | |
| 489 //! | |
| 490 //! \sa MINIDUMP_MODULE_LIST | |
| 491 struct __attribute__((packed, aligned(4))) MINIDUMP_MODULE { | |
| 492 //! \brief The base address of the loaded module in the address space of the | |
| 493 //! process that the minidump file contains a snapshot of. | |
| 494 uint64_t BaseOfImage; | |
| 495 | |
| 496 //! \brief The size of the loaded module. | |
| 497 uint32_t SizeOfImage; | |
| 498 | |
| 499 //! \brief The loaded module’s checksum, or `0` if unknown. | |
| 500 //! | |
| 501 //! On Windows, this field comes from the `CheckSum` field of the module’s | |
| 502 //! `IMAGE_OPTIONAL_HEADER` structure, if present. It reflects the checksum at | |
| 503 //! the time the module was linked. | |
| 504 uint32_t CheckSum; | |
| 505 | |
| 506 //! \brief The module’s timestamp, in `time_t` units, seconds since the POSIX | |
| 507 //! epoch. | |
| 508 //! | |
| 509 //! On Windows, this field comes from the `TimeDateStamp` field of the | |
| 510 //! module’s `IMAGE_HEADER` structure. It reflects the timestamp at the time | |
| 511 //! the module was linked. | |
| 512 uint32_t TimeDateStamp; | |
| 513 | |
| 514 //! \brief ::RVA of a MINIDUMP_STRING containing the module’s path or file | |
| 515 //! name. | |
| 516 RVA ModuleNameRva; | |
| 517 | |
| 518 //! \brief The module’s version information. | |
| 519 VS_FIXEDFILEINFO VersionInfo; | |
| 520 | |
| 521 //! \brief A pointer to the module’s CodeView record, typically a link to its | |
| 522 //! debugging information in crashpad::MinidumpModuleCodeViewRecordPDB70 | |
| 523 //! format. | |
| 524 //! | |
| 525 //! The specific format of the CodeView record is indicated by its signature, | |
| 526 //! the first 32-bit value in the structure. For links to debugging | |
| 527 //! information in contemporary usage, this is normally a | |
| 528 //! crashpad::MinidumpModuleCodeViewRecordPDB70 structure, but may be a | |
| 529 //! crashpad::MinidumpModuleCodeViewRecordPDB20 structure instead. These | |
| 530 //! structures identify a link to debugging data within a `.pdb` (Program | |
| 531 //! Database) file. See <a | |
| 532 //! href="http://www.debuginfo.com/articles/debuginfomatch.html#pdbfiles">Matc hing | |
| 533 //! Debug Information</a>, PDB Files. | |
| 534 //! | |
| 535 //! On Windows, it is also possible for the CodeView record to contain | |
| 536 //! debugging information itself, as opposed to a link to a `.pdb` file. See | |
| 537 //! <a | |
| 538 //! href="http://pierrelib.pagesperso-orange.fr/exec_formats/MS_Symbol_Type_v1 .0.pdf#page=71">Microsoft | |
| 539 //! Symbol and Type Information</a>, section 7.2, “Debug Information Format” | |
| 540 //! for a list of debug information formats, and <a | |
| 541 //! href="http://undocumented.rawol.com/sbs-w2k-1-windows-2000-debugging-suppo rt.pdf#page=63">Undocumented | |
| 542 //! Windows 2000 Secrets</a>, Windows 2000 Debugging Support/Microsoft Symbol | |
| 543 //! File Internals/CodeView Subsections for an in-depth description of the | |
| 544 //! CodeView 4.1 format. Signatures seen in the wild include “NB09” | |
| 545 //! (0x3930424e) for CodeView 4.1 and “NB11” (0x3131424e) for CodeView 5.0. | |
| 546 //! This form of debugging information within the module, as opposed to a link | |
| 547 //! to an external `.pdb` file, is chosen by building with `/Z7`. | |
| 548 //! | |
| 549 //! On Windows, the CodeView record is taken from a module’s | |
| 550 //! IMAGE_DEBUG_DIRECTORY entry whose Type field has the value | |
| 551 //! IMAGE_DEBUG_TYPE_CODEVIEW (`2`), if any. Records in | |
| 552 //! crashpad::MinidumpModuleCodeViewRecordPDB70 format are generated by Visual | |
| 553 //! Studio .NET (2002) (version 7.0) and later. | |
| 554 //! | |
| 555 //! When the CodeView record is not present, the fields of this | |
| 556 //! MINIDUMP_LOCATION_DESCRIPTOR will be `0`. | |
| 557 MINIDUMP_LOCATION_DESCRIPTOR CvRecord; | |
| 558 | |
| 559 //! \brief A pointer to the module’s miscellaneous debugging record, a | |
| 560 //! structure of type IMAGE_DEBUG_MISC. | |
| 561 //! | |
| 562 //! This field is Windows-specific, and has no meaning on other operating | |
| 563 //! systems. It is largely obsolete on Windows, where it was used to link to | |
| 564 //! debugging information stored in a `.dbg` file. `.dbg` files have been | |
| 565 //! superseded by `.pdb` files. | |
| 566 //! | |
| 567 //! On Windows, the miscellaneous debugging record is taken from module’s | |
| 568 //! IMAGE_DEBUG_DIRECTORY entry whose Type field has the value | |
| 569 //! IMAGE_DEBUG_TYPE_MISC (`4`), if any. | |
| 570 //! | |
| 571 //! When the miscellaneous debugging record is not present, the fields of this | |
| 572 //! MINIDUMP_LOCATION_DESCRIPTOR will be `0`. | |
| 573 //! | |
| 574 //! \sa #CvRecord | |
| 575 MINIDUMP_LOCATION_DESCRIPTOR MiscRecord; | |
| 576 | |
| 577 uint64_t Reserved0; | |
| 578 uint64_t Reserved1; | |
| 579 }; | |
| 580 | |
| 581 //! \brief Information about all modules loaded within the process at the time | |
| 582 //! the snapshot was taken. | |
| 583 struct __attribute__((packed, aligned(4))) MINIDUMP_MODULE_LIST { | |
| 584 //! \brief The number of modules present in the #Modules array. | |
| 585 uint32_t NumberOfModules; | |
| 586 | |
| 587 //! \brief Structures identifying each module present in the minidump file. | |
| 588 MINIDUMP_MODULE Modules[0]; | |
| 589 }; | |
| 590 | |
| 591 //! \brief Information about memory regions within the process. | |
| 592 //! | |
| 593 //! Typically, a minidump file will not contain a snapshot of a process’ entire | |
| 594 //! memory image. For minidump files identified as ::MiniDumpNormal in | |
| 595 //! MINIDUMP_HEADER::Flags, memory regions are limited to those referenced by | |
| 596 //! MINIDUMP_THREAD::Stack fields, and a small number of others possibly related | |
| 597 //! to the exception that triggered the snapshot to be taken. | |
| 598 struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_LIST { | |
| 599 //! \brief The number of memory regions present in the #MemoryRanges array. | |
| 600 uint32_t NumberOfMemoryRanges; | |
| 601 | |
| 602 //! \brief Structures identifying each memory region present in the minidump | |
| 603 //! file. | |
| 604 MINIDUMP_MEMORY_DESCRIPTOR MemoryRanges[0]; | |
| 605 }; | |
| 606 | |
| 607 //! \anchor MINIDUMP_MISCx | |
| 608 //! \name MINIDUMP_MISC* | |
| 609 //! | |
| 610 //! \brief Field validity flag values for MINIDUMP_MISC_INFO::Flags1. | |
| 611 //! \{ | |
| 612 | |
| 613 //! \brief MINIDUMP_MISC_INFO::ProcessId is valid. | |
| 614 #define MINIDUMP_MISC1_PROCESS_ID 0x00000001 | |
| 615 | |
| 616 //! \brief The time-related fields in MINIDUMP_MISC_INFO are valid. | |
| 617 //! | |
| 618 //! The following fields are valid: | |
| 619 //! - MINIDUMP_MISC_INFO::ProcessCreateTime | |
|
Robert Sesek
2014/07/31 16:55:41
Does Doxygen automatically turn these into bullete
Mark Mentovai
2014/07/31 17:06:54
rsesek wrote:
| |
| 620 //! - MINIDUMP_MISC_INFO::ProcessUserTime | |
| 621 //! - MINIDUMP_MISC_INFO::ProcessKernelTime | |
| 622 #define MINIDUMP_MISC1_PROCESS_TIMES 0x00000002 | |
| 623 | |
| 624 //! \brief The CPU-related fields in MINIDUMP_MISC_INFO_2 are valid. | |
| 625 //! | |
| 626 //! The following fields are valid: | |
| 627 //! - MINIDUMP_MISC_INFO_2::ProcessorMaxMhz | |
| 628 //! - MINIDUMP_MISC_INFO_2::ProcessorCurrentMhz | |
| 629 //! - MINIDUMP_MISC_INFO_2::ProcessorMhzLimit | |
| 630 //! - MINIDUMP_MISC_INFO_2::ProcessorMaxIdleState | |
| 631 //! - MINIDUMP_MISC_INFO_2::ProcessorCurrentIdleState | |
| 632 //! | |
| 633 //! \note This macro should likely have been named | |
| 634 //! MINIDUMP_MISC2_PROCESSOR_POWER_INFO. | |
| 635 #define MINIDUMP_MISC1_PROCESSOR_POWER_INFO 0x00000004 | |
| 636 | |
| 637 //! \brief MINIDUMP_MISC_INFO3::ProcessIntegrityLevel is valid. | |
| 638 #define MINIDUMP_MISC3_PROCESS_INTEGRITY 0x00000010 | |
| 639 | |
| 640 //! \brief MINIDUMP_MISC_INFO3::ProcessExecuteFlags is valid. | |
| 641 #define MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS 0x00000020 | |
| 642 | |
| 643 //! \brief The time zone-related fields in MINIDUMP_MISC_INFO_3 are valid. | |
| 644 //! | |
| 645 //! The following fields are valid: | |
| 646 //! - MINIDUMP_MISC_INFO_3::TimeZoneId | |
| 647 //! - MINIDUMP_MISC_INFO_3::TimeZone | |
| 648 #define MINIDUMP_MISC3_TIMEZONE 0x00000040 | |
| 649 | |
| 650 //! \brief MINIDUMP_MISC_INFO3::ProtectedProcess is valid. | |
| 651 #define MINIDUMP_MISC3_PROTECTED_PROCESS 0x00000080 | |
| 652 | |
| 653 //! \brief The build string-related fields in MINIDUMP_MISC_INFO_4 are valid. | |
| 654 //! | |
| 655 //! The following fields are valid: | |
| 656 //! - MINIDUMP_MISC_INFO_4::BuildString | |
| 657 //! - MINIDUMP_MISC_INFO_4::DbgBldStr | |
| 658 #define MINIDUMP_MISC4_BUILDSTRING 0x00000100 | |
| 659 //! \} | |
| 660 | |
| 661 //! \brief Information about the process that the minidump file contains a | |
| 662 //! snapshot of, as well as the system that hosted that process. | |
| 663 //! | |
| 664 //! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" | |
| 665 //! \sa MINIDUMP_MISC_INFO_2 | |
| 666 //! \sa MINIDUMP_MISC_INFO_3 | |
| 667 //! \sa MINIDUMP_MISC_INFO_4 | |
| 668 //! \sa MINIDUMP_MISC_INFO_N | |
| 669 struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO { | |
| 670 //! \brief The size of the structure. | |
| 671 //! | |
| 672 //! This field can be used to distinguish between different versions of this | |
| 673 //! structure: MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2, MINIDUMP_MISC_INFO_3, | |
| 674 //! and MINIDUMP_MISC_INFO_4. | |
| 675 //! | |
| 676 //! \sa Flags1 | |
| 677 uint32_t SizeOfInfo; | |
| 678 | |
| 679 //! \brief A bit field of \ref MINIDUMP_MISCx "MINIDUMP_MISC*" values | |
| 680 //! indicating which fields of this structure contain valid data. | |
| 681 uint32_t Flags1; | |
| 682 | |
| 683 //! \brief The process ID of the process. | |
| 684 uint32_t ProcessId; | |
| 685 | |
| 686 //! \brief The time that the process started, in `time_t` units, seconds since | |
| 687 //! the POSIX epoch. | |
| 688 uint32_t ProcessCreateTime; | |
| 689 | |
| 690 //! \brief The amount of user-mode CPU time used by the process, in seconds, | |
| 691 //! at the time of the snapshot. | |
| 692 uint32_t ProcessUserTime; | |
| 693 | |
| 694 //! \brief The amount of system-mode (kernel) CPU time used by the process, in | |
| 695 //! seconds, at the time of the snapshot. | |
| 696 uint32_t ProcessKernelTime; | |
| 697 }; | |
| 698 | |
| 699 //! \brief Information about the process that the minidump file contains a | |
| 700 //! snapshot of, as well as the system that hosted that process. | |
| 701 //! | |
| 702 //! This structure variant is used on Windows Vista (NT 6.0) and later. | |
| 703 //! | |
| 704 //! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" | |
| 705 //! \sa MINIDUMP_MISC_INFO | |
| 706 //! \sa MINIDUMP_MISC_INFO_3 | |
| 707 //! \sa MINIDUMP_MISC_INFO_4 | |
| 708 //! \sa MINIDUMP_MISC_INFO_N | |
| 709 struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_2 | |
| 710 : public MINIDUMP_MISC_INFO { | |
| 711 //! \brief The maximum clock rate of the system’s CPU or CPUs, in MHz. | |
| 712 uint32_t ProcessorMaxMhz; | |
| 713 | |
| 714 //! \brief The clock rate of the system’s CPU or CPUs, in MHz, at the time of | |
| 715 //! the snapshot. | |
| 716 uint32_t ProcessorCurrentMhz; | |
| 717 | |
| 718 //! \brief The maximum clock rate of the system’s CPU or CPUs, in MHz, reduced | |
| 719 //! by any thermal limitations, at the time of the snapshot. | |
| 720 uint32_t ProcessorMhzLimit; | |
| 721 | |
| 722 //! \brief The maximum idle state of the system’s CPU or CPUs. | |
| 723 uint32_t ProcessorMaxIdleState; | |
| 724 | |
| 725 //! \brief The idle state of the system’s CPU or CPUs at the time of the | |
| 726 //! snapshot. | |
| 727 uint32_t ProcessorCurrentIdleState; | |
| 728 }; | |
| 729 | |
| 730 //! \brief Information about the process that the minidump file contains a | |
| 731 //! snapshot of, as well as the system that hosted that process. | |
| 732 //! | |
| 733 //! This structure variant is used on Windows 7 (NT 6.1) and later. | |
| 734 //! | |
| 735 //! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" | |
| 736 //! \sa MINIDUMP_MISC_INFO | |
| 737 //! \sa MINIDUMP_MISC_INFO_2 | |
| 738 //! \sa MINIDUMP_MISC_INFO_4 | |
| 739 //! \sa MINIDUMP_MISC_INFO_N | |
| 740 struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_3 | |
| 741 : public MINIDUMP_MISC_INFO_2 { | |
| 742 //! \brief The process’ integrity level. | |
| 743 //! | |
| 744 //! Windows typically uses `SECURITY_MANDATORY_MEDIUM_RID` (0x2000) for | |
| 745 //! processes belonging to normal authenticated users and | |
| 746 //! `SECURITY_MANDATORY_HIGH_RID` (0x3000) for elevated processes. | |
| 747 //! | |
| 748 //! This field is Windows-specific, and has no meaning on other operating | |
|
Robert Sesek
2014/07/31 16:55:41
Process UID maybe? Would only be interesting if <
Mark Mentovai
2014/07/31 17:06:54
rsesek wrote:
| |
| 749 //! systems. | |
| 750 uint32_t ProcessIntegrityLevel; | |
| 751 | |
| 752 //! \brief The process’ execute flags. | |
| 753 //! | |
| 754 //! On Windows, this appears to be returned by `NtQueryInformationProcess()` | |
| 755 //! with an argument of `ProcessExecuteFlags` (34). | |
| 756 //! | |
| 757 //! This field is Windows-specific, and has no meaning on other operating | |
| 758 //! systems. | |
| 759 uint32_t ProcessExecuteFlags; | |
| 760 | |
| 761 //! \brief Whether the process is protected. | |
| 762 //! | |
| 763 //! This field is Windows-specific, and has no meaning on other operating | |
|
Robert Sesek
2014/07/31 16:55:41
Could be a sandbox check on Mac.
Mark Mentovai
2014/07/31 17:06:54
rsesek wrote:
| |
| 764 //! systems. | |
| 765 uint32_t ProtectedProcess; | |
| 766 | |
| 767 //! \brief Whether daylight saving time was being observed in the system’s | |
| 768 //! location at the time of the snapshot. | |
| 769 //! | |
| 770 //! This field can contain the following values: | |
| 771 //! - `0` if the location does not observe daylight saving time at all. The | |
| 772 //! TIME_ZONE_INFORMATION::StandardName field of #TimeZoneId contains the | |
| 773 //! time zone name. | |
| 774 //! - `1` if the location observes daylight saving time, but standard time | |
| 775 //! was in effect at the time of the snapshot. The | |
| 776 //! TIME_ZONE_INFORMATION::StandardName field of #TimeZoneId contains the | |
| 777 //! time zone name. | |
| 778 //! - `2` if the location observes daylight saving time, and it was in effect | |
| 779 //! at the time of the snapshot. The TIME_ZONE_INFORMATION::DaylightName | |
| 780 //! field of #TimeZoneId contains the time zone name. | |
| 781 //! | |
| 782 //! \sa #TimeZone | |
| 783 uint32_t TimeZoneId; | |
| 784 | |
| 785 //! \brief Information about the time zone at the system’s location. | |
| 786 //! | |
| 787 //! \sa #TimeZoneId | |
| 788 TIME_ZONE_INFORMATION TimeZone; | |
| 789 }; | |
| 790 | |
| 791 //! \brief Information about the process that the minidump file contains a | |
| 792 //! snapshot of, as well as the system that hosted that process. | |
| 793 //! | |
| 794 //! This structure variant is used on Windows 8 (NT 6.2) and later. | |
| 795 //! | |
| 796 //! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" | |
| 797 //! \sa MINIDUMP_MISC_INFO | |
| 798 //! \sa MINIDUMP_MISC_INFO_2 | |
| 799 //! \sa MINIDUMP_MISC_INFO_3 | |
| 800 //! \sa MINIDUMP_MISC_INFO_N | |
| 801 struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_4 | |
| 802 : public MINIDUMP_MISC_INFO_3 { | |
| 803 //! \brief The operating system’s “build string”, a string identifying a | |
| 804 //! specific build of the operating system. | |
| 805 //! | |
| 806 //! This string is UTF-16-encoded and terminated by a UTF-16 `NUL` code unit. | |
| 807 //! | |
| 808 //! On Windows 8.1 (NT 6.3), this is “6.3.9600.17031 | |
| 809 //! (winblue_gdr.140221-1952)”. | |
| 810 char16 BuildString[260]; | |
| 811 | |
| 812 //! \brief The minidump producer’s “build string”, a string identifying the | |
| 813 //! module that produced a minidump file. | |
| 814 //! | |
| 815 //! This string is UTF-16-encoded and terminated by a UTF-16 `NUL` code unit. | |
| 816 //! | |
| 817 //! On Windows 8.1 (NT 6.3), this may be “dbghelp.i386,6.3.9600.16520” or | |
| 818 //! “dbghelp.amd64,6.3.9600.16520” depending on CPU architecture. | |
| 819 char16 DbgBldStr[40]; | |
| 820 }; | |
| 821 | |
| 822 //! \brief The latest known version of the MINIDUMP_MISC_INFO structure. | |
| 823 typedef MINIDUMP_MISC_INFO_4 MINIDUMP_MISC_INFO_N; | |
| 824 | |
| 825 //! \brief Minidump file type values for MINIDUMP_HEADER::Flags. These bits | |
| 826 //! describe the types of data carried within a minidump file. | |
| 827 enum MINIDUMP_TYPE { | |
| 828 //! \brief A minidump file without any additional data. | |
| 829 //! | |
| 830 //! This type of minidump file contains: | |
| 831 //! - A MINIDUMP_SYSTEM_INFO stream. | |
| 832 //! - A MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2, MINIDUMP_MISC_INFO_3, or | |
| 833 //! MINIDUMP_MISC_INFO_4 stream, depending on which fields are present. | |
| 834 //! - A MINIDUMP_THREAD_LIST stream. All threads are present, along with a | |
| 835 //! snapshot of each thread’s stack memory sufficient to obtain backtraces. | |
| 836 //! - If the minidump file was generated as a result of an exception, a | |
| 837 //! MINIDUMP_EXCEPTION_STREAM describing the exception. | |
| 838 //! - A MINIDUMP_MODULE_LIST stream. All loaded modules are present. | |
| 839 //! - Typically, a MINIDUMP_MEMORY_LIST stream containing duplicate pointers | |
| 840 //! to the stack memory regions also referenced by the MINIDUMP_THREAD_LIST | |
| 841 //! stream. Since Windows 7 (NT 6.1), this type of minidump file also | |
| 842 //! includes a MINIDUMP_MEMORY_DESCRIPTOR containing the 256 bytes centered | |
| 843 //! around the exception address or the instruction pointer. | |
| 844 MiniDumpNormal = 0x00000000, | |
| 845 }; | |
| 846 | |
| 847 #endif // CRASHPAD_COMPAT_NON_WIN_DBGHELP_H_ | |
| OLD | NEW |