【问题标题】:How to use leaks command-line tool to find memory leaks?如何使用leaks 命令行工具查找内存泄漏?
【发布时间】:2020-03-26 01:54:54
【问题描述】:

leaks命令行工具会报告

  • 泄露内存的地址
  • 泄漏的大小(以字节为单位)
  • 泄露缓冲区的内容

如下:

Process:         checker [84357]
Path:            /path/to/program
Load Address:    0x104703000
Identifier:      checker
Version:         ???
Code Type:       X86-64
Parent Process:  zsh [64610]

Date/Time:       2019-11-30 18:43:06.864 -0800
Launch Time:     2019-11-30 18:42:58.593 -0800
OS Version:      Mac OS X 10.13.4 (17E199)
Report Version:  7
Analysis Tool:   /usr/bin/leaks

Physical footprint:         300K
Physical footprint (peak):  300K
----

leaks Report Version: 3.0
Process 84357: 161 nodes malloced for 17 KB
Process 84357: 3 leaks for 64 total leaked bytes.

Leak: 0x7fdf5b400350  size=16  zone: DefaultMallocZone_0x10470e000
Leak: 0x7fdf5b4027c0  size=16  zone: DefaultMallocZone_0x10470e000
Leak: 0x7fdf5b402810  size=32  zone: DefaultMallocZone_0x10470e000

我的问题是,我如何使用这些信息来实际追踪并找到我的源代码中哪些 malloc 调用没有对应的 free() 调用?
如何找出源文件中的哪个源文件/位置?
我是否需要更改一些环境变量的值,例如MallocStackLoggingMallocStackLoggingNoCompact

【问题讨论】:

  • 尝试查看终端中的“man leaks”命令文档页面,解释一些事情。输入man leaksunix.com/man-page/osx/1/leaks
  • @Raymond 我已经做过了,但还是想不通。

标签: c macos debugging memory-leaks command-line-tool


【解决方案1】:

将环境变量MallocStackLogging设置为true,运行程序,然后运行leaks
这将打印泄漏内存分配位置的堆栈跟踪。

我的做法是:

  1. export MallocStackLogging=1
  2. main 函数中,在返回之前添加以下代码。
    system("leaks executablename"); .
  3. 运行程序。

【讨论】:

    【解决方案2】:

    我花了一些时间,但一旦我弄清楚了这一切,它就很好用了:

    • 我曾经使用valgrind,直到它无法在我的新osx 版本上运行。我一直在寻找一种同样方便的命令行方法来跟踪内存泄漏(可以改用 Instruments,但它是重量级的和 UI 驱动的,这两个都让我烦恼)
    • 使用leaks -atExit 告诉我存在哪些泄漏,但不能告诉我任何泄漏的分配来自哪里
    • MallocStackLogging 创建的日志可以告诉我泄露的分配来自哪里,但是当程序退出时,日志会自动删除,leaks -atExit 显然在退出时运行

    所以你必须运行 MallocStackLogging,暂停你的程序,然后运行泄漏:

    1. 打开一个终端并设置MallocStackLogging:export MallocStackLogging=1

    2. 在程序的最后,在它存在之前,添加一行代码通过从标准输入读取暂停它,然后重新编译:fscanf(stdin, "c"); // wait for user to enter input from keyboard

    3. 运行你的程序并等待它暂停

    4. 在单独的终端中,找到您的 pid:ps aux | grep my_program_name

    5. 运行泄漏,现在它将输出泄漏分配:leaks <pid_from_above_step>

    干杯

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 2013-01-26
      • 2013-07-12
      • 2015-09-19
      • 2012-02-27
      • 2011-07-05
      相关资源
      最近更新 更多