我正在使用Valgrind 3.3.1和Massif工具来分析C++应用程序的堆,我想知道是否有一个图形工具来检查文本输出文件.
谢谢你的任何建议.
我正在使用CentOS存储库中的标准gcc 4.4软件包在64位CentOS 5.8上开发静态链接的64位C++应用程序.它似乎使用了比我预期更多的内存,所以我尝试使用massif来分析内存使用情况.我编译了调试信息,然后运行
valgrind --tool = massif ./MyProg
从MyProg所在的目录.除了以下massif.out.XXXX示例之外,它永远不会产生任何结果.
desc: (none)
cmd: ./MyProg
time_unit: i
#-----------
snapshot=0
#-----------
time=0
mem_heap_B=0
mem_heap_extra_B=0
mem_stacks_B=0
heap_tree=empty
Run Code Online (Sandbox Code Playgroud)
请注意,这是文件的全部内容,我的程序可以运行很多分钟.
我尝试了valgrind和massif的各种选择无济于事.我甚至尝试使用MyProg的绝对路径,以防万一.我已经尝试下载最新稳定版本的valgrind(3.8.1)并编译并运行它(因为CentOS使用3.5.0)具有相同的结果.作为一个完整性检查,我跑了
valgrind --tool = massif ls -l
并且它产生了多个快照,并且按预期使用了非零内存.
我尝试使用我能想到的每种关键字组合在线搜索,但没有发现任何类似的问题.
作为旁注,我可以使用valgrind的默认memcheck工具成功分析应用程序,以防有用信息.
有谁知道为什么massif无法描述我的应用程序?
我已经阅读了有关此参数的文档,但区别非常大!启用后,简单程序(见下文)的内存使用量约为7 GB,禁用时,报告的使用量约为160 KB.
top也显示大约7 GB,这有点证实了结果pages-as-heap=yes.
(我有一个理论,但我不相信它会解释这么大的差异,所以 - 请求一些帮助).
特别困扰我的是,大部分报告的内存使用情况都被使用std::string,而what?从未打印过(意思是 - 实际容量非常小).
我需要pages-as-heap=yes在分析我的应用程序时使用,我只是想知道如何避免"误报"
代码段:
#include <iostream>
#include <thread>
#include <vector>
#include <chrono>
void run()
{
while (true)
{
std::string s;
s += "aaaaa";
s += "aaaaaaaaaaaaaaa";
s += "bbbbbbbbbb";
s += "cccccccccccccccccccccccccccccccccccccccccccccccccc";
if (s.capacity() > 1024) std::cout << "what?" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
int main()
{
std::vector<std::thread> workers;
for( unsigned i = 0; i < …Run Code Online (Sandbox Code Playgroud) 我希望在我的代码中添加一些内容,以便我可以在执行的某些点强制使用 Massif 快照,例如在服务器中将 Massif 快照转储到请求之间的文件中,以查看我是否占用了大量内存请求之间。我无法找到一种方法,无论是宏还是库调用来强制它转储快照,此时是否有办法做到这一点?
谢谢
我正在尝试在 CentOS 7 上构建Massif-Visualizer。不幸的是,我不得不尝试猜测依赖项,因为它们并未全部列在文件中INSTALL。迄今为止:
yum install git
yum install kdelibs-devel extra-cmake-modules \
qt5-qtsvg-devel qt5-qtxmlpatterns-devel \
kf5-kparts-devel kf5-karchive-devel
git clone https://github.com/KDE/massif-visualizer
cd massif-visualizer
mkdir build
(cd build && cmake .. && make && make install)
Run Code Online (Sandbox Code Playgroud)
这些 Qt5 和 KF5 包主要是通过反复试验以及 CMake 错误消息中的一些模式匹配而添加到命令中的yum……但我似乎不知道如何解决这些最后的错误:
-- Could not set up the appstream test. appstreamcli is missing.
CMake Error at /usr/lib64/cmake/KF5Archive/KF5ArchiveConfig.cmake:37 (include):
include could not find load file:
CMakeFindDependencyMacro
Call Stack (most recent call first):
/usr/share/ECM/find-modules/FindKF5.cmake:74 (find_package)
CMakeLists.txt:34 (find_package) …Run Code Online (Sandbox Code Playgroud) 我正在尝试测量正在编写的rust程序的内存大小。我注意到当我使用以下命令测量堆大小时:
valgrind --tool=massif --pages-as-heap=yes ./program
并使用ms_print测量,内存大小非常大(通常约为16MB)。最终,我将rust程序简化为一个空的main函数:
fn main() {
}
Run Code Online (Sandbox Code Playgroud)
我编译后,仍然有16MB的内存大小。我注意到当我使用另一台计算机时,相同的二进制文件总大小为4MB。我的一位朋友在他的计算机上使用相同的程序尝试了此操作,并使用了相同的rust / valgrind版本,并且还获得了4MB的大小。
我想象这是可能在堆中使用的某种预分配内存,但是我无法找到任何控制它的方法。我什至尝试按照本指南更改分配器,但没有任何更改。
系统细节:
OS version = Ubuntu 18.04
valgrind version = valgrind-3.13.0
cargo version = cargo 1.39.0-nightly (3f700ec43 2019-08-19)
rustc version = rustc 1.39.0-nightly (e44fdf979 2019-08-21)
ms_print = ms_print-3.13.0
libc version = ldd (Ubuntu GLIBC 2.27-3ubuntu1) 2.27
Run Code Online (Sandbox Code Playgroud)