From d1df1e1052b2b1bd6f60f1d94c411c443d9b779c Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Wed, 7 Jun 2017 17:11:40 -0700 Subject: [PATCH] Eliminate ASL stdout forwarding on iOS ASL was deprecated in iOS 10 and started causing SIGPIPE issues in iOS 10.3. Under the iOS 8 SDK, syslog() stopped working as of iOS 10.3 devices, with the result that ASL stdout/stderr forwarding was the only means of logging. The engine now builds against the iOS 10 SDK, with deployment target of iOS 8. Under this SDK, syslog() works correctly across all supported OS versions. NOTE: This is a temporary fix to get developers unblocked. While this does fix the SIGPIPE issue and put iOS logging on par with the Android solution, the intent is to move to a dedicated communication channel with flutter_tools that isn't log-based. --- lib/ui/dart_runtime_hooks.cc | 17 +++++++++++++---- shell/common/switches.h | 5 ----- shell/platform/darwin/common/platform_mac.mm | 15 --------------- 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/lib/ui/dart_runtime_hooks.cc b/lib/ui/dart_runtime_hooks.cc index 533ed6fb3aa6d..3236f97c10326 100644 --- a/lib/ui/dart_runtime_hooks.cc +++ b/lib/ui/dart_runtime_hooks.cc @@ -25,6 +25,11 @@ #if defined(OS_ANDROID) #include +#elif defined(OS_IOS) +extern "C" { + // Cannot import the syslog.h header directly because of macro collision. + extern void syslog(int, const char*, ...); +} #endif using tonic::LogIfError; @@ -143,11 +148,15 @@ void Logger_PrintString(Dart_NativeArguments args) { // Write to the logcat on Android. const char* tag = Settings::Get().log_tag.c_str(); __android_log_print(ANDROID_LOG_INFO, tag, "%.*s", (int)length, chars); +#elif defined(OS_IOS) + // Write to syslog on iOS. + // + // TODO(cbracken): replace with dedicated communication channel and bypass + // iOS logging APIs altogether. + syslog(1 /* LOG_ALERT */, "%.*s", (int)length, chars); #else - // On Fuchsia, iOS and in flutter_tester (on both macOS and Linux), write - // directly to stdout. On iOS, this is redirected to ASL via - // RedirectIOConnectionsToSyslog in platform_mac.mm. - // TODO(cbracken): replace with dedicated (non-stdout) logging on iOS. + // On Fuchsia and in flutter_tester (on both macOS and Linux), write + // directly to stdout. fwrite(chars, 1, length, stdout); fputs("\n", stdout); fflush(stdout); diff --git a/shell/common/switches.h b/shell/common/switches.h index ac43b92126f1c..dc24040965f50 100644 --- a/shell/common/switches.h +++ b/shell/common/switches.h @@ -74,11 +74,6 @@ DEF_SWITCH(NonInteractive, "non-interactive", "Make the shell non-interactive. By default, the shell attempts " "to setup a window and create an OpenGL context.") -DEF_SWITCH(NoRedirectToSyslog, - "no-redirect-to-syslog", - "On iOS: Don't redirect stdout and stderr to syslog by default. " - "This is used by the tools to read device logs. However, this can " - "cause logs to not show up when launched from Xcode.") DEF_SWITCH(Packages, "packages", "Specify the path to the packages.") DEF_SWITCH(StartPaused, "start-paused", diff --git a/shell/platform/darwin/common/platform_mac.mm b/shell/platform/darwin/common/platform_mac.mm index a53d54623f7c6..66eca978294a9 100644 --- a/shell/platform/darwin/common/platform_mac.mm +++ b/shell/platform/darwin/common/platform_mac.mm @@ -6,8 +6,6 @@ #include -#include - #include "dart/runtime/include/dart_tools_api.h" #include "flutter/common/threads.h" #include "flutter/fml/trace_event.h" @@ -20,17 +18,6 @@ namespace shell { -static void RedirectIOConnectionsToSyslog(const ftl::CommandLine& command_line) { -#if TARGET_OS_IPHONE - if (command_line.HasOption(FlagForSwitch(Switch::NoRedirectToSyslog))) { - return; - } - - asl_log_descriptor(NULL, NULL, ASL_LEVEL_NOTICE, STDOUT_FILENO, ASL_LOG_DESCRIPTOR_WRITE); - asl_log_descriptor(NULL, NULL, ASL_LEVEL_WARNING, STDERR_FILENO, ASL_LOG_DESCRIPTOR_WRITE); -#endif -} - static ftl::CommandLine InitializedCommandLine() { std::vector args_vector; @@ -54,8 +41,6 @@ static void RedirectIOConnectionsToSyslog(const ftl::CommandLine& command_line) auto command_line = InitializedCommandLine(); - RedirectIOConnectionsToSyslog(command_line); - // This is about as early as tracing of any kind can start. Add an instant // marker that can be used as a reference for startup. TRACE_EVENT_INSTANT0("flutter", "main");