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调用?
如何找到哪个源文件/源文件中的什么位置?
是否需要更改某些环境变量(如MallocStackLogging
或MallocStackLoggingNoCompact
)的值?
3条答案
按热度按时间jfgube3f1#
这花了我一段时间,但一旦我弄清楚这一切,它的工作很好:
valgrind
,直到它不能在我的新osx版本上运行。我一直在寻找一种类似的方便的命令行方法来跟踪内存泄漏(可以使用Instruments代替,但它是重量级的和UI驱动的,这两者都让我很恼火)leaks -atExit
可以告诉我存在哪些泄漏,但不能告诉我任何泄漏的分配来自何处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>
)。干杯
zzlelutf2#
将环境变量
MallocStackLogging
设置为true,运行程序,然后运行leaks
。这将打印泄漏内存分配位置的堆栈跟踪。
我的做法是:
export MallocStackLogging=1
1.在
main
函数中,在返回之前添加以下代码。system("leaks executablename");
.1.运行程序。
i1icjdpr3#
您可以使用
leaks
命令保存内存图形文件。如果启用了malloc堆栈日志记录,则图形将包括堆栈跟踪。如果你的程序是一个长时间运行的进程,你可能想比较不同时间点的内存使用情况,这也可以通过
leaks
命令来完成。MallocStackLogging=1 ./myprogram
leaks --outputGraph=g1 myprogram
;这将保存g1.memgraph
文件leaks --outputGraph=g2 myprogram
myprogram
leaks g1.memgraph
或leaks --diffFrom=g1.memgraph g2.memgraph
查看结果