#stack-trace #minidump #thread #information #processor #producing #applications

minidump-processor

一个用于从minidump文件生成堆栈跟踪和其他有用信息的库

31个版本 (15个破坏性版本)

0.22.0 2024年7月3日
0.21.1 2024年3月1日
0.19.1 2023年11月2日
0.17.0 2023年5月17日
0.1.0 2017年12月21日

#184调试

Download history 2043/week @ 2024-05-02 1649/week @ 2024-05-09 2591/week @ 2024-05-16 1787/week @ 2024-05-23 2256/week @ 2024-05-30 1988/week @ 2024-06-06 1859/week @ 2024-06-13 2027/week @ 2024-06-20 1404/week @ 2024-06-27 1755/week @ 2024-07-04 1652/week @ 2024-07-11 1811/week @ 2024-07-18 1882/week @ 2024-07-25 1824/week @ 2024-08-01 1880/week @ 2024-08-08 1800/week @ 2024-08-15

每月下载量7,723
5 仓库中(直接使用4个)使用

MIT 许可证

1.5MB
28K SLoC

minidump-processor

crates.io

一个用于从minidump文件生成堆栈跟踪和其他有用信息的库。这个crate提供API来生成minidump中线程的符号化堆栈跟踪,以及一个类似于Google Breakpad项目中的工具的minidump_stackwalk

JSON模式是稳定的,并在此处进行了文档记录。

如果你想要更底层的minidump内容访问,请使用minidump crate。

对于使用此库的命令行应用程序,请参阅minidump-stackwalk这是minidump-processor的主要和稳定接口,我们推荐大多数生产用户使用。

对于使用此库的GUI应用程序,请参阅minidump-debugger这是一个实验性外部项目。

如果你确实需要将minidump-processor作为库使用,我们仍然推荐使用稳定的JSON输出。原生API工作良好,包含所有相同的信息,我们只是还没有稳定它们,所以更新更有可能导致破坏。以下是一个获取JSON输出的最小示例(使用serde_json解析)

use minidump::Minidump;
use minidump_processor::ProcessorOptions;
use minidump_unwind::{http_symbol_supplier, Symbolizer};
use serde_json::Value;

#[tokio::main]
async fn main() -> Result<(), ()> {
    // Read the minidump
    let dump = Minidump::read_path("../testdata/test.dmp").map_err(|_| ())?;
 
    // Configure the symbolizer and processor
    let symbols_urls = vec![String::from("https://symbols.totallyrealwebsite.org")];
    let symbols_paths = vec![];
    let mut symbols_cache = std::env::temp_dir();
    symbols_cache.push("minidump-cache");
    let symbols_tmp = std::env::temp_dir();
    let timeout = std::time::Duration::from_secs(1000);
 
    // Use ProcessorOptions for detailed configuration
    let options = ProcessorOptions::default();

    // Specify a symbol supplier (here we're using the most powerful one, the http supplier)
    let provider = Symbolizer::new(http_symbol_supplier(
        symbols_paths,
        symbols_urls,
        symbols_cache,
        symbols_tmp,
        timeout,
    ));
 
    let state = minidump_processor::process_minidump_with_options(&dump, &provider, options)
        .await
        .map_err(|_| ())?;

    // Write the JSON output to an arbitrary writer (here, a Vec).
    let mut json_output = Vec::new();
    state.print_json(&mut json_output, false).map_err(|_| ())?;

    // Now parse it (here parsed into an arbitrary JSON Object for max flexibility).
    let json: Value = serde_json::from_slice(&json_output).map_err(|_| ())?;

    // Now read whatever values you want out of it
    if let Some(Value::Number(pid)) = json.get("pid") {
        println!("pid: {}", pid);
    }

    Ok(())
}

依赖

~7-26MB
~401K SLoC