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); }