Ubuntu 系统监视器和 valgrind 发现 C++ 应用程序中的内存泄漏

2024-01-23

我正在用 C++ 编写一个应用程序,它使用一些外部开源库。我尝试查看 Ubuntu 系统监视器以获取有关我的进程如何使用资源的信息,并且我注意到驻留内存继续增加到非常大的值(超过 100MiB)。这个应用程序应该在嵌入式设备中运行,所以我必须小心。

我开始认为应该存在(一些)内存泄漏,所以我使用 valgrind。不幸的是,valgrind 似乎没有报告严重的内存泄漏,只有我正在使用的库中的一些小问题,仅此而已。

那么,我是否必须得出结论,我的算法确实使用了那么多内存?这对我来说似乎很奇怪......或者也许我误解了系统监视器各列的含义?有人可以澄清与软件分析相关的系统监视器中的“虚拟内存”、“常驻内存”、“可写内存”和“内存”的含义吗?我是否应该期望这些值立即代表我的进程在 RAM 中占用了多少内存?

过去,我使用过能够告诉我内存使用情况的工具,例如 Apple Profiling Tools。我也可以在 Linux 中使用类似的东西吗?

Thanks!


您可以尝试的另一个工具是/lib/libmemusage.so图书馆:

$ LD_PRELOAD=/lib/libmemusage.so vim 

Memory usage summary: heap total: 4643025, heap peak: 997580, stack peak: 26160
         total calls   total memory   failed calls
 malloc|      42346        4528378              0
realloc|         52           7988              0  (nomove:26, dec:0, free:0)
 calloc|         34         106659              0
   free|      28622        3720100
Histogram for block sizes:
    0-15          14226  33% ==================================================
   16-31           8618  20% ==============================
   32-47           1433   3% =====
   48-63           4174   9% ==============
   64-79           4736  11% ================
   80-95            313  <1% =
...

(I quit vim启动后立即。)

也许块大小的直方图将为您提供足够的信息来告诉您哪里可能发生泄漏。

valgrind非常可配置;--leak-check=full --show-reachable=yes如果您还没有尝试过,这可能是一个很好的起点。


“虚拟内存”、“常驻内存”、“可写内存”和“内存”

虚拟内存是您的应用程序拥有的地址空间已分配。如果你跑malloc(1024*1024*100);, the malloc(3)库函数将从操作系统请求 100 MB 的存储空间(或从空闲列表中处理它)。这 100 兆字节将分配为mmap(..., MAP_ANONYMOUS), 它实际上不会分配任何内存。 (见文末吐槽malloc(3)页了解详细信息。)操作系统将在第一次写入每个页面时提供内存。

虚拟内存负责映射到进程中的所有库和可执行对象以及堆栈空间。

驻留记忆是实际的内存量in RAM。您可以链接整个 1.5 MB C 库,但仅使用支持标准 IO 接口所需的 100k(大胆猜测)库。图书馆的其余部分将按需寻呼 http://en.wikipedia.org/wiki/Demand_paging需要时从磁盘中导入。或者,如果您的系统面临内存压力,并且一些最近较少使用的数据被调出以进行交换,则它将不再计入驻留记忆.

可写内存是您的进程分配有写权限的地址空间量。 (检查输出pmap(1)命令:pmap $$例如,对于 shell,查看哪些页面映射到哪些文件、匿名空间、堆栈以及这些页面上的权限。)这是程序有多少交换空间的合理指示might在最坏的交换场景中需要,此时所有内容都必须分页到磁盘,或者进程使用了​​多少内存为自己.

因为您的系统上可能同时有 50--100 个进程,并且几乎所有进程都与标准 C 库链接,所以所有进程都会访问share库的只读内存映射。 (他们还可以共享所有写时复制私有可写使用以下命令打开的任何文件的映射mmap(..., MAP_PRIVATE|PROT_WRITE),直到进程写入内存。)top(1)工具将报告内存量can在进程之间共享SHR柱子。 (请注意,内存可能not被共享,但其中一些(libc)绝对是共享的。)

