首页 > 解决方案 > 在 Rust 中使用 BPF 打印堆栈跟踪时缺少/未知符号

问题描述

我正在使用memleak BCC 工具来跟踪我的 Rust 代码中的内存分配,但我注意到我的很多堆栈跟踪似乎不完整或缺少符号名称。阅读 Brendan Gregg 的 BPF 性能工具一书,似乎有两个常见原因是省略了堆栈帧指针和从二进制文件中删除了调试符号。

我相信我已经在我的 Rust 构建中设置了正确的设置来修复这两个:编译我的代码作为RUSTFLAGS="-Cforce-frame-pointers=yes" cargo build --release前者,并在我的 Cargo.toml 中为后者设置以下部分:

[profile.release]
debug = true

这就是file我正在运行/跟踪的二进制文件的原因:

$ file /runner
/runner: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=7238c7fe5546d7420cf8c85a3d3af79136dab6e5, with debug_info, not stripped

不知道这里可能还有什么问题。memleak缺少符号的输出的一些示例:

    16 bytes in 1 allocations from stack
        bytes::bytes::Bytes::copy_from_slice::h77f998d9367a6e1d+0x27
        _$LT$actix_web..handler..ExtractResponse$LT$T$C$S$GT$$u20$as$u20$core..future..future..Future$GT$::poll::hb2514b3babf3ddcd+0x4e9
        _$LT$futures_util..future..future..map..Map$LT$Fut$C$F$GT$$u20$as$u20$core..future..future..Future$GT$::poll::h9193cccfdb6726fa+0x23
        [unknown]
        [unknown]

并且缺少堆栈跟踪:

    16778510 bytes in 1 allocations from stack
        alloc::vec::Vec$LT$T$GT$::extend_from_slice::h17e22096d3c66dad+0x4f
        _$LT$hyper..client..conn..Connection$LT$T$C$B$GT$$u20$as$u20$core..future..future..Future$GT$::poll::h96fcb741ed4c6751+0x58

对于后一点,让我感到困惑的主要事情是为什么堆栈跟踪开始而Connection不是向我展示导致Connection调用的原因?我想知道这是否可能是由于如何在堆栈上跟踪网络请求和/或如何实现 Rust 期货的细节?

标签: rustdebug-symbolsdtracebpfdebug-information

解决方案


推荐阅读