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

a8jjtwal  于 2022-11-14  发布在  其他
关注(0)|答案(3)|浏览(165)

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

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

jfgube3f

jfgube3f1#

这花了我一段时间,但一旦我弄清楚这一切,它的工作很好:

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

所以你必须运行MallocStackLogging,暂停你的程序,然后运行leaks:
1.打开终端并设置MallocStackLogging:export MallocStackLogging=1
1.在程序的末尾,在它存在之前,添加一行代码,通过从stdin阅读来暂停它,然后重新编译:fscanf(stdin, "c"); // wait for user to enter input from keyboard
1.运行程序并等待其暂停
1.在一个单独的终端中,通过运行leaks my_program_name(或者,找到您的pid:ps aux | grep my_program_name,然后运行leaks <pid>)。
干杯

zzlelutf

zzlelutf2#

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

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

i1icjdpr3#

您可以使用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查看结果

相关问题