Valgrind и iOS SDK 4.2? - PullRequest
       14

Valgrind и iOS SDK 4.2?

4 голосов
/ 05 января 2011

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

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

Когда я изменяю свой main () для запуска 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. Что изменилось?

Любой другой совет?

Ответы [ 2 ]

4 голосов
/ 07 января 2011

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

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

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

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

3 голосов
/ 03 июля 2011

Добавьте следующее в начало одного из ваших файлов 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);
}
...