valgrind和iOS SDK 4.2?

在使用valgrind运行iOS 4.2应用程序时遇到问题。

我从Macports安装valgrind 3.6.0-SVN。 XCode 3.2.5。

当我修改我的主要()运行valgrind我得到以下输出:


检测到尝试在系统库中调用不存在于iPhone上的符号:
打开$ UNIX2003,调用函数_vgrZU_libSystemZdZaZddylib_arc4random在image vgpreload_core-x86-darwin.so中。
如果遇到在gdb中运行模拟器二进制文件的问题,请确保先“closures”开始。

 == == 99640 
 == 99640 ==进程以信号6(SIGABRT)的默认行为终止
 == 99640 == 0x8B5DEF6:__kill(在/usr/lib/libSystem.B.dylib中)
 == 99640 == 0x8BF062C:raise(在/usr/lib/libSystem.B.dylib中)
 == 99640 == 0x8C066E3:abort(在/usr/lib/libSystem.B.dylib中)
 == 99640 == by 0x33F2547:__springboard_unimplemented(in /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/usr/lib/libSystem.dylib)
 == 99640 == by 0x33FC208:open $ UNIX2003(in /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/usr/lib/libSystem.dylib)
 == 99640 == by 0x1AAD6F3:arc4random(vg_preloaded.c:163)
 == 99640 == by 0x8AFFB7E:create_scalable_zone(in /usr/lib/libSystem.B.dylib)
 == 99640 == 0x8AFF7EA:_malloc_initialize(在/usr/lib/libSystem.B.dylib中)
 == 99640 == by 0x8B23449:malloc_create_zone(in /usr/lib/libSystem.B.dylib)
 == 99640 == 0x8B233F8:_dispatch_ccache_init(在/usr/lib/libSystem.B.dylib中)
 == 99640 == 0x8B21E0D:dispatch_once_f(在/usr/lib/libSystem.B.dylib中)
 == 99640 == by 0x8B233D3:_dispatch_continuation_alloc_from_heap(在/usr/lib/libSystem.B.dylib中)

错误似乎很清楚。 我怎样才能解决这个问题? 我听说过在SDK 3.x上运行valgrind的成功尝试。 什么改变了?

还有其他build议吗?

这是一个可怕的黑客,我不知道这是什么意思……但它确实解决了这个问题:

在你的valgrind源文件中,打开vg_preloaded.c并find第163行(在你的堆栈跟踪中引用)。 将那里的代码改为:

/* if (rnd < 0) rnd = open("/dev/random", O_RDONLY); read(rnd, &result, sizeof(result)); */ result = random(); 

这似乎是唯一保持valgrind工作…你的里程可能会有所不同。

将以下内容添加到您的一个Objective-C文件的顶部:

 #import“stdio.h”
 #import“fcntl.h”

 int open $ UNIX2003(const char * pathname,int flags,mode_t mode){
    返回打开(path名,标志,模式);
 }

 int read $ UNIX2003(int fildes,void * buf,size_t nbyte){
    返回读(fildes,buf,nbyte);
 }

 int close $ UNIX2003(int fildes){
    返回closures(fildes);
 }