d3b6026bfd
- Filled empty libs/hbb_common/ submodule (cloned from rustdesk/hbb_common) - Patched Flutter 3.44 / Dart 3.12 compatibility: * flutter/lib/generated_bridge.dart: asTypedList with cast<>, DartPort=Int64 * flutter/lib/common.dart: DialogTheme->DialogThemeData, TabBarTheme->TabBarThemeData * flutter/pubspec.yaml: extended_text 14.0.0->15.0.2, google_fonts override 5.0.0 * flutter/macos/Runner/Configs/Release.xcconfig: EXCLUDED_ARCHS=x86_64 - Build verified: cargo check + cargo build --features flutter + cargo build --release --features flutter - Verified flutter build macos --debug and --release both produce working .app - Verified .dmg installer (27MB arm64) created via hdiutil - Build deps: Xcode 26.5, CocoaPods 1.16.2, Flutter 3.44, VCPKG arm64-osx
83 lines
2.3 KiB
Rust
83 lines
2.3 KiB
Rust
#[cfg(target_os = "linux")]
|
|
pub mod linux;
|
|
|
|
#[cfg(target_os = "macos")]
|
|
pub mod macos;
|
|
|
|
#[cfg(target_os = "windows")]
|
|
pub mod windows;
|
|
|
|
#[cfg(not(debug_assertions))]
|
|
use crate::{config::Config, log};
|
|
#[cfg(not(debug_assertions))]
|
|
use std::process::exit;
|
|
|
|
#[cfg(not(debug_assertions))]
|
|
static mut GLOBAL_CALLBACK: Option<Box<dyn Fn()>> = None;
|
|
|
|
#[cfg(not(debug_assertions))]
|
|
extern "C" fn breakdown_signal_handler(sig: i32) {
|
|
let mut stack = vec![];
|
|
backtrace::trace(|frame| {
|
|
backtrace::resolve_frame(frame, |symbol| {
|
|
if let Some(name) = symbol.name() {
|
|
stack.push(name.to_string());
|
|
}
|
|
});
|
|
true // keep going to the next frame
|
|
});
|
|
let mut info = String::default();
|
|
if stack.iter().any(|s| {
|
|
s.contains(&"nouveau_pushbuf_kick")
|
|
|| s.to_lowercase().contains("nvidia")
|
|
|| s.contains("gdk_window_end_draw_frame")
|
|
|| s.contains("glGetString")
|
|
}) {
|
|
Config::set_option("allow-always-software-render".to_string(), "Y".to_string());
|
|
info = "Always use software rendering will be set.".to_string();
|
|
log::info!("{}", info);
|
|
}
|
|
if stack.iter().any(|s| {
|
|
s.to_lowercase().contains("nvidia")
|
|
|| s.to_lowercase().contains("amf")
|
|
|| s.to_lowercase().contains("mfx")
|
|
|| s.contains("cuProfilerStop")
|
|
}) {
|
|
Config::set_option("enable-hwcodec".to_string(), "N".to_string());
|
|
info = "Perhaps hwcodec causing the crash, disable it first".to_string();
|
|
log::info!("{}", info);
|
|
}
|
|
log::error!(
|
|
"Got signal {} and exit. stack:\n{}",
|
|
sig,
|
|
stack.join("\n").to_string()
|
|
);
|
|
if !info.is_empty() {
|
|
#[cfg(target_os = "linux")]
|
|
linux::system_message(
|
|
"RustDesk",
|
|
&format!("Got signal {} and exit.{}", sig, info),
|
|
true,
|
|
)
|
|
.ok();
|
|
}
|
|
unsafe {
|
|
#[allow(static_mut_refs)]
|
|
if let Some(callback) = &GLOBAL_CALLBACK {
|
|
callback()
|
|
}
|
|
}
|
|
exit(0);
|
|
}
|
|
|
|
#[cfg(not(debug_assertions))]
|
|
pub fn register_breakdown_handler<T>(callback: T)
|
|
where
|
|
T: Fn() + 'static,
|
|
{
|
|
unsafe {
|
|
GLOBAL_CALLBACK = Some(Box::new(callback));
|
|
libc::signal(libc::SIGSEGV, breakdown_signal_handler as _);
|
|
}
|
|
}
|