Bug 1923782 - Include minidump-analyzer library on android r=glandium,geckoview-reviewers,owlish,gsvelto
Differential Revision: https://phabricator.services.mozilla.com/D225787
This commit is contained in:
9
Cargo.lock
generated
9
Cargo.lock
generated
@@ -3882,6 +3882,14 @@ dependencies = [
|
|||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "minidump-analyzer-export"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"minidump-analyzer",
|
||||||
|
"mozilla-central-workspace-hack",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "minidump-common"
|
name = "minidump-common"
|
||||||
version = "0.22.1"
|
version = "0.22.1"
|
||||||
@@ -4068,6 +4076,7 @@ dependencies = [
|
|||||||
"futures",
|
"futures",
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
|
"futures-executor",
|
||||||
"futures-sink",
|
"futures-sink",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"getrandom",
|
"getrandom",
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ members = [
|
|||||||
"testing/geckodriver",
|
"testing/geckodriver",
|
||||||
"toolkit/components/uniffi-bindgen-gecko-js",
|
"toolkit/components/uniffi-bindgen-gecko-js",
|
||||||
"toolkit/crashreporter/client/app",
|
"toolkit/crashreporter/client/app",
|
||||||
|
"toolkit/crashreporter/minidump-analyzer/android/export",
|
||||||
"toolkit/crashreporter/mozwer-rust",
|
"toolkit/crashreporter/mozwer-rust",
|
||||||
"toolkit/crashreporter/rust_minidump_writer_linux",
|
"toolkit/crashreporter/rust_minidump_writer_linux",
|
||||||
"toolkit/library/gtest/rust",
|
"toolkit/library/gtest/rust",
|
||||||
|
|||||||
@@ -242,6 +242,7 @@ http3server = ["dep:arrayvec", "dep:bindgen", "dep:bitflags", "dep:bytes", "dep:
|
|||||||
ipcclientcerts-static = ["dep:bindgen", "dep:bitflags", "dep:itertools", "dep:memchr", "dep:nom", "dep:regex"]
|
ipcclientcerts-static = ["dep:bindgen", "dep:bitflags", "dep:itertools", "dep:memchr", "dep:nom", "dep:regex"]
|
||||||
jsrust = ["dep:arrayvec", "dep:cc", "dep:env_logger", "dep:getrandom", "dep:hashbrown", "dep:icu_locid", "dep:icu_properties", "dep:indexmap", "dep:log", "dep:memchr", "dep:num-traits", "dep:once_cell", "dep:semver", "dep:smallvec", "dep:stable_deref_trait", "dep:tinystr", "dep:unicode-bidi", "dep:url", "dep:yoke", "dep:zerofrom", "dep:zerovec"]
|
jsrust = ["dep:arrayvec", "dep:cc", "dep:env_logger", "dep:getrandom", "dep:hashbrown", "dep:icu_locid", "dep:icu_properties", "dep:indexmap", "dep:log", "dep:memchr", "dep:num-traits", "dep:once_cell", "dep:semver", "dep:smallvec", "dep:stable_deref_trait", "dep:tinystr", "dep:unicode-bidi", "dep:url", "dep:yoke", "dep:zerofrom", "dep:zerovec"]
|
||||||
minidump-analyzer = ["dep:clap", "dep:env_logger", "dep:futures-executor", "dep:futures-util", "dep:log", "dep:serde_json", "dep:windows-sys"]
|
minidump-analyzer = ["dep:clap", "dep:env_logger", "dep:futures-executor", "dep:futures-util", "dep:log", "dep:serde_json", "dep:windows-sys"]
|
||||||
|
minidump-analyzer-export = ["minidump-analyzer"]
|
||||||
mozwer_s = ["dep:getrandom", "dep:hashbrown", "dep:indexmap", "dep:log", "dep:once_cell", "dep:scroll", "dep:serde_json", "dep:uuid", "dep:windows-sys"]
|
mozwer_s = ["dep:getrandom", "dep:hashbrown", "dep:indexmap", "dep:log", "dep:once_cell", "dep:scroll", "dep:serde_json", "dep:uuid", "dep:windows-sys"]
|
||||||
nmhproxy = ["dep:bitflags", "dep:hashbrown", "dep:icu_locid", "dep:icu_properties", "dep:indexmap", "dep:once_cell", "dep:serde_json", "dep:smallvec", "dep:stable_deref_trait", "dep:tinystr", "dep:unicode-bidi", "dep:url", "dep:windows-sys", "dep:yoke", "dep:zerofrom", "dep:zerovec"]
|
nmhproxy = ["dep:bitflags", "dep:hashbrown", "dep:icu_locid", "dep:icu_properties", "dep:indexmap", "dep:once_cell", "dep:serde_json", "dep:smallvec", "dep:stable_deref_trait", "dep:tinystr", "dep:unicode-bidi", "dep:url", "dep:windows-sys", "dep:yoke", "dep:zerofrom", "dep:zerovec"]
|
||||||
osclientcerts-static = ["dep:bindgen", "dep:bitflags", "dep:core-foundation-sys", "dep:env_logger", "dep:itertools", "dep:log", "dep:memchr", "dep:nom", "dep:regex"]
|
osclientcerts-static = ["dep:bindgen", "dep:bitflags", "dep:core-foundation-sys", "dep:env_logger", "dep:itertools", "dep:log", "dep:memchr", "dep:nom", "dep:regex"]
|
||||||
|
|||||||
@@ -79,6 +79,10 @@
|
|||||||
@BINPATH@/@DLL_PREFIX@gvr@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@gvr@DLL_SUFFIX@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef MOZ_CRASHREPORTER
|
||||||
|
@BINPATH@/@DLL_PREFIX@minidump_analyzer@DLL_SUFFIX@
|
||||||
|
#endif
|
||||||
|
|
||||||
[xpcom]
|
[xpcom]
|
||||||
@BINPATH@/package-name.txt
|
@BINPATH@/package-name.txt
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[package]
|
||||||
|
name = "minidump-analyzer-export"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "minidump_analyzer_export"
|
||||||
|
crate-type = ["staticlib"]
|
||||||
|
path = "lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
minidump-analyzer = { path = "../../" }
|
||||||
|
mozilla-central-workspace-hack = { version = "0.1", features = ["minidump-analyzer-export"], optional = true }
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
use minidump_analyzer::MinidumpAnalyzer;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct Utf16String {
|
||||||
|
chars: *mut u16,
|
||||||
|
len: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Utf16String {
|
||||||
|
pub fn empty() -> Self {
|
||||||
|
Utf16String {
|
||||||
|
chars: std::ptr::null_mut(),
|
||||||
|
len: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_string_lossy(&self) -> String {
|
||||||
|
if self.chars.is_null() {
|
||||||
|
String::default()
|
||||||
|
} else {
|
||||||
|
String::from_utf16_lossy(unsafe { std::slice::from_raw_parts(self.chars, self.len) })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for Utf16String {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
if !self.chars.is_null() {
|
||||||
|
// # Safety
|
||||||
|
// We only own Utf16Strings which are created in Rust code, so when dropping, the
|
||||||
|
// memory is that which we allocated (and thus is safe to deallocate).
|
||||||
|
unsafe {
|
||||||
|
std::alloc::dealloc(
|
||||||
|
self.chars as *mut u8,
|
||||||
|
// unwrap() because the memory must have been a size that doesn't overflow when
|
||||||
|
// it was originally allocated.
|
||||||
|
std::alloc::Layout::array::<u16>(self.len).unwrap(),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Utf16String {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::empty()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<String> for Utf16String {
|
||||||
|
fn from(value: String) -> Self {
|
||||||
|
let utf16: Box<[u16]> = value.encode_utf16().collect();
|
||||||
|
let utf16 = Box::leak(utf16);
|
||||||
|
Utf16String {
|
||||||
|
chars: utf16.as_mut_ptr(),
|
||||||
|
len: utf16.len(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn minidump_analyzer_analyze(
|
||||||
|
minidump_path: &Utf16String,
|
||||||
|
extras_path: &Utf16String,
|
||||||
|
all_threads: bool,
|
||||||
|
) -> Utf16String {
|
||||||
|
let minidump_path = minidump_path.as_string_lossy();
|
||||||
|
let extras_path = extras_path.as_string_lossy();
|
||||||
|
MinidumpAnalyzer::new(minidump_path.as_ref())
|
||||||
|
.extras_file(extras_path.as_ref())
|
||||||
|
.all_threads(all_threads)
|
||||||
|
.analyze()
|
||||||
|
.err()
|
||||||
|
.map(|e| e.to_string().into())
|
||||||
|
.unwrap_or_default()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn minidump_analyzer_free_result(result: Utf16String) {
|
||||||
|
// This will happen anyway, but we're explicit about it for clarity.
|
||||||
|
drop(result);
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
RustLibrary("minidump-analyzer-export")
|
||||||
65
toolkit/crashreporter/minidump-analyzer/android/lib.cpp
Normal file
65
toolkit/crashreporter/minidump-analyzer/android/lib.cpp
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <jni.h>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct Utf16String {
|
||||||
|
const uint16_t* chars;
|
||||||
|
size_t len;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
Utf16String minidump_analyzer_analyze(const Utf16String& minidump_path,
|
||||||
|
const Utf16String& extras_path,
|
||||||
|
bool all_threads);
|
||||||
|
void minidump_analyzer_free_result(Utf16String result);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LocalString : Utf16String {
|
||||||
|
LocalString(JNIEnv* env, jstring str) : env(env), str(str) {
|
||||||
|
chars = env->GetStringChars(str, nullptr);
|
||||||
|
len = env->GetStringLength(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
~LocalString() { env->ReleaseStringChars(str, chars); }
|
||||||
|
|
||||||
|
LocalString(const LocalString&) = delete;
|
||||||
|
LocalString& operator=(const LocalString&) = delete;
|
||||||
|
|
||||||
|
JNIEnv* env;
|
||||||
|
jstring str;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ForeignString : Utf16String {
|
||||||
|
ForeignString(Utf16String s) : Utf16String(s) {}
|
||||||
|
~ForeignString() { minidump_analyzer_free_result(*this); }
|
||||||
|
|
||||||
|
ForeignString(const ForeignString&) = delete;
|
||||||
|
ForeignString& operator=(const ForeignString&) = delete;
|
||||||
|
|
||||||
|
explicit operator bool() const { return chars != nullptr; }
|
||||||
|
|
||||||
|
jstring to_jstring(JNIEnv* env) const { return env->NewString(chars, len); }
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
JNIEXPORT jstring JNICALL
|
||||||
|
Java_mozilla_components_lib_crash_MinidumpAnalyzer_analyze(
|
||||||
|
JNIEnv* env, jobject obj, jstring minidump_path, jstring extras_path,
|
||||||
|
jboolean all_threads) {
|
||||||
|
LocalString minidump_str(env, minidump_path);
|
||||||
|
LocalString extras_str(env, extras_path);
|
||||||
|
if (auto error = ForeignString(
|
||||||
|
minidump_analyzer_analyze(minidump_str, extras_str, all_threads))) {
|
||||||
|
return error.to_jstring(env);
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
DIRS += ["export"]
|
||||||
|
USE_LIBS += ["minidump-analyzer-export"]
|
||||||
|
# libm log/logf are required by the rust static library
|
||||||
|
OS_LIBS += ["m"]
|
||||||
|
|
||||||
|
SOURCES += ["lib.cpp"]
|
||||||
|
SharedLibrary("minidump_analyzer")
|
||||||
@@ -66,6 +66,9 @@ if CONFIG["MOZ_CRASHREPORTER"]:
|
|||||||
if CONFIG["OS_TARGET"] != "Android":
|
if CONFIG["OS_TARGET"] != "Android":
|
||||||
DIRS += ["client/app"]
|
DIRS += ["client/app"]
|
||||||
|
|
||||||
|
if CONFIG["OS_TARGET"] == "Android":
|
||||||
|
DIRS += ["minidump-analyzer/android"]
|
||||||
|
|
||||||
DIRS += [
|
DIRS += [
|
||||||
"mozannotation_client",
|
"mozannotation_client",
|
||||||
"mozannotation_server",
|
"mozannotation_server",
|
||||||
|
|||||||
Reference in New Issue
Block a user