最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust捕獲全局panic并記錄進程退出日志的方法

 更新時間:2024年04月24日 09:25:00   作者:會編程的大白熊  
本文提供了捕獲全局panic并記錄進程退出日志的方法,首先使用 panic::set_hook 注冊異常處理及panic 觸發(fā)異常,結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

本文提供了捕獲全局panic并記錄進程退出日志的方法。

1. 使用 panic::set_hook 注冊異常處理

use human_panic::setup_panic;
use log::error;
use std::{boxed::Box, panic};
fn hook(panic_info: &panic::PanicInfo) {
    if cfg!(debug_assertions) {
        let err_message = format!("panic occurred {:?}", panic_info);
        error!("{}", err_message);
    } else {
        let err_message = match panic_info.payload().downcast_ref::<&str>() {
            Option::Some(&str) => {
                let err_message = format!(
                    "panic info: {:?}, occurred in {:?}",
                    str,
                    panic_info.location()
                );
                err_message
            }
            Option::None => {
                let err_message =
                    format!("panic occurred in {:?}", panic_info.location());
                err_message
            }
        };
        error!("{}", err_message);
    }
}
/// 注冊異常處理函數(shù)
/// 在panic發(fā)出后,在panic運行時之前,觸發(fā)鉤子函數(shù)去處理這個panic信息。
/// panic信息被保存在PanicInfo結(jié)構體中。
pub fn register_panic_hook() {
    panic::set_hook(Box::new(|panic_info| {
        hook(panic_info);
    }));
    // setup_panic!();
}

2. panic 觸發(fā)異常

use core_utils::panic::register_panic_hook;
use core_utils::panic::register_panic_hook;
use env_logger;
use log::LevelFilter;
use std::thread;
use std::time::Duration;
#[test]
fn test_panic_set_hook() {
    let _ = env_logger::builder()
        .is_test(true)
        .filter(None, LevelFilter::Debug)
        .try_init();
    register_panic_hook();
    thread::spawn(|| {
        panic!("child thread panic");
    });
    thread::sleep(Duration::from_millis(100));
}

日志如下

debug模式

[2024-04-20T05:32:30Z ERROR core_utils::panic] panic occurred PanicInfo { payload: Any { .. }, message: Some(child thread panic), location: Location { file: "core_utils/tests/test_panic.rs", line: 16, col: 9 }, can_unwind: true, force_no_backtrace: false }

release模式

[2024-04-20T05:41:06Z ERROR core_utils::panic] panic info: "child thread panic", occurred in Some(Location { file: "core_utils/tests/test_panic.rs", line: 17, col: 9 })

3. unwrap 觸發(fā)異常

#[test]
fn test_panic_unwrap() {
    let _ = env_logger::builder()
        .is_test(true)
        .filter(None, LevelFilter::Debug)
        .try_init();
    register_panic_hook();
    thread::spawn(|| {
        let _ = "abc".parse::<i32>().unwrap();
    });
    thread::sleep(Duration::from_millis(100));
}

日志如下

debug模式

[2024-04-20T05:38:22Z ERROR core_utils::panic] panic occurred PanicInfo { payload: Any { .. }, message: Some(called `Result::unwrap()` on an `Err` value: ParseIntError { kind: InvalidDigit }), location: Location { file: "core_utils/tests/test_panic.rs", line: 33, col: 38 }, can_unwind: true, force_no_backtrace: false }

release模式

注意:unwrap觸發(fā)的異常會導致 panic_info.payload().downcast_ref::<&str>()返回結(jié)果為 None

[2024-04-20T05:42:34Z ERROR core_utils::panic] panic occurred in Some(Location { file: "core_utils/tests/test_panic.rs", line: 33, col: 38 })

4. 使用 human_panic

human_panic只能在非debug模式且環(huán)境變量RUST_BACKTRACE未設置的情況下才會生效。

注冊 hook

use human_panic::setup_panic;
pub fn register_panic_hook() {
    setup_panic!();
}

模擬release環(huán)境異常

use core_utils::panic::register_panic_hook;
use env_logger;
use human_panic::setup_panic;
use log::error;
use std::thread;
use std::time::Duration;
fn main() {
    env_logger::init();
    register_panic_hook();
    thread::spawn(|| {
        panic!("error");
        // let _ = "abc".parse::<i32>().unwrap();
    });
    thread::sleep(Duration::from_secs(1));
}
cargo run --bin human_panic --release

panic發(fā)生時會在在臨時文件夾下面創(chuàng)建一個報告文件

Well, this is embarrassing.
core_utils had a problem and crashed. To help us diagnose the problem you can send us a crash report.
We have generated a report file at "/var/folders/gx/hn6l2rd56cx0lcwnkblxqvmr0000gn/T/report-93547ab5-9341-4212-a9af-6d2f17d6311d.toml". Submit an issue or email with the subject of "core_utils Crash Report" and include the report as an attachment.
We take privacy seriously, and do not perform any automated error collection. In order to improve the software, we rely on people to submit reports.
Thank you kindly!

報告內(nèi)容如下

