#tags #applications #crash #extract #processing #identify

releasetag

定义releasetags,最终传播到崩溃文件 'core'

5个版本 (稳定)

使用旧的Rust 2015

1.1.0 2019年5月1日
0.8.0 2017年4月12日
0.7.0 2017年3月16日
0.6.0 2016年9月16日

调试类别中排名第500

每月下载量29

Apache-2.0

12KB
76

releasetag

代码包'releasetag'提供了从崩溃文件中识别发布标签的工具。

Releasetags放置在main()函数的上下文中或任何其他线程的堆栈上。如果应用程序崩溃,则可以从核心转储文件中提取这些标签。

Releasetags可以由一个或多个字节字符串、字节数组或文件包含组成。这些字符串不能包含任何空白字符,如换行符或行终止符。

用例

假设您的软件的多个发布/开发版本已发送给客户。现在客户提交了多个带有核心转储的崩溃报告,但客户提供的关于相关发布的信息不可靠,您需要猜测软件版本。

现在,从每个核心文件中提取releasetag,可以确定相应的软件版本,并从存档中选择正确的调试符号以进一步调查堆栈跟踪。

示例Cargo.toml

...
[dependencies]
releasetag = "^1.1"

示例:文件test/src/main.rs

#[macro_use(releasetag)]
extern crate releasetag;

fn main() {
    releasetag!(b"BUILD_TAG=pre");
    releasetag!(b"BUILD_TAG=",     b"MAIN_2016-wk16-05-AAAA-BBBB-CCCC-DDDD-EEEE-FFFF-GGGG-HHHH-IIII-JJJJ-KKKK");

    // Including data from one or multiple files or compile time env params.
    // Note: the content mustn't contain any newline or linebreak as those would interfer with zero terminated strings!!
    let mut version: [u8; 5] = [0; 5];
    version.copy_from_slice(env!("CARGO_PKG_VERSION").as_bytes());
    releasetag!(b"BUILD_VERSION=", &version);
    releasetag!(b"BUILD_TAG=",     &version, b"/", include_bytes!("../../AUTHOR"));
    
    // or as byte array
    releasetag!(b"BUILD_HOST=",    &[0x30u8, 0x31u8, 0x33u8]);
 
    // your application logic here
}

如果应用程序崩溃,其状态将转储到名为'core'的核心文件中,例如可以使用以下系统命令'strings'从核心文件中提取标签

cat core | strings | grep BUILD_

Releasetags可以由一个或多个字节字符串、字节数组或文件包含组成。这些字符串不能包含任何空白字符,如换行符或行终止符。不支持常规Rust字符串,因为它们可能包含零字符。

releasetag是编译时特性,在运行时没有任何处理。

每个releasetag的开销取决于底层架构和默认整数大小。对于32位架构,开销将是5个字节,对于64位架构,开销将是9个字节,这是由于前导和尾随零填充造成的。

例如,在32位架构上,50个字符的releasetag!将占用55个字节的内存堆栈。

演示者

执行以下脚本以验证releasetag功能是否正常工作

./test/run_test.sh

成功时,输出应显示

aiting until being aborted
...../run_test.sh: line 14: 25494 Aborted                 (core dumped) ./target/release/test-tag
BUILD_HOST=013
BUILD_VERSION=1.1.0
BUILD_TAG=pre
BUILD_TAG=1.1.0/frehberg@gmail.com
BUILD_TAG=MAIN_2016-wk16-05-AAAA-BBBB-CCCC-DDDD-EEEE-FFFF-GGGG-HHHH-IIII-JJJJ-KKKK
Success: releasetags found in file 'core'

演示说明

脚本 test/run_test.sh 正在用 'release' 标志编译应用程序 'test-tag'。此测试的目的是验证 release 标签元素在编译过程中是否能够通过 'release' 优化器。脚本 ./test/run_test.sh 正在评估 release 标签功能的正确性。

应用程序 test-tag 包含多个 release 标签 BUILD_HOST=.. 和 BUILD_TAG=..

几秒钟后,脚本继续向进程发送信号 6(ABORT),导致应用程序因信号 6 而产生 core-dump。core 文件的位置将是 'test/core'。

将生成的 core 文件扫描以查找 'BUILD_' 字符串。

成功时,脚本将以返回值 0 退出,否则功能损坏,返回值将为 1。

无运行时依赖