
Heaptrack跟踪所有内存分配,并用堆栈跟踪注释这些事件。 专用分析工具随后允许您解释堆内存配置文件,以便:
推荐的方法是启动应用程序并从一开始就开始跟踪:
heaptrack <你的应用程序及其参数>
heaptrack输出将写入"/tmp/heaptrack.APP.PID.gz"
正在启动应用程序,这可能需要一些时间...
...
heaptrack统计:
分配: 65
泄漏分配: 60
临时分配: 1
Heaptrack完成!现在运行以下命令来调查数据:
heaptrack --analyze "/tmp/heaptrack.APP.PID.gz"
或者,您可以附加到已经运行的进程:
heaptrack --pid $(pidof <你的应用程序>)
heaptrack输出将写入"/tmp/heaptrack.APP.PID.gz"
通过GDB将heaptrack注入应用程序,这可能需要一些时间...
注入完成
...
Heaptrack完成!现在运行以下命令来调查数据:
heaptrack --analyze "/tmp/heaptrack.APP.PID.gz"
当您试图分析一个没有直接访问调试符号的系统时,这在嵌入式系统上很常见,上述步骤不会给您有用的数据。在这种情况下,您首先需要记录原始跟踪文件,然后在有权访问所需调试符号的SDK或sysroot的系统上解释它。
在嵌入式系统上记录原始跟踪文件:
heaptrack --raw <你的应用程序及其参数>
然后将原始跟踪文件下载到您的开发机器并解释数据:
heaptrack --interpret "/path/heaptrack.test_c.8911.raw.zst" --sysroot "/path/to/sysroot"
然后,您可以分析它:
heaptrack --analyze "/tmp/heaptrack.test_c.8911.zst"
如果您在sysroot之外有其他包含调试信息的文件夹,可以通过--debug-paths传递给heaptrack --interpret,另请参阅:https://sourceware.org/gdb/current/onlinedocs/gdb.html/Separate-Debug-Files.html
此外,如果您有自定义代码侧载并希望从相应的构建文件夹加载调试信息,请使用--extra-paths,例如:
heaptrack --interpret "/path/heaptrack.test_c.8911.raw.zst" --sysroot "/path/to/sysroot"
Heaptrack分为两部分:数据收集器,即heaptrack本身,以及名为heaptrack_gui的分析器GUI。以下总结了这两部分的依赖关系,因为它们可以独立构建。您可以在所有主要发行版上找到这些依赖项的相应开发包。
在嵌入式设备或较旧的Linux发行版上,您只需要构建heaptrack。然后可以在具有更现代Linux发行版的不同机器上分析数据,该机器可以访问所需的GUI依赖项。
如果您在构建、部署或使用heaptrack时需要帮助,可以联系KDAB获得商业支持:https://www.kdab.com/software-services/workshops/profiling-workshops/
两个部分都需要以下工具和库:
heaptrack依赖项heaptrack数据收集器和简单的heaptrack_print分析器依赖于以下库:
对于运行时附加,您需要安装gdb。
heaptrack_gui依赖项用于解释和分析heaptrack收集的数据的图形用户界面依赖于Qt 5和一些KDE库:
当缺少任何这些依赖项时,heaptrack_gui将不会被构建。
可选地,安装以下依赖项以在GUI中获得额外功能:
运行以下命令来编译heaptrack。请注意CMake命令的输出,因为它会告诉您缺少的依赖项!
cd heaptrack # 即源文件夹
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release .. # 查看有关缺少依赖项的消息!
make -j$(nproc)
heaptrack_gui可以使用上述依赖项在Linux以外的平台上构建heaptrack_print和heaptrack_gui。
在macOS上,可以使用homebrew和KDE homebrew tap轻松安装依赖项。
brew install qt@5
# 准备tap
brew tap kde-mac/kde https://invent.kde.org/packaging/homebrew-kde.git
"$(brew --repo kde-mac/kde)/tools/do-caveats.sh"
# 安装依赖项
brew install kde-mac/kde/kf5-kcoreaddons kde-mac/kde/kf5-kitemmodels kde-mac/kde/kf5-kconfigwidgets \
kde-mac/kde/kf5-kio kde-mac/kde/kdiagram \
extra-cmake-modules ki18n threadweaver \
boost zstd gettext
# 运行brew打印的手动步骤
ln -sfv "$(brew --prefix)/share/kf5" "$HOME/Library/Application Support"
ln -sfv "$(brew --prefix)/share/knotifications5" "$HOME/Library/Application Support"
ln -sfv "$(brew --prefix)/share/kservices5" "$HOME/Library/Application Support"
ln -sfv "$(brew --prefix)/share/kservicetypes5" "$HOME/Library/Application Support"
要编译,请确保使用homebrew的Qt并将gettext添加到路径中:
cd heaptrack # 即源文件夹
mkdir build
cd build
CMAKE_PREFIX_PATH=/opt/homebrew/opt/qt@5 PATH=$PATH:/opt/homebrew/opt/gettext/bin cmake ..
cmake -DCMAKE_BUILD_TYPE=Release .. # 查看有关缺少依赖项的消息!
make heaptrack_gui heaptrack_print
Heaptrack生成的数据文件对人类来说是不可能分析的。相反,您需要使用heaptrack_print或heaptrack_gui来解释结果。


