rust - 在 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 期货的细节?
解决方案
推荐阅读
- python - 为什么 PyCharm 抱怨 `Expected type 'Tag', got 'str' instead`?
- r - 闪亮的问题:图表不显示何时更新输入(加上一些错误)
- sql - 在 pl/sql 中将数据从游标添加到表时出现“不允许列”错误
- python - 无法生成 Azure CustomerProvidedEncryptionKey (cpk)
- multithreading - 如何加快 NumPy 中大量小协方差的计算?
- python - Python 替代 Java DataFlow 流代码
- swift - SwiftUI:从核心数据中获取一个洗牌的数组
- python - 用 bs4 解析价格
- flutter - Google Fit Oauth 卡在加载中
- javascript - 如何更改实时数据库中数据的位置