Browse Source

fix: Initialize logging for crashpad (#26266)

* fix: Initialize logging for crashpad

* chore: update mini_chromium

* conditionally access CommandLine because crashpad doesn't initialize one.

https://chromium-review.googlesource.com/c/chromium/src/+/2490880

* chore: update patches

Co-authored-by: deepak1556 <[email protected]>
trop[bot] 4 years ago
parent
commit
0aef4d6a8d
2 changed files with 147 additions and 0 deletions
  1. 1 0
      patches/chromium/.patches
  2. 146 0
      patches/chromium/crashpad-initialize-logging.patch

+ 1 - 0
patches/chromium/.patches

@@ -110,3 +110,4 @@ cherry-pick-30261f9de11e.patch
 cherry-pick-88f263f401b4.patch
 cherry-pick-229fdaf8fc05.patch
 cherry-pick-1ed869ad4bb3.patch
+crashpad-initialize-logging.patch

+ 146 - 0
patches/chromium/crashpad-initialize-logging.patch

@@ -0,0 +1,146 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Joshua Peraza <[email protected]>
+Date: Wed, 21 Oct 2020 11:10:25 -0700
+Subject: Initialize logging for crashpad
+
+Although logging to files is not yet supported by mini_chromium, it is
+the default behavior for OS_WIN in chromium. This change should
+cause crashpad to log via OutputDebugString() on Windows, instead of
+debug.log files. Future work (crbug.com/crashpad/26) should arrange for
+logs to be uploaded with reports, embedded in associated minidumps or as
+file attachments.
+
+Bug: chromium:711159
+Change-Id: I0f9004f7de94dd29d555cc7d23c48a63da6b4bba
+Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/2425108
+Reviewed-by: Mark Mentovai <[email protected]>
+
+diff --git a/base/logging.cc b/base/logging.cc
+index 2da71c73819b34a45911131e2cc8bff861178789..6b701b7a8dee0d015758e11771c5c1f3a6b8d13b 100644
+--- a/base/logging.cc
++++ b/base/logging.cc
+@@ -421,21 +421,23 @@ bool BaseInitLoggingImpl(const LoggingSettings& settings) {
+            0u);
+ #endif
+ 
+-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+-  // Don't bother initializing |g_vlog_info| unless we use one of the
+-  // vlog switches.
+-  if (command_line->HasSwitch(switches::kV) ||
+-      command_line->HasSwitch(switches::kVModule)) {
+-    // NOTE: If |g_vlog_info| has already been initialized, it might be in use
+-    // by another thread. Don't delete the old VLogInfo, just create a second
+-    // one. We keep track of both to avoid memory leak warnings.
+-    CHECK(!g_vlog_info_prev);
+-    g_vlog_info_prev = g_vlog_info;
+-
+-    g_vlog_info =
+-        new VlogInfo(command_line->GetSwitchValueASCII(switches::kV),
+-                     command_line->GetSwitchValueASCII(switches::kVModule),
+-                     &g_min_log_level);
++  if (base::CommandLine::InitializedForCurrentProcess()) {
++    base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
++    // Don't bother initializing |g_vlog_info| unless we use one of the
++    // vlog switches.
++    if (command_line->HasSwitch(switches::kV) ||
++        command_line->HasSwitch(switches::kVModule)) {
++      // NOTE: If |g_vlog_info| has already been initialized, it might be in use
++      // by another thread. Don't delete the old VLogInfo, just create a second
++      // one. We keep track of both to avoid memory leak warnings.
++      CHECK(!g_vlog_info_prev);
++      g_vlog_info_prev = g_vlog_info;
++
++      g_vlog_info =
++          new VlogInfo(command_line->GetSwitchValueASCII(switches::kV),
++                       command_line->GetSwitchValueASCII(switches::kVModule),
++                       &g_min_log_level);
++    }
+   }
+ 
+   g_logging_destination = settings.logging_dest;
+@@ -446,7 +448,10 @@ bool BaseInitLoggingImpl(const LoggingSettings& settings) {
+     config.min_severity = FX_LOG_INFO;
+     config.console_fd = -1;
+     config.log_service_channel = ZX_HANDLE_INVALID;
+-    std::string log_tag = command_line->GetProgram().BaseName().AsUTF8Unsafe();
++    std::string log_tag = base::CommandLine::ForCurrentProcess()
++                              ->GetProgram()
++                              .BaseName()
++                              .AsUTF8Unsafe();
+     const char* log_tag_data = log_tag.data();
+     config.tags = &log_tag_data;
+     config.num_tags = 1;
+diff --git a/third_party/crashpad/crashpad/DEPS b/third_party/crashpad/crashpad/DEPS
+index ccb447cde9a9ee3c1fe29419abfa8aa63d777455..6ee9db5400cf12ae4812a261e78234581b036c25 100644
+--- a/third_party/crashpad/crashpad/DEPS
++++ b/third_party/crashpad/crashpad/DEPS
+@@ -42,7 +42,7 @@ deps = {
+       '7bde79cc274d06451bf65ae82c012a5d3e476b5a',
+   'crashpad/third_party/mini_chromium/mini_chromium':
+       Var('chromium_git') + '/chromium/mini_chromium@' +
+-      'ae14a14ab4cea36db9c446741581d427a7fc7f89',
++      '5fc64bfbf1c000161445c586de45e40464ff2314',
+   'crashpad/third_party/libfuzzer/src':
+       Var('chromium_git') + '/chromium/llvm-project/compiler-rt/lib/fuzzer.git@' +
+       'fda403cf93ecb8792cb1d061564d89a6553ca020',
+diff --git a/third_party/crashpad/crashpad/handler/handler_main.cc b/third_party/crashpad/crashpad/handler/handler_main.cc
+index d56857ff9042a0e4ed55bb101e419948f4028305..579a7c364077d2b6a78803fa75f7180109b37c89 100644
+--- a/third_party/crashpad/crashpad/handler/handler_main.cc
++++ b/third_party/crashpad/crashpad/handler/handler_main.cc
+@@ -494,16 +494,26 @@ class ScopedStoppable {
+   DISALLOW_COPY_AND_ASSIGN(ScopedStoppable);
+ };
+ 
++void InitCrashpadLogging() {
++  logging::LoggingSettings settings;
++#if defined(OS_CHROMEOS)
++  settings.logging_dest = logging::LOG_TO_FILE;
++  settings.log_file_path = "/var/log/chrome/chrome";
++#elif defined(OS_WIN)
++  settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
++#else
++  settings.logging_dest =
++      logging::LOG_TO_SYSTEM_DEBUG_LOG | logging::LOG_TO_STDERR;
++#endif
++  logging::InitLogging(settings);
++}
++
+ }  // namespace
+ 
+ int HandlerMain(int argc,
+                 char* argv[],
+                 const UserStreamDataSources* user_stream_sources) {
+-#if defined(OS_CHROMEOS)
+-  if (freopen("/var/log/chrome/chrome", "a", stderr) == nullptr) {
+-    PLOG(ERROR) << "Failed to redirect stderr to /var/log/chrome/chrome";
+-  }
+-#endif
++  InitCrashpadLogging();
+ 
+   InstallCrashHandler();
+   CallMetricsRecordNormalExit metrics_record_normal_exit;
+diff --git a/third_party/crashpad/crashpad/test/gtest_main.cc b/third_party/crashpad/crashpad/test/gtest_main.cc
+index 67cfa0d72d7eb469775201f3a9df906f27c302a9..c67b8e24bb940935d5da88428ed3058a135f5a57 100644
+--- a/third_party/crashpad/crashpad/test/gtest_main.cc
++++ b/third_party/crashpad/crashpad/test/gtest_main.cc
+@@ -12,6 +12,7 @@
+ // See the License for the specific language governing permissions and
+ // limitations under the License.
+ 
++#include "base/logging.h"
+ #include "build/build_config.h"
+ #include "gtest/gtest.h"
+ #include "test/main_arguments.h"
+@@ -99,6 +100,12 @@ int main(int argc, char* argv[]) {
+ 
+ #endif  // CRASHPAD_IS_IN_CHROMIUM
+ 
++  // base::TestSuite initializes logging when using Chromium's test launcher.
++  logging::LoggingSettings settings;
++  settings.logging_dest =
++      logging::LOG_TO_STDERR | logging::LOG_TO_SYSTEM_DEBUG_LOG;
++  logging::InitLogging(settings);
++
+ #if defined(CRASHPAD_TEST_LAUNCHER_GOOGLEMOCK)
+   testing::InitGoogleMock(&argc, argv);
+ #elif defined(CRASHPAD_TEST_LAUNCHER_GOOGLETEST)