分析堆配置文件的强烈推荐方法是使用heaptrack_gui工具。
它依赖于Qt 5和KF 5来图形化可视化记录的数据。它具有以下特点:
heaptrack_print工具是一个具有最小依赖项的命令行应用程序。它获取
堆配置文件,对其进行分析,并以ASCII格式将结果打印到命令行。
最简单的形式,您可以这样使用它:
heaptrack_print heaptrack.APP.PID.gz | less
默认情况下,报告将包含三个部分:
对分配函数的最多调用
峰值内存消耗者
最多临时分配
然后每个部分列出前十个热点,即触发例如 最多内存分配的代码位置。
查看heaptrack_print --help以更改输出格式和其他选项。
请注意,您可以使用此工具将heaptrack数据文件转换为Massif数据格式。
您可以生成折叠的堆栈报告以供flamegraph.pl使用。
构建 heaptrack 的想法源于使用 Valgrind 的 massif 时遇到的困难。Valgrind 在内存和时间方面都带来了巨大的开销,有时会阻止你在较大的实际应用程序上运行它。Valgrind 所做的大部分工作对于一个简单的堆分析器来说是不必要的。
速度和内存开销
使用 heaptrack 跟踪多线程应用程序时,它们不会被序列化,即使对于单线程应用程序,时间和内存的开销也显著降低。最值得注意的是,你只在分配内存时付出代价——与 Valgrind 不同,耗时的 CPU 计算完全不会被减慢。
更多数据
Valgrind 的 massif 在写入报告之前会聚合数据。这一步骤会丢失大量有用信息。最显著的是,你无法再知道内存被分配的频率,或者临时分配是在哪里触发的。Heaptrack 在你解释数据之前不会聚合数据,这允许对你的分配模式有更有用的洞察。
能够将页面分配作为堆进行分析
这允许你对使用绕过 malloc 及其相关函数的池分配器的应用程序进行堆分析。原则上,heaptrack 也可以分析这类应用程序,但需要修改代码以注释内存池实现。
能够分析栈分配
据我所知,这在 heaptrack 中本质上无法高效实现。
总的来说,Heaptrack 基本上可以开箱即用地处理 Rust 二进制文件,因为 Rust 程序包含相应的调试符号。 虽然还不支持符号解码,但大多数符号名称仍然可以辨认。
还有一些其他细节需要注意 。
如果在发布模式下构建,请确保启用了调试符号。
在你的 Cargo.toml 中添加以下内容:
[profile.release]
debug = true
⚠️ 注意,如果你的项目是工作空间的一部分,这必须添加到工作空间的 Cargo.toml 中,而不是单个 crate 中。
运行 heaptrack cargo run 不会按预期工作,因为这会分析 Cargo 的内存使用情况,而不是你的应用程序。
相反,你可以:
cargo build --release 正常编译你的二进制文件,然后在 target/release/ 目录中的结果二进制文件上运行 heaptrack。
heaptrack ./target/release/my-rust-appcargo heaptrack。
在 Heaptrack 的 GUI 中,在调用者/被调用者图下,你可以双击一个位置来在那里打开编辑器。
文件路径是相对的,所以确保在你的项目根目录打开 heaptrack GUI,以便这能正确工作。
⚠️ 如果你的 crate 是工作空间的一部分,你需要在工作空间的根目录打开 heaptrack,以使路径正确。
作为一个自由开源软件项目,我们欢迎任何形式的贡献。你可以通过以下方式帮助改进项目:
提交错误报告时,你可以使用 tools/anonymize 脚本匿名化你的数据:
tools/anonymize heaptrack.APP.PID.gz heaptrack.bug_report_data.gz
当从使用旧版 gold 链接器链接的代码中展开时,Libunwind 可能会产生虚假的回溯。 在这种情况下,使用 heaptrack 记录似乎可以正常工作并产生数据文件。但是使用 heaptrack_gui 解析这些数据文件常常会导致内存耗尽崩溃。使用 heaptrack_print 查看数据时,会看到完全损坏的垃圾回溯。
如果你遇到这样的问题,请尝试使用 ld.bfd 而不是 ld.gold 重新链接你的应用程序和 libunwind。
你可以通过运行 libunwind 单元测试(使用 make check)来查看是否受到影响。但请注意,你需要重新链接你的应用程序,而不仅仅是 libunwind。
如果你在使用 ASAN 构建的应用程序上运行 heaptrack,你可能会在启动时遇到这个致命错误:
ASan runtime does not come first in initial library list [...]
解决方法是向 heaptrack 传递 --asan 标志。
注意:这只适用于用 gcc 构建的二进制文件(即那些链接到 libasan.so 的文件)。
目前不支持使用 clang 的 ASAN 构建的二进制文件。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+ 淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频


实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。


选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


最强AI数据分析助手
小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。


像人一样思考的AI智能体
imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号