diff --git a/fml/BUILD.gn b/fml/BUILD.gn index f7b5be3dc6a62..e9de9f2b36d53 100644 --- a/fml/BUILD.gn +++ b/fml/BUILD.gn @@ -96,7 +96,7 @@ source_set("fml") { "wakeable.h", ] - if (is_mac || is_linux || (is_ios && is_debug)) { + if (is_mac || is_linux || is_win || (is_ios && is_debug)) { sources += [ "backtrace.cc" ] } else { sources += [ "backtrace_stub.cc" ] @@ -115,7 +115,7 @@ source_set("fml") { "//third_party/icu", ] - if (is_mac || is_linux || (is_ios && is_debug)) { + if (is_mac || is_linux || is_win || (is_ios && is_debug)) { # This abseil dependency is only used by backtrace.cc. deps += [ "//third_party/abseil-cpp/absl/debugging:symbolize" ] } diff --git a/fml/backtrace.cc b/fml/backtrace.cc index 34b0ef06b146b..e9eaed61ebdfc 100644 --- a/fml/backtrace.cc +++ b/fml/backtrace.cc @@ -4,27 +4,32 @@ #include "flutter/fml/backtrace.h" -#include -#include -#include - #include #include -#if FML_OS_WIN -#include -#include -#endif - +#include "flutter/fml/build_config.h" #include "flutter/fml/logging.h" #include "flutter/fml/paths.h" #include "third_party/abseil-cpp/absl/debugging/symbolize.h" +#ifdef FML_OS_WIN +#include +#include +#include +#else // FML_OS_WIN +#include +#include +#include +#endif // FML_OS_WIN + namespace fml { static std::string kKUnknownFrameName = "Unknown"; static std::string DemangleSymbolName(const std::string& mangled) { +#if FML_OS_WIN + return mangled; +#else if (mangled == kKUnknownFrameName) { return kKUnknownFrameName; } @@ -44,6 +49,7 @@ static std::string DemangleSymbolName(const std::string& mangled) { auto demangled_string = std::string{demangled, length}; free(demangled); return demangled_string; +#endif // FML_OS_WIN } static std::string GetSymbolName(void* symbol) { @@ -55,10 +61,18 @@ static std::string GetSymbolName(void* symbol) { return DemangleSymbolName({name}); } +static int Backtrace(void** symbols, int size) { +#if FML_OS_WIN + return CaptureStackBackTrace(0, size, symbols, NULL); +#else + return ::backtrace(symbols, size); +#endif // FML_OS_WIN +} + std::string BacktraceHere(size_t offset) { constexpr size_t kMaxFrames = 256; void* symbols[kMaxFrames]; - const auto available_frames = ::backtrace(symbols, kMaxFrames); + const auto available_frames = Backtrace(symbols, kMaxFrames); if (available_frames <= 0) { return ""; } @@ -74,12 +88,15 @@ std::string BacktraceHere(size_t offset) { static size_t kKnownSignalHandlers[] = { SIGABRT, // abort program SIGFPE, // floating-point exception - SIGBUS, // bus error + SIGTERM, // software termination signal SIGSEGV, // segmentation violation +#if !FML_OS_WIN + SIGBUS, // bus error SIGSYS, // non-existent system call invoked SIGPIPE, // write on a pipe with no reader SIGALRM, // real-time timer expired - SIGTERM, // software termination signal + +#endif // !FML_OS_WIN }; static std::string SignalNameToString(int signal) { @@ -88,18 +105,20 @@ static std::string SignalNameToString(int signal) { return "SIGABRT"; case SIGFPE: return "SIGFPE"; - case SIGBUS: - return "SIGBUS"; case SIGSEGV: return "SIGSEGV"; + case SIGTERM: + return "SIGTERM"; +#if !FML_OS_WIN + case SIGBUS: + return "SIGBUS"; case SIGSYS: return "SIGSYS"; case SIGPIPE: return "SIGPIPE"; case SIGALRM: return "SIGALRM"; - case SIGTERM: - return "SIGTERM"; +#endif // !FML_OS_WIN }; return std::to_string(signal); } diff --git a/fml/backtrace_unittests.cc b/fml/backtrace_unittests.cc index f3b2a64114e5f..fb858bc4556db 100644 --- a/fml/backtrace_unittests.cc +++ b/fml/backtrace_unittests.cc @@ -19,18 +19,21 @@ TEST(BacktraceTest, CanGatherBacktrace) { auto trace = BacktraceHere(0); ASSERT_GT(trace.size(), 0u); ASSERT_NE(trace.find("Frame 0"), std::string::npos); + std::cout << trace << std::endl; } { auto trace = BacktraceHere(1); ASSERT_GT(trace.size(), 0u); ASSERT_NE(trace.find("Frame 0"), std::string::npos); + std::cout << trace << std::endl; } { auto trace = BacktraceHere(2); ASSERT_GT(trace.size(), 0u); ASSERT_NE(trace.find("Frame 0"), std::string::npos); + std::cout << trace << std::endl; } } diff --git a/shell/platform/common/accessibility_bridge.cc b/shell/platform/common/accessibility_bridge.cc index 3a050a5a415f9..a1438a09047de 100644 --- a/shell/platform/common/accessibility_bridge.cc +++ b/shell/platform/common/accessibility_bridge.cc @@ -143,6 +143,7 @@ void AccessibilityBridge::OnRoleChanged(ui::AXTree* tree, void AccessibilityBridge::OnNodeCreated(ui::AXTree* tree, ui::AXNode* node) { BASE_DCHECK(node); + BASE_DCHECK(false); id_wrapper_map_[node->id()] = delegate_->CreateFlutterPlatformNodeDelegate(); id_wrapper_map_[node->id()]->Init( std::static_pointer_cast( @@ -153,6 +154,7 @@ void AccessibilityBridge::OnNodeCreated(ui::AXTree* tree, ui::AXNode* node) { void AccessibilityBridge::OnNodeDeleted(ui::AXTree* tree, AccessibilityNodeId node_id) { BASE_DCHECK(node_id != ui::AXNode::kInvalidAXID); + BASE_CHECK(false); if (id_wrapper_map_.find(node_id) != id_wrapper_map_.end()) { id_wrapper_map_.erase(node_id); } diff --git a/shell/platform/common/accessibility_bridge_unittests.cc b/shell/platform/common/accessibility_bridge_unittests.cc index 41834b107a44b..6b80ee79c417a 100644 --- a/shell/platform/common/accessibility_bridge_unittests.cc +++ b/shell/platform/common/accessibility_bridge_unittests.cc @@ -284,6 +284,8 @@ TEST(AccessibilityBridgeTest, doesNotAssignEditableRootToSelectableText) { root.custom_accessibility_actions_count = 0; bridge->AddFlutterSemanticsNodeUpdate(&root); + bridge = nullptr; + bridge->CommitUpdates(); auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(0).lock(); @@ -333,6 +335,8 @@ TEST(AccessibilityBridgeTest, SliderHasSliderRole) { bridge->AddFlutterSemanticsNodeUpdate(&root); bridge->CommitUpdates(); + assert(false); + auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(0).lock(); EXPECT_EQ(root_node->GetData().role, ax::mojom::Role::kSlider); } @@ -361,7 +365,6 @@ TEST(AccessibilityBridgeTest, CanSetCheckboxChecked) { bridge->AddFlutterSemanticsNodeUpdate(&root); bridge->CommitUpdates(); - auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(0).lock(); EXPECT_EQ(root_node->GetData().role, ax::mojom::Role::kCheckBox); EXPECT_EQ(root_node->GetData().GetCheckedState(),