2011-01-04 2 views
4

Проблемы с запуском приложений iOS 4.2 с valgrind.valgrind и iOS SDK 4.2?

Я установил valgrind 3.6.0-SVN из Macports. XCode 3.2.5.

Когда я изменить мой основной(), чтобы запустить Valgrind я получаю следующий результат:

 

Detected an attempt to call a symbol in system libraries that is not present on the iPhone: 
open$UNIX2003 called from function _vgrZU_libSystemZdZaZddylib_arc4random in image vgpreload_core-x86-darwin.so. 
If you are encountering this problem running a simulator binary within gdb, make sure you 'set start-with-shell off' first. 

==99640== 
==99640== Process terminating with default action of signal 6 (SIGABRT) 
==99640== at 0x8B5DEF6: __kill (in /usr/lib/libSystem.B.dylib) 
==99640== by 0x8BF062C: raise (in /usr/lib/libSystem.B.dylib) 
==99640== by 0x8C066E3: abort (in /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== by 0x8AFF7EA: _malloc_initialize (in /usr/lib/libSystem.B.dylib) 
==99640== by 0x8B23449: malloc_create_zone (in /usr/lib/libSystem.B.dylib) 
==99640== by 0x8B233F8: _dispatch_ccache_init (in /usr/lib/libSystem.B.dylib) 
==99640== by 0x8B21E0D: dispatch_once_f (in /usr/lib/libSystem.B.dylib) 
==99640== by 0x8B233D3: _dispatch_continuation_alloc_from_heap (in /usr/lib/libSystem.B.dylib) 

ошибка, кажется, довольно ясно. Как я могу это исправить? Я слышал об успешных попытках запустить valgrind на SDK 3.x. Что изменилось?

Другие советы?

+0

Я испытываю такую ​​же проблему. Хотя решения пока нет. –

ответ

4

Это отвратительное взломать, и я понятия не имею, какие последствия ... но это решить проблему:

В источнике VALGRIND откройте vg_preloaded.c и найти строки 163 (ссылку в ваша трассировка стека). Измените код, который там:

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

Это, как представляется, единственное, что держит Valgrind от работы ... Ваш пробег может варьироваться.

+0

Люблю это, по какой-то причине мне даже не приходило в голову взломать источник valgrind. Благодарю. – EightyEight

+0

Я имею в виду, это пугает меня и ужасно грязный хак. Я понятия не имею, для чего нужны фактические случайные числа. Но ... он загорелся и дал мне полезную информацию, так что это не может быть все плохо :) –

+1

Вместо того, чтобы заменять его вызовом random(), вам может быть лучше удалить весь бит из «Дарвина» arc4random (rdar: // 6166275) 'комментарий до, но не включая' # else'. – adurdin

2

Добавьте следующие строки в верхней части одного из файлов Objective-C:

 
#import "stdio.h" 
#import "fcntl.h" 

int open$UNIX2003(const char *pathname, int flags, mode_t mode) { 
    return open(pathname, flags, mode); 
} 

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

int close$UNIX2003(int fildes) { 
    return close(fildes); 
}