"name" = "core_utils"
"operating_system" = "Mac OS 14.1.1 [64-bit]"
"crate_version" = "0.1.0"
"explanation" = """
Panic occurred in file 'core_utils/src/bin/human_panic.rs' at line 14
"""
"cause" = "error"
"method" = "Panic"
"backtrace" = """
   0: 0x105b840a5 - core::panicking::panic_fmt::h2aac8cf45f7ae617
   1: 0x1059fd7c6 - std::sys_common::backtrace::__rust_begin_short_backtrace::h4bae865db206eae3
   2: 0x1059fe2fd - core::ops::function::FnOnce::call_once{{vtable.shim}}::ha8d441119e8b7a5a
   3: 0x105b5a819 - std::sys::pal::unix::thread::Thread::new::thread_start::h679ffa03f8a73496
   4: 0x7ff801993202 - __pthread_start"""

到此這篇關于Rust捕獲全局panic并記錄進程退出日志的文章就介紹到這了,更多相關rust 捕獲全局panic內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • rust使用Atomic創(chuàng)建全局變量和使用操作方法

    rust使用Atomic創(chuàng)建全局變量和使用操作方法

    從 Rust1.34 版本后,就正式支持原子類型,原子指的是一系列不可被 CPU 上下文交換的機器指令,這些指令組合在一起就形成了原子操作,這篇文章主要介紹了rust使用Atomic創(chuàng)建全局變量和使用,需要的朋友可以參考下
    2024-05-05
  • Rust 中判斷兩個 HashMap 是否相等

    Rust 中判斷兩個 HashMap 是否相等

    在Rust標準庫中,HashMap 實現(xiàn)了 PartialEq 和 Eq trait,但是這些trait的實現(xiàn)是基于嚴格的結(jié)構相等性,包括元素的順序,這篇文章主要介紹了Rust 中判斷兩個 HashMap 是否相等,需要的朋友可以參考下
    2024-04-04
  • Rust時間庫Chrono最佳使用實踐

    Rust時間庫Chrono最佳使用實踐

    本文介紹了Rust中常用的日期時間處理庫chrono,對比了標準庫std::time和chrono的功能和適用場景,并詳細講解了chrono的核心數(shù)據(jù)類型、主要操作、進階功能以及最佳實踐,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Rust字符串深度解析String與str的問題小結(jié)

    Rust字符串深度解析String與str的問題小結(jié)

    在Rust編程語言中,字符串處理是一個核心概念,但與其他語言不同的是,Rust提供了兩種主要的字符串類型:String和&str,本文介紹Rust字符串深度解析String與str的問題,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • Rust中引用的具體使用

    Rust中引用的具體使用

    在Rust語言中,引用機制是其所有權系統(tǒng)的重要組成部分,ust提供了兩種類型的引用,不可變引用和可變引用,本文就來詳細的介紹一下這兩種的用法,感興趣的可以了解一下
    2024-03-03
  • Rust中的Copy和Clone對比分析

    Rust中的Copy和Clone對比分析

    這篇文章主要介紹了Rust中的Copy和Clone及區(qū)別對比分析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Rust模塊關鍵詞和哈希表詳解

    Rust模塊關鍵詞和哈希表詳解

    文章介紹了Rust編程語言中模塊系統(tǒng)、路徑控制、as關鍵字、外部包的使用以及哈希表的操作,主要涵蓋了如何通過pub關鍵字控制模塊和結(jié)構體的可見性,文章還詳細講解了哈希表的創(chuàng)建、訪問、所有權轉(zhuǎn)移、更新操作,感興趣的朋友一起看看吧
    2026-03-03
  • Rust編譯錯誤:link.exe?未找到解決辦法

    Rust編譯錯誤:link.exe?未找到解決辦法

    這篇文章主要介紹了Rust編譯錯誤:link.exe?未找到解決辦法的相關資料,這個錯誤通常是由于系統(tǒng)中缺少必要的編譯工具或配置不正確導致的,文中將解決方案介紹的非常詳細,需要的朋友可以參考下
    2026-02-02
  • 詳解Rust調(diào)用tree-sitter支持自定義語言解析

    詳解Rust調(diào)用tree-sitter支持自定義語言解析

    使用Rust語言結(jié)合tree-sitter庫解析自定義語言需要定義語法、生成C解析器,并在Rust項目中集成,具體步驟包括創(chuàng)建grammar.js定義語法,使用tree-sitter-cli工具生成C解析器,以及在Rust項目中編寫代碼調(diào)用解析器,這一過程涉及到對tree-sitter的深入理解和Rust語言的應用技巧
    2024-09-09
  • Rust中::和.的區(qū)別解析

    Rust中::和.的區(qū)別解析

    Rust中的::和.是兩種常用的操作符,分別用于訪問命名空間中的成員和實例的字段或方法,感興趣的朋友跟隨小編一起看看吧
    2024-11-11

最新評論

磴口县| 长沙市| 鄱阳县| 莱阳市| 临海市| 武陟县| 长武县| 安平县| 乾安县| 太保市| 新闻| 沾化县| 会同县| 洪江市| 鄂州市| 恩施市| 娄底市| 通许县| 繁昌县| 青岛市| 阿鲁科尔沁旗| 外汇| 南郑县| 梓潼县| 长汀县| 柳河县| 游戏| 玛曲县| 平安县| 偃师市| 河曲县| 湾仔区| 固原市| 翁源县| 睢宁县| 兴海县| 上虞市| 北京市| 桃江县| 汾阳市| 黄冈市|