| Index: src/client/linux/microdump_writer/microdump_writer.cc
|
| diff --git a/src/client/linux/microdump_writer/microdump_writer.cc b/src/client/linux/microdump_writer/microdump_writer.cc
|
| index e14f9754c071f4b72a52cb9ec9624dc35cea21cc..f45925fecbdf77ecddd34be557485b1c3b856f09 100644
|
| --- a/src/client/linux/microdump_writer/microdump_writer.cc
|
| +++ b/src/client/linux/microdump_writer/microdump_writer.cc
|
| @@ -60,6 +60,8 @@ class MicrodumpWriter {
|
| public:
|
| MicrodumpWriter(const ExceptionHandler::CrashContext* context,
|
| const MappingList& mappings,
|
| + const char* build_fingerprint,
|
| + const char* product_info,
|
| LinuxDumper* dumper)
|
| : ucontext_(context ? &context->context : NULL),
|
| #if !defined(__ARM_EABI__) && !defined(__mips__)
|
| @@ -67,6 +69,8 @@ class MicrodumpWriter {
|
| #endif
|
| dumper_(dumper),
|
| mapping_list_(mappings),
|
| + build_fingerprint_(build_fingerprint),
|
| + product_info_(product_info),
|
| log_line_(NULL) {
|
| log_line_ = reinterpret_cast<char*>(Alloc(kLineBufferSize));
|
| if (log_line_)
|
| @@ -88,9 +92,9 @@ class MicrodumpWriter {
|
| bool Dump() {
|
| bool success;
|
| LogLine("-----BEGIN BREAKPAD MICRODUMP-----");
|
| - success = DumpOSInformation();
|
| - if (success)
|
| - success = DumpCrashingThread();
|
| + DumpProductInformation();
|
| + DumpOSInformation();
|
| + success = DumpCrashingThread();
|
| if (success)
|
| success = DumpMappings();
|
| LogLine("-----END BREAKPAD MICRODUMP-----");
|
| @@ -143,10 +147,17 @@ class MicrodumpWriter {
|
| my_strlcpy(log_line_, "", kLineBufferSize);
|
| }
|
|
|
| - bool DumpOSInformation() {
|
| - struct utsname uts;
|
| - if (uname(&uts))
|
| - return false;
|
| + void DumpProductInformation() {
|
| + LogAppend("V ");
|
| + if (product_info_) {
|
| + LogAppend(product_info_);
|
| + } else {
|
| + LogAppend("UNKNOWN:0.0.0.0");
|
| + }
|
| + LogCommitLine();
|
| + }
|
| +
|
| + void DumpOSInformation() {
|
| const uint8_t n_cpus = static_cast<uint8_t>(sysconf(_SC_NPROCESSORS_CONF));
|
|
|
| #if defined(__ANDROID__)
|
| @@ -178,13 +189,23 @@ class MicrodumpWriter {
|
| LogAppend(" ");
|
| LogAppend(n_cpus);
|
| LogAppend(" ");
|
| - LogAppend(uts.machine);
|
| - LogAppend(" ");
|
| - LogAppend(uts.release);
|
| - LogAppend(" ");
|
| - LogAppend(uts.version);
|
| + // If the client has attached a build fingerprint to the MinidumpDescriptor
|
| + // use that one. Otherwise try to get some basic info from uname().
|
| + if (build_fingerprint_) {
|
| + LogAppend(build_fingerprint_);
|
| + } else {
|
| + struct utsname uts;
|
| + if (uname(&uts) == 0) {
|
| + LogAppend(uts.machine);
|
| + LogAppend(" ");
|
| + LogAppend(uts.release);
|
| + LogAppend(" ");
|
| + LogAppend(uts.version);
|
| + } else {
|
| + LogAppend("no build fingerprint available");
|
| + }
|
| + }
|
| LogCommitLine();
|
| - return true;
|
| }
|
|
|
| bool DumpThreadStack(uint32_t thread_id,
|
| @@ -367,6 +388,8 @@ class MicrodumpWriter {
|
| #endif
|
| LinuxDumper* dumper_;
|
| const MappingList& mapping_list_;
|
| + const char* const build_fingerprint_;
|
| + const char* const product_info_;
|
| char* log_line_;
|
| };
|
| } // namespace
|
| @@ -376,7 +399,9 @@ namespace google_breakpad {
|
| bool WriteMicrodump(pid_t crashing_process,
|
| const void* blob,
|
| size_t blob_size,
|
| - const MappingList& mappings) {
|
| + const MappingList& mappings,
|
| + const char* build_fingerprint,
|
| + const char* product_info) {
|
| LinuxPtraceDumper dumper(crashing_process);
|
| const ExceptionHandler::CrashContext* context = NULL;
|
| if (blob) {
|
| @@ -388,7 +413,8 @@ bool WriteMicrodump(pid_t crashing_process,
|
| dumper.set_crash_signal(context->siginfo.si_signo);
|
| dumper.set_crash_thread(context->tid);
|
| }
|
| - MicrodumpWriter writer(context, mappings, &dumper);
|
| + MicrodumpWriter writer(context, mappings, build_fingerprint, product_info,
|
| + &dumper);
|
| if (!writer.Init())
|
| return false;
|
| return writer.Dump();
|
|
|