gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:09:31 26 4
gpt4 key购买 nike

泄漏命令行工具将报告

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

如下所示:

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

最佳答案

我花了一段时间,但一旦我弄清楚了这一切,效果就很好:

  • 我曾经使用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. 在单独的终端中,通过运行 leaks my_program_name 输出泄漏分配。 (或者,找到您的 pid: ps aux | grep my_program_name 然后运行 ​​leaks <pid> )。

干杯

关于c - 如何使用leaks命令行工具查找内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59122213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com