我正在使用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 期货的细节?