1 // Copyright (c) 2010 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 <windows.h> 6 #include <stdlib.h> 7 #include <tchar.h> 8 9 #include "base/at_exit.h" 10 #include "base/command_line.h" 11 #include "base/file_util.h" 12 #include "base/logging.h" 13 #include "base/path_service.h" 14 #include "chrome/common/chrome_constants.h" 15 #include "chrome/common/chrome_paths.h" 16 #include "components/breakpad/tools/crash_service.h" 17 18 namespace { 19 20 const wchar_t kStandardLogFile[] = L"operation_log.txt"; 21 22 bool GetCrashServiceDirectory(base::FilePath* dir) { 23 base::FilePath temp_dir; 24 if (!base::GetTempDir(&temp_dir)) 25 return false; 26 temp_dir = temp_dir.Append(L"chrome_crashes"); 27 if (!base::PathExists(temp_dir)) { 28 if (!base::CreateDirectory(temp_dir)) 29 return false; 30 } 31 *dir = temp_dir; 32 return true; 33 } 34 35 } // namespace. 36 37 int __stdcall wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd_line, 38 int show_mode) { 39 // Manages the destruction of singletons. 40 base::AtExitManager exit_manager; 41 42 CommandLine::Init(0, NULL); 43 44 chrome::RegisterPathProvider(); 45 46 // We use/create a directory under the user's temp folder, for logging. 47 base::FilePath operating_dir; 48 GetCrashServiceDirectory(&operating_dir); 49 base::FilePath log_file = operating_dir.Append(kStandardLogFile); 50 51 // Logging to stderr (to help with debugging failures on the 52 // buildbots) and to a file. 53 logging::LoggingSettings settings; 54 settings.logging_dest = logging::LOG_TO_ALL; 55 settings.log_file = log_file.value().c_str(); 56 logging::InitLogging(settings); 57 // Logging with pid, tid and timestamp. 58 logging::SetLogItems(true, true, true, false); 59 60 VLOG(1) << "session start. cmdline is [" << cmd_line << "]"; 61 62 base::FilePath dumps_path; 63 if (!PathService::Get(chrome::DIR_CRASH_DUMPS, &dumps_path)) { 64 LOG(ERROR) << "could not get DIR_CRASH_DUMPS"; 65 return 1; 66 } 67 68 breakpad::CrashService crash_service; 69 if (!crash_service.Initialize(operating_dir, dumps_path)) 70 return 1; 71 72 VLOG(1) << "ready to process crash requests"; 73 74 // Enter the message loop. 75 int retv = crash_service.ProcessingLoop(); 76 // Time to exit. 77 VLOG(1) << "session end. return code is " << retv; 78 return retv; 79 } 80