1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <map> 6 #include <string> 7 #include <vector> 8 9 #include "base/macros.h" 10 #include "base/synchronization/lock.h" 11 #include "breakpad/src/client/windows/common/ipc_protocol.h" 12 #include "breakpad/src/client/windows/handler/exception_handler.h" 13 14 15 namespace base { 16 class CommandLine; 17 } // namespace base 18 19 namespace breakpad { 20 21 class BreakpadClient; 22 23 // Manages the breakpad key/value pair stash, there may only be one instance 24 // of this class per process at one time. 25 class CrashKeysWin { 26 public: 27 CrashKeysWin(); 28 ~CrashKeysWin(); 29 30 // May only be called once. 31 // |exe_path| is the path to the executable running, which may be used 32 // to figure out whether this is a user or system install. 33 // |type| is the process type, or mode this process is running in e.g. 34 // something like "browser" or "renderer". 35 // |profile_type| is a string describing the kind of the user's Windows 36 // profile, e.g. "mandatory", or "roaming" or similar. 37 // |cmd_line| is the current process' command line consulted for explicit 38 // crash reporting flags. 39 // |breakpad_client| is consulted for crash reporting settings. 40 google_breakpad::CustomClientInfo* GetCustomInfo( 41 const std::wstring& exe_path, 42 const std::wstring& type, 43 const std::wstring& profile_type, 44 base::CommandLine* cmd_line, 45 BreakpadClient* breakpad_client); 46 47 void SetCrashKeyValue(const std::wstring& key, const std::wstring& value); 48 void ClearCrashKeyValue(const std::wstring& key); 49 keeper()50 static CrashKeysWin* keeper() { return keeper_; } 51 52 private: 53 // One-time initialization of private key/value pairs. 54 void SetPluginPath(const std::wstring& path); 55 void SetBreakpadDumpPath(BreakpadClient* breakpad_client); 56 57 // Must not be resized after GetCustomInfo is invoked. 58 std::vector<google_breakpad::CustomInfoEntry> custom_entries_; 59 60 typedef std::map<std::wstring, google_breakpad::CustomInfoEntry*> 61 DynamicEntriesMap; 62 base::Lock lock_; 63 // Keeps track of the next index for a new dynamic entry. 64 size_t dynamic_keys_offset_; // Under lock_. 65 // Maintains key->entry information for dynamic key/value entries 66 // in custom_entries_. 67 DynamicEntriesMap dynamic_entries_; // Under lock_. 68 69 // Stores the sole instance of this class allowed per process. 70 static CrashKeysWin* keeper_; 71 72 DISALLOW_COPY_AND_ASSIGN(CrashKeysWin); 73 }; 74 75 } // namespace breakpad 76