首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在设备上使用MallocStackLogging?

如何在设备上使用MallocStackLogging?
EN

Stack Overflow用户
提问于 2011-03-02 12:38:46
回答 3查看 12.9K关注 0票数 33

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

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

代码语言:javascript
运行
复制
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管理器将它们传输到Mac。但我该怎么处理这两个文件呢?

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

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

代码语言:javascript
运行
复制
$ malloc_history 1856 -all_events
malloc_history cannot examine process 1856 because the process does not exist.

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

是否有任何方法可以让它直接在(非越狱)设备上使用Xcode,或者在将日志传输到Mac之后?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-05 11:39:49

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

  1. 您需要安装一个带有开发工具的越狱idevice,然后有gdb.
  2. 来启用malloc堆栈日志,您需要设置环境变量MallocStackLoggingNoCompact和MallocStackLogging,我们需要一些技巧来完成它。

首先,我们需要授予您的应用程序根特权。

代码语言:javascript
运行
复制
 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

重命名您的程序

代码语言:javascript
运行
复制
mv YOUR_APP.app/YOUR_APP   YOUR_APP.app/BACK_UP_NAME

使用一个简短的shell脚本来启动您的程序,这样我们就可以保留env了。将其保存到您的_APP.app/您的应用程序

代码语言:javascript
运行
复制
#!/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历史将显示出来。

票数 5
EN

Stack Overflow用户

发布于 2013-09-16 18:56:01

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-03-14 09:44:24

我的意思不是吹毛求疵,但你有没有尝试过插入设备并在调试器下运行它,同时连接?

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

票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5167557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档