crash-reporter: Generate kernel crash signatures for server-side grouping of similar crashes

BUG=5868
TEST=KernelCrash, UserCrash, CrashSender, unittests, and manual inspection of sent report.

Change-Id: I31991895c9ac719ac1832d588ae3360500ef0c26

Review URL: http://codereview.chromium.org/4018008
diff --git a/crash_reporter/crash_collector.cc b/crash_reporter/crash_collector.cc
index 0391fa5..5ea06e2 100644
--- a/crash_reporter/crash_collector.cc
+++ b/crash_reporter/crash_collector.cc
@@ -39,7 +39,9 @@
 // number of core files or minidumps reaches this number.
 const int CrashCollector::kMaxCrashDirectorySize = 32;
 
-CrashCollector::CrashCollector() : forced_crash_directory_(NULL) {
+CrashCollector::CrashCollector()
+    : forced_crash_directory_(NULL),
+      lsb_release_(kLsbRelease) {
 }
 
 CrashCollector::~CrashCollector() {
@@ -247,12 +249,17 @@
   return !any_errors;
 }
 
+void CrashCollector::AddCrashMetaData(const std::string &key,
+                                      const std::string &value) {
+  extra_metadata_.append(StringPrintf("%s=%s\n", key.c_str(), value.c_str()));
+}
+
 void CrashCollector::WriteCrashMetaData(const FilePath &meta_path,
                                         const std::string &exec_name,
                                         const std::string &payload_path) {
   std::map<std::string, std::string> contents;
-  if (!ReadKeyValueFile(FilePath(std::string(kLsbRelease)), '=', &contents)) {
-    logger_->LogError("Problem parsing %s", kLsbRelease);
+  if (!ReadKeyValueFile(FilePath(std::string(lsb_release_)), '=', &contents)) {
+    logger_->LogError("Problem parsing %s", lsb_release_);
     // Even though there was some failure, take as much as we could read.
   }
   std::string version("unknown");
@@ -262,10 +269,11 @@
   }
   int64 payload_size = -1;
   file_util::GetFileSize(FilePath(payload_path), &payload_size);
-  std::string meta_data = StringPrintf("exec_name=%s\n"
+  std::string meta_data = StringPrintf("%sexec_name=%s\n"
                                        "ver=%s\n"
                                        "payload_size=%lld\n"
                                        "done=1\n",
+                                       extra_metadata_.c_str(),
                                        exec_name.c_str(),
                                        version.c_str(),
                                        payload_size);