Home | History | Annotate | Download | only in crash_service
      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/files/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/crash/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