Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions fml/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -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" ]
Expand All @@ -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" ]
}
Expand Down
51 changes: 35 additions & 16 deletions fml/backtrace.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,32 @@

#include "flutter/fml/backtrace.h"

#include <cxxabi.h>
#include <dlfcn.h>
#include <execinfo.h>

#include <csignal>
#include <sstream>

#if FML_OS_WIN
#include <crtdbg.h>
#include <debugapi.h>
#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 <Windows.h>
#include <crtdbg.h>
#include <debugapi.h>
#else // FML_OS_WIN
#include <cxxabi.h>
#include <dlfcn.h>
#include <execinfo.h>
#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;
}
Expand All @@ -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) {
Expand All @@ -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 "";
}
Expand All @@ -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) {
Expand All @@ -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);
}
Expand Down
3 changes: 3 additions & 0 deletions fml/backtrace_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

Expand Down
2 changes: 2 additions & 0 deletions shell/platform/common/accessibility_bridge.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<FlutterPlatformNodeDelegate::OwnerBridge>(
Expand All @@ -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);
}
Expand Down
5 changes: 4 additions & 1 deletion shell/platform/common/accessibility_bridge_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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(),
Expand Down