Memory很模糊。我不知道这意味着什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu 系统监视器和 valgrind 发现 C++ 应用程序中的内存泄漏 的相关文章

  • C++11 中具有 C 链接的复杂类型

    我需要将 C 库的标头包含到我的 C 11 代码中 现在 标头提供了涉及大量的例程和数据结构double complex到处都是 例如 include
  • 无需 root 访问权限即可安装 zsh? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有可能 以及如何 我确实需要在几台具有 ssh 访问权限 但没有 root 访问权限 的远程计算机上使用此功能 下载 zsh wget O zsh t
  • 确保 unsigned int/long 始终在 C# 中的检查上下文中执行

    有没有人觉得奇怪 uint 和 ulong 的默认上下文是未检查的 而不是检查的 因为它们旨在表示永远不能为负的值 因此 如果某些代码试图违反该约束 在我看来 自然且首选的行为是抛出异常 而不是返回最大值 这很容易使重要数据处于无效状态并且
  • 通过 TCP/.NET SSLStream 发送文件很慢/无法正常工作

    我正在编写一个与 SSL 配合使用的服务器 客户端应用程序 通过SSLStream 它必须做很多事情 不仅仅是文件接收 发送 目前 它的工作原理是 只有一个连接 我总是使用从客户端 服务器发送数据SSLStream WriteLine 并使
  • 如何有效地左填充字节数组

    假设我有一个数组 LogoDataBy byte 0x00000008 0x00000000 0x41 0x00000001 0x42 0x00000002 0x43 0x00000003 0x44 0x00000004 0x31 0x00
  • 如何在Qt3D中优化点云渲染

    我正在尝试使用 Qt3D 显示大型点云 20M pts 我第一次发现这个图书馆https github com MASKOR Qt3DPointcloudRenderer https github com MASKOR Qt3DPointc
  • MouseDoubleClick 事件不会冒泡

    我的场景经过简化 我有一个包含员工行的 ListView 在每个员工行中 都有 增加 和 减少 按钮来调整他的工资 假设在我的程序中 双击 员工 行意味着 解雇此人 The problem是当我快速单击 增加 时 这会触发 ListView
  • DataGridView小数不排序

    好吧 我有一个 DataGridView 它的数据绑定如下 dataGridViewChartOre AutoGenerateColumns false dataGridViewChartOre DataSource xml GetOreC
  • 将node.js +expressjs应用程序的NODE_ENV设置为ubuntu下的守护进程

    我按照这些说明让守护进程正常工作 http kevin vanzonneveld net techblog article run nodejs as a service on ubuntu karmic http kevin vanzon
  • 获取RFC返回的嵌套结构的值?

    我是 C 新手 我有 rfc 它以嵌套结构的形式从 SAP 系统返回数据 但是当我使用以下方式获取该数据时 IrfcTable table rfc getTable exporting parameter et customer 它仅返回第
  • vs2010 c++ 通过debug查看指针内容

    我正在使用 Vs2010 c 处理 2D 数组 我从一维指针开始 并使用操作 如下 class CMatrix void clear public int nRows int nCols short MyMat CMatrix CMatri
  • cmake 包括其他目录中的 h 文件

    我在 cmake 项目下进行测试时遇到问题 我的项目是这样安排的 TerrainMap PointAccumulator heightQuadGrid Test 在 TerrainMap 目录中 CMakeLists txt 文件简单地概述
  • 如何在PropertyGrid中自定义绘制GridItem?

    我想以与所有者在 ListView 详细信息 和其他控件中绘制项目类似的方式在 PropertyGrid 中绘制属性值 如果将属性声明为 Color 类型 则其值将使用字符串描述旁边的颜色样本来绘制 如果属性是图像类型 则在字符串描述旁边绘
  • 在 Ubuntu 16.04 上编译 PCL 1.7,CMake 生成的 Makefile 中出现错误

    我正在尝试让 PCL 1 7 点云库 而不是其他 pcl 在 Ubuntu 16 04 上运行 我最终希望用于 C 的东西 但现在我只是想让这些例子工作 我使用的是 Ubuntu GNU 5 3 1 附带的默认编译器和 Cmake 版本 3
  • 使用客户端 hello 消息进行 TLS 协议检测

    我需要检测网络流量中的 https 数据包 到目前为止 我将所有 443 标记为 https 但我不想再在这种情况下使用端口信息 检查客户端问候消息是否足够 Check 22 and version info 0300 0301 or 03
  • 比较 C# 中的对象属性[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动
  • 在 debian wheezy amd64 上安装 ia32-libs

    我正在使用 Debian 7 喘息 amd64 uname a Linux tzwm debian 3 2 0 4 amd64 1 SMP Debian 3 2 51 1 x86 64 GNU Linux 我想安装ia32 libs在我的
  • 错误:C# 尝试读取或写入受保护的内存

    我很难纠正这个错误 该应用程序在 4 台不同的机器上进行了测试 在其中 3 台上运行良好 但一台 Vista PC 在尝试通过 WebBrowser1 打开页面时出现此错误 解决这个问题的任何帮助对我都会非常有帮助 System Acces
  • Eclipse CDT C/C++:包含另一个项目的头文件

    我在 Eclipse CDT 中有两个 C 项目main and shared In shared我有一个名为calc h 我想在中使用这个标头main 所以我做了以下事情 added include calc h到相关文件main In
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t

随机推荐