我在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/
Run Code Online (Sandbox Code Playgroud)
现在我该如何使用它们?
我可以使用Xcode Organizer将它们传输到Mac.但是我应该怎么处理这两个文件呢?
我尝试在Mac上的/ tmp中移动文件并调用:
$ malloc_history 1856 -all_events
malloc_history cannot examine process 1856 because the process does not exist.
Run Code Online (Sandbox Code Playgroud)
显然,该malloc_history
命令在本地计算机上查找正在运行的进程.我错过了手动指定日志文件的选项.
有没有办法让这个工作直接在(非越狱)设备上使用Xcode或将日志传输到Mac?
如果您曾经问过如何在objective-c中调试发布/分配问题,您将遇到这些可以帮助跟踪问题的环境设置:
NSZombieEnabled
- 发布后保持不变,所以你可以获得指针等.MallocStackLogging
- 保留对象历史记录以供日后参考 NSDebugEnabled
您可以将所有这些设置YES
为"可执行文件"(在组树中找到)信息中"参数"选项卡的"环境"部分.
所以,我得到这个控制台输出
MyApp [ 4413:40b] - [CALayer retainCount]:发送到解除分配的实例0x4dbb170的消息
然后打开终端,而调试器转发了break并输入:
malloc_history 4413 0x4dbb170
然后,我得到一个大文本转储,据我所知,重要的是这个:
1
ALLOC 0x4dbb160-0x4dbb171 [size=18]:
thread_a0375540 |start | main |
UIApplicationMain | GSEventRun |
GSEventRunModal | CFRunLoopRunInMode |
CFRunLoopRunSpecific | __CFRunLoopRun
| __CFRunLoopDoTimer |
__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
| __NSFireDelayedPerform |
-[todoListViewController drillDocumentMenu:] |
-[documentListViewController drillIntoDocumentWithToDoRecord:] |
-[documentViewController OpenTodoDocument:OfType:WithPath:] |
-[documentViewController OpenDocumentOfType:WithPath:] |
-[documentViewController managePDFDocumentWithPath:] |
-[PDFDocument loadPDFDocumentWithPath:andTitle:] |
-[PDFDocument getMetaData] | CGPDFDictionaryApplyFunction |
ListDictionaryObjects(char const*,
CGPDFObject*, void*) …
Run Code Online (Sandbox Code Playgroud) 当释放指针时,您可能会看到错误,例如
"没有分配被释放的指针"
在使用模拟器进行调试时,我添加了一个构建参数MallocStackLogging = YES - 这允许我在终端中使用malloc_history来跟踪我释放指针的位置.
如果我使用此构建参数在设备上进行调试,我会收到各种控制台错误"无法创建堆栈日志文件"等.
奇怪的是,我在设备上出现了一些过度释放的指针错误,但在模拟器上却没有.
有没有人有使用设备本身追踪这些的经验?
谢谢!
在XCode上进行调试时,我想从这个示例中找到如何获取当前调试的应用程序的PID;
2012-07-02 16:02:02.124 appname [14995:700]
哪一个是pid?我需要获取pid,因为我想使用malloc_history来检查内存泄漏,这需要应用程序的pid,
我尝试了ff:组合,
shell malloc_history
app
appname.app
appname[14995]
appname[14995:700]
14995
14995:700
700
0x000000 (address)
Run Code Online (Sandbox Code Playgroud)
但我总是得到历史记录中不存在的进程tbe(malloc_history找不到你有权访问的进程,其名称类似于"")