如何使用泄漏(leaks)命令行工具来查找内存泄漏?

4

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()调用? 我如何找出源文件/源文件中的位置? 我是否需要更改一些环境变量的值,例如MallocStackLogging或MallocStackLoggingNoCompact?

尝试查看终端中的“man leaks”命令文档页面,其中解释了一些内容。输入man leaks。https://www.unix.com/man-page/osx/1/leaks/ - ABC
@Raymond,我已经尝试过了,但还是无法弄清楚。 - KIYZ
3个回答

7

我花了一些时间,但是一旦我搞明白了,这些都很好用:

  • 我以前使用 valgrind,但是它不能在我的新版osx上运行。我正在寻找一种类似方便的命令行方法来跟踪内存泄漏(可以使用Instruments代替,但它过于笨重和UI驱动,这两点都让我感到烦恼)
  • 使用 leaks -atExit 告诉我存在哪些泄漏,但无法确定任何泄露分配来自何处
  • MallocStackLogging 创建了日志,可以告诉我泄露的分配来自何处,但是当程序退出时,日志会自动删除,并且 leaks -atExit 在退出时运行

因此,您需要运行 MallocStackLogging,暂停程序,然后运行 leaks:

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

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

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

  4. 在另一个终端中,通过运行 leaks my_program_name(或者找到您的pid:ps aux | grep my_program_name 然后运行 leaks <pid>)输出泄漏分配。

干杯


3

设置环境变量MallocStackLogging为true,运行程序,然后运行leaks

这将打印出泄漏内存的堆栈跟踪。

我的做法是:

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

0

您可以使用leaks命令保存内存图文件。如果启用了malloc堆栈日志记录,该图将包括堆栈跟踪。

如果您的程序是长时间运行的进程,则有可能要在不同时间点比较内存使用情况,这也可以通过leaks命令实现。

  • 在一个终端中,以堆栈日志记录方式运行程序:MallocStackLogging=1 ./myprogram
  • 在另一个终端中,运行leaks --outputGraph=g1 myprogram;这将保存g1.memgraph文件
  • (可选)一段时间后再运行leaks --outputGraph=g2 myprogram
  • 现在可以杀死myprogram
  • 使用leaks g1.memgraphleaks --diffFrom=g1.memgraph g2.memgraph查看结果

我如何在Python脚本中使用leaks - Volatil3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接