如何在设备上使用MallocStackLogging?

时间:2011-03-02 12:38:46

标签: iphone xcode debugging malloc-history

我在iPhone应用中遇到内存问题,我想用MallocStackLogging进行调试。错误涉及陀螺仪,所以我必须在设备上调试而不是模拟器。

我设置了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。但是我应该怎么处理这两个文件?

  • 堆叠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后?

3 个答案:

答案 0 :(得分:4)

以下是我如何在idevice上调试带有malloc堆栈历史记录的APP,它真的很复杂,但是我没有其他方法来处理自动释放池内存问题。

  1. 您需要安装开发人员工具的越狱设备,然后才有gdb。

  2. 要启用malloc堆栈登录,需要设置环境变量MallocStackLoggingNoCompact和MallocStackLogging,我们需要一些技巧来实现它。

  3. 首先,我们需要授予您的应用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脚本启动程序,因此我们可以保留env。将其保存到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历史记录。

答案 1 :(得分:2)

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

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

答案 2 :(得分:-4)

我不是故意轻率,但您是否尝试在连接时将设备插入并在调试器下运行?

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