在Mac OS X Snow Leopard上的iPhone模拟器上使用Valgrind

时间:2011-01-24 03:42:34

标签: iphone ios-simulator valgrind

由于在我的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。

3 个答案:

答案 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和朋友加仪器及其泄漏检查器。

如何设置:

  1. 转到Xcode,选择您的内置产品(.app),双击它。 (在Xcode 4菜单中 - >产品 - >编辑方案)
  2. 添加名为“NSZombieEnabled”的新环境变量并将值设置为“YES”
  3. 或者更多控制:

    1. 在您的主目录中创建一个名为“.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

    2. 如果您现在在标准调试器中运行应用程序,它会在每次内存错误时停止。 如果启动调试并观察控制台,如果显示长内存调试器帮助文本,则可以查看它是否有效。