【问题标题】:How to use MallocStackLogging on the device?如何在设备上使用 MallocStackLogging?
【发布时间】:2011-07-07 06:09:09
【问题描述】:

我想使用 MallocStackLogging 调试的 iPhone 应用程序存在内存问题。该错误涉及陀螺仪,因此我必须在设备上而不是模拟器上进行调试。

我已经设置了MallocStackLogging环境变量,iPhone正确记录了mallock堆栈日志:

MyApp(1856) malloc: recording malloc stacks to disk using standard recorder
MyApp(1856) malloc: stack logs being written into /private/var/mobile/Applications/1FD1F8D2-5D30-4AA7-B426-C52FE20266DE/tmp/stack-logs.1856.MyApp.index
MyApp(1856) malloc: Please issue: cp /private/var/mobile/Applications/1FD1F8D2-5D30-4AA7- B426-C52FE20266DE/tmp/stack-logs.1856.MyApp.e8z3IL.link /tmp/

现在我该如何与他们合作?

我可以使用 Xcode Organizer 将它们传输到 Mac。但是我应该如何处理这两个文件呢?

  • stack-logs.1856.MyApp.index
  • stack-logs.1856.MyApp.e8z3IL.link

我尝试在 Mac 上移动 /tmp 中的文件并调用:

$ malloc_history 1856 -all_events
malloc_history cannot examine process 1856 because the process does not exist.

很明显,malloc_history 命令在本地机器上寻找正在运行的进程。我缺少手动指定日志文件的选项。

有没有什么方法可以直接在(非越狱)设备上使用 Xcode 或在将日志传输到 Mac 后使其正常工作?

【问题讨论】:

  • 我在模拟器上遇到了同样的问题。期待在这里得到来自 ppl 的一些回复。顺便说一句,我点击了这个链接 - numbergrinder.com/node/53
  • 我环顾四周,为自己尝试了...看起来您不能,我不知道如果您无法读取日志文件有什么好处... shell in the调试器不好,因为那不是设备上的外壳,而是您的本地 bash ......虽然被剥离了......我试图将日志文件导入仪器,没有骰子。
  • 我开始相信 malloc_history 只有在您的应用程序在模拟器上运行时才有效。应用何时在设备上运行我认为没有办法将 malloc_history 指向设备。

标签: iphone xcode debugging malloc-history


【解决方案1】:

这是我在 idevice 上使用 malloc 堆栈历史调试 APP 的方法,这确实很复杂,但我没有其他方法来处理自动释放池内存问题。

  1. 你需要一个安装了开发工具的越狱设备,然后你就有了 gdb。

  2. 要启用 malloc 堆栈登录,您需要设置环境变量 MallocStackLoggingNoCompact 和 MallocStackLogging,我们需要一些技巧来做到这一点。

首先,我们需要授予您的应用 root 权限。

 mv -f /User/Application/xxxxxxxxxxxxx/YOUR_APP.app /Application/YOUR_APP.app
 cd /Application
 chown -R root:wheel YOUR_APP.app
 chmod 4755 YOUR_APP.app/YOUR_APP

重命名你的程序

mv YOUR_APP.app/YOUR_APP   YOUR_APP.app/BACK_UP_NAME

使用一个简短的 shell 脚本来启动你的程序,这样我们就可以保留环境。保存到 YOUR_APP.app/YOUR_APP

#!/bin/bash
export MallocStackLogging=1
export MallocStackLoggingNoCompact=1

exec /Applications/YOUR_APP.app/BACK_UP_NAME

完成。

只需启动您的应用程序,触摸图标或使用打开命令,您将在 /tmp 中看到堆栈日志文件 目录。

使用ps aux | grep YOUR_APP查找进程id,gdb -p PROCESS_ID附加进度,下断点,试试info malloc ADDRESS,malloc历史就会出现。

【讨论】:

    【解决方案2】:

    在可以诊断模拟器或设备上运行的应用程序的 Instruments 应用程序中,Allocations 工具记录内存地址和分配历史记录。您可以按对象/分配类型或特定内存地址进行浏览。这可能是实现您想要的最直接的方法。

    在设备上运行 malloc_history 需要越狱以启用与设备的 ssh 连接,或者从您的代码中运行 malloc_history。但我不确定 malloc_history 是否存在于 iOS 设备上。而且 malloc_history 的帮助文本没有提到操作日志文件的选项,而不是您可能已经知道的现有进程。

    【讨论】:

    • Instruments 似乎非常重,与仅记录 malloc 堆栈相比,应用程序运行速度非常慢。在某些情况下,无法使用 Instruments 复制难以捉摸的内存问题。
    【解决方案3】:

    我并不是说听起来轻率,但是您是否尝试过将设备插入并在连接时在调试器下运行它?

    我在设备上运行应用程序时进行了大量调试。您确实需要在调试器下启动应用程序。

    【讨论】:

    • 设备上的正常调试当然可以完美运行。所以我当然是在调试器下开始的。我的具体问题是malloc_history
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多