From deffbb1794dc294599701d8b9d8ef259286a53e8 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 22 Jan 2019 10:00:39 -0800 Subject: [PATCH] Add error logging to GLFW and Flutter setup Add error logging when starting the Flutter engine fails (on all platforms), and on GLFW errors. Also exit early with error logging for unrecoverable errors in the GLFW implementation. Fixes #241. --- example/linux_fde/flutter_embedder_example.cc | 4 +++- example/windows_fde/flutter_embedder_example.cpp | 4 +++- library/common/glfw/embedder.cc | 14 +++++++++++--- library/macos/FLEViewController.m | 10 +++++++--- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/example/linux_fde/flutter_embedder_example.cc b/example/linux_fde/flutter_embedder_example.cc index d231cb498..cfbd64f3e 100644 --- a/example/linux_fde/flutter_embedder_example.cc +++ b/example/linux_fde/flutter_embedder_example.cc @@ -54,7 +54,8 @@ std::string GetExecutableDirectory() { int main(int argc, char **argv) { if (!flutter_desktop_embedding::FlutterInit()) { - std::cerr << "Couldn't init GLFW" << std::endl; + std::cerr << "Unable to init GLFW; exiting." << std::endl; + return EXIT_FAILURE; } // Resources are located relative to the executable. @@ -76,6 +77,7 @@ int main(int argc, char **argv) { 640, 480, assets_path, icu_data_path, arguments); if (window == nullptr) { flutter_desktop_embedding::FlutterTerminate(); + std::cerr << "Unable to create Flutter window; exiting." << std::endl; return EXIT_FAILURE; } diff --git a/example/windows_fde/flutter_embedder_example.cpp b/example/windows_fde/flutter_embedder_example.cpp index 89eb21fb8..9ea8d70a7 100644 --- a/example/windows_fde/flutter_embedder_example.cpp +++ b/example/windows_fde/flutter_embedder_example.cpp @@ -19,7 +19,8 @@ int main(int argc, char **argv) { if (!flutter_desktop_embedding::FlutterInit()) { - std::cout << "Couldn't init GLFW" << std::endl; + std::cerr << "Unable to init GLFW; exiting." << std::endl; + return EXIT_FAILURE; } // Arguments for the Flutter Engine. std::vector arguments; @@ -33,6 +34,7 @@ int main(int argc, char **argv) { "..\\..\\library\\windows\\dependencies\\engine\\icudtl.dat", arguments); if (window == nullptr) { flutter_desktop_embedding::FlutterTerminate(); + std::cerr << "Unable to create Flutter window; exiting." << std::endl; return EXIT_FAILURE; } diff --git a/library/common/glfw/embedder.cc b/library/common/glfw/embedder.cc index b5d926940..17eada1a0 100644 --- a/library/common/glfw/embedder.cc +++ b/library/common/glfw/embedder.cc @@ -239,6 +239,10 @@ static void *GLFWProcResolver(void *user_data, const char *name) { return reinterpret_cast(glfwGetProcAddress(name)); } +static void GLFWErrorCallback(int error_code, const char *description) { + std::cerr << "GLFW error " << error_code << ": " << description << std::endl; +} + // Spins up an instance of the Flutter Engine. // // This function launches the Flutter Engine in a background thread, supplying @@ -276,6 +280,8 @@ static FlutterEngine RunFlutterEngine( auto result = FlutterEngineRun(FLUTTER_ENGINE_VERSION, &config, &args, window, &engine); if (result != kSuccess || engine == nullptr) { + std::cerr << "Failed to start Flutter engine: error " << result + << std::endl; return nullptr; } return engine; @@ -283,10 +289,12 @@ static FlutterEngine RunFlutterEngine( namespace flutter_desktop_embedding { -// Initialize glfw -bool FlutterInit() { return glfwInit(); } +bool FlutterInit() { + // Before making any GLFW calls, set up a logging error handler. + glfwSetErrorCallback(GLFWErrorCallback); + return glfwInit(); +} -// Tear down glfw void FlutterTerminate() { glfwTerminate(); } PluginRegistrar *GetRegistrarForPlugin(GLFWwindow *flutter_window, diff --git a/library/macos/FLEViewController.m b/library/macos/FLEViewController.m index ec93a6c07..7a14ededa 100644 --- a/library/macos/FLEViewController.m +++ b/library/macos/FLEViewController.m @@ -297,10 +297,14 @@ - (BOOL)launchEngineInternalWithAssetsPath:(NSURL *)assets flutterArguments.command_line_argv = argv; flutterArguments.platform_message_callback = (FlutterPlatformMessageCallback)OnPlatformMessage; - BOOL result = FlutterEngineRun(FLUTTER_ENGINE_VERSION, &config, &flutterArguments, - (__bridge void *)(self), &_engine) == kSuccess; + FlutterResult result = FlutterEngineRun(FLUTTER_ENGINE_VERSION, &config, &flutterArguments, + (__bridge void *)(self), &_engine); free(argv); - return result; + if (result != kSuccess) { + NSLog(@"Failed to start Flutter engine: error %d", result); + return NO; + } + return YES; } + (FlutterRendererConfig)createRenderConfigHeadless:(BOOL)headless {