由于在我的iOS程序中看到随机内存崩溃,我决定使用Valgrind帮助解决问题,因为他们有一个在32位mac OS X上运行的端口。我按照此网页中的说明操作在这里在iPhone模拟器上设置Valgrind:
http://landonf.bikemonkey.org/code/iphone/iPhone_Simulator_Valgrind.20081224.html
然而,虽然我可以在iOS模拟器中编译程序,并且设置了预处理程序标志,但我无法让Valgrind实际运行我的程序。它总是退出并出现以下错误:
valgrind: /Users/megahub/Library/Application Support/iPhone Simulator/4.2/Applications/6FD1FFF3-0EFB-4D81-A95A-F02E0AA9095E/QuamStockAdHoc.app/QuamStockAdHoc: cannot execute binary file
cannot execute binary file
如何解决此问题?我已经验证可执行文件存在于该路径中,因为我可以在模拟器中运行它而没有Valgrind。
答案 0 :(得分:0)
编译器默认为64位(假设你有一台64位机器),但是valgrind还没有正式支持Mac OS X上的64位可执行文件(据我所知,我可能错了)。可执行文件中的file命令应报告“Mach-O executable i386”。还要确保您使用的是所有库的32位版本。
答案 1 :(得分:0)
可能还有其他事情会触发此消息,但一个常见的原因是尝试在32位可执行文件上使用valgrind,当它被编译为仅在64位可执行文件上运行时。 (撰写本文时,MacPorts在64位操作系统版本上执行此操作)。这不是特定于模拟器:尝试valgrind任何32位应用程序都会产生这个。
来自valgrind源的本机安装,没有configure
的额外参数,可以在32位或64位可执行文件上运行。
这并没有让我能够在模拟器中运行valgrind。还没......
获得正确的宽度不会让你走得太远。正如其他地方所提到的,真正需要的是将valgrind移植到模拟器运行时。它需要像目标应用程序一样使用所有平台SDK。
事实证明,这是可能的。不容易,我不确定它有多稳定,但可能。我想我会和valgrind的人讨论是否可以以某种方式清理它并制作支持的端口/目标。
当它工作时,它很漂亮:
char* p = new char[10];
delete p;
*p = 12;
变成
==49084== Invalid write of size 1
==49084== at 0x6C536: -[AppDelegate application:didFinishLaunchingWithOptions:] (app_delegate.mm:813)
==49084== ...
==49084== Address 0xc6cca70 is 0 bytes inside a block of size 10 free'd
==49084== at 0xC51041: free (vg_replace_malloc.c:430)
==49084== by 0x6C52F: -[AppDelegate application:didFinishLaunchingWithOptions:] (app_delegate.mm:812)
==49084== ...
漂亮的符号和行号。精彩。
我已经到了valgrind会在Apple的sqlite3 dylib上进行barf的地步。我不是100%肯定为什么,但我认为这是因为Apple的sqlite3版本有一些valgrind没有涵盖的马赫调用。所以我从来没有在我的应用程序上完全工作。我在valgrind列表上提出了主题,但它没有引起任何兴趣。我仍然想让它发挥作用,但这不会太快发生......至少不是我。
嗯...想知道我是否可以对WWDC产生任何兴趣...
答案 2 :(得分:-4)
为什么首先使用valgrind?你有NSZombie和朋友加仪器及其泄漏检查器。
如何设置:
或者更多控制:
在您的主目录中创建一个名为“.gdbinit”的新文件(请注意前面的点),其中包含以下内容:
fb - [NSException raise]
fb - [NSAssertionHandler handleFailureInFunction:file:lineNumber:description:]
fb - [NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
设置env MallocHelp =是
设置env NSZombieEnabled =是
set env NSDeallocateZombies = NO
设置env MallocCheckHeapEach = 100000
设置env MallocCheckHeapStart = 100000
设置env MallocScribble =是
设置env MallocGuardEdges =是
设置env MallocCheckHeapAbort = 1
设置env CFZombie 5
fb - [_ NSZombie init]
fb - [_ NSZombie retainCount]
fb - [_ NSZombie保留]
fb - [_ NSZombie发布]
fb - [_ NSZombie autorelease]
fb - [_ NSZombie methodSignatureForSelector:]
fb - [_ NSZombie respondsToSelector:]
fb - [_ NSZombie forwardInvocation:]
fb - [_ NSZombie class]
fb - [_ NSZombie dealloc]
fb szone_error
如果您现在在标准调试器中运行应用程序,它会在每次内存错误时停止。 如果启动调试并观察控制台,如果显示长内存调试器帮助文本,则可以查看它是否有效。