Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Mac OS X Snow Leopard上的iPhone模拟器上使用Valgrind_Iphone_Ios Simulator_Valgrind - Fatal编程技术网

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

在Mac OS X Snow Leopard上的iPhone模拟器上使用Valgrind,iphone,ios-simulator,valgrind,Iphone,Ios Simulator,Valgrind,由于在我的iOS程序中看到随机内存崩溃,我决定使用Valgrind来帮助解决问题,因为他们有一个在32位mac OS X上运行的端口。我按照此网页中的说明在iPhone模拟器上设置Valgrind,如下所示: 然而,尽管我可以在iOS模拟器中编译程序,并设置预处理器标志,但我无法让Valgrind实际运行我的程序。它总是退出,并出现以下错误: valgrind: /Users/megahub/Library/Application Support/iPhone Simulator/4.2/Ap

由于在我的iOS程序中看到随机内存崩溃,我决定使用Valgrind来帮助解决问题,因为他们有一个在32位mac OS X上运行的端口。我按照此网页中的说明在iPhone模拟器上设置Valgrind,如下所示:

然而,尽管我可以在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运行它。

为什么首先使用Valgrind?你有NSZombie和friends plus带有泄漏检测器的仪器

如何设置:

  • 转到Xcode,选择您的内置产品(the.app),双击该产品。(在Xcode 4菜单栏->产品->编辑方案中)
  • 添加一个名为“NSZombieEnabled”的新环境变量,并将该值设置为“YES”
  • 或者,为了更好地控制:

  • 在主目录中创建一个名为“.gdbinit”(注意前面的点)的新文件,其内容如下:

    fb-[N异常升高]
    fb-[NSAssertionHandler handleFailureInFunction:文件:行号:说明::
    fb-[NSAssertionHandler handleFailureInMethod:对象:文件:行号:说明:][br> 设置env MallocHelp=YES
    set env NSZombieEnabled=是
    set env NSDeallocateZombies=NO
    设置env MALLOCCHECKHEAPACH=100000
    设置env MallocCheckHeapStart=100000
    设置env MallocScribble=YES
    设置env mallocguardeges=YES
    设置env malloccheckheapaport=1
    设置环境CFZombie 5
    fb-[\n僵尸初始化]
    fb-[\n僵尸重新计数]
    fb-[\n僵尸保留]
    fb-[\n僵尸发布]
    fb-[\n僵尸自动释放]
    fb-[\n僵尸方法签名选择器:
    fb-[\n僵尸响应选择器:
    fb-[\n僵尸转发调用:
    fb-[\n僵尸类]
    fb-[\n僵尸解除锁定]
    fb-szone_错误

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

    编译器默认为64位(假设您有一台64位计算机),但valgrind尚未正式支持Mac OS X上的64位可执行文件(据我所知,我可能错了)。可执行文件上的file命令应报告“Mach-O可执行文件i386”。另外,请确保您使用的所有库都有32位版本。

    触发此消息的可能还有其他原因,但一个常见原因是在32位可执行文件上尝试使用valgrind,而该文件已编译为仅在64位可执行文件上运行。(截至本文撰写之时,MacPorts在64位操作系统构建上实现了这一点)。这并不特定于模拟器:尝试valgrind任何32位应用程序都会产生这种情况

    从valgrind源代码进行的本机安装,不需要额外的参数来配置,可以在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会吐苹果sqlite3动态库的地步。我不是100%确定为什么,但我认为这是因为苹果版本的sqlite3有一些valgrind没有涵盖的马赫数。所以我从来没有让它在我的应用程序上完全起作用。我在valgrind名单上提出了这个话题,但没有引起任何兴趣。我仍然想让它工作,但不会太快发生。。。至少不是我


    嗯。。。不知道我是否可以在WWDC引起兴趣…

    您对“文件”有何反应?(应该是类似于“Mach-O可执行文件i386”,如果不是为错误的平台编译的话)在哪里可以找到返回信息?模拟器从一个版本到另一个版本都发生了很大的变化,包括二进制文件的工作方式。我敢打赌,如果不将valgrind移植到模拟器上,valgrind将无法使用它(这几乎是不可能的)。在模拟器中运行的二进制文件不像普通的MacOSX二进制文件那样工作……是的,但是valgrind也是一个有用的工具。我只是想弄清楚如何让它工作。这不是问题的答案,而且valgrind可以检测到很多东西,而这些东西无法检测到。所有这些都是可能的,但在应用程序中查找扩展内存错误是首选工具。也许有些错误需要valgrind,但我认为使用正确的工具做正确的事情是更好、压力更小的方法;)valgrind与仪器完全不同。仪器往往连它应该找到的东西都找不到(许多仪器仍然是为iOS编写的,而且还不能正常工作)。
    Megahubs-iMac-2:QuamStockAdHoc.app megahub$file QuamStockAdHoc QuamStockAdHoc:Mach-O可执行文件i386
    file命令报告它已经是Mach-O可执行文件了。错误。iPhone模拟器使用32位二进制文件,以便更接近使用32位处理器的实际硬件。我怀疑它是否适用于块和NSO操作队列,但请告诉我它是否适用,以及如果使用它,它是如何工作的。我是一个仪器迷,虽然这只是它的想法,我的一部分,我能够很容易地找到所有的错误。尽管如此,valgrind仍然是一个重量级人物