【问题标题】:valgrind and iOS SDK 4.2?valgrind 和 iOS SDK 4.2?
【发布时间】:2011-06-03 17:21:04
【问题描述】:

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

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

当我修改 main() 以运行 valgrind 时,我得到以下输出:

检测到尝试调用 iPhone 上不存在的系统库中的符号: 从映像 vgpreload_core-x86-darwin.so 中的函数 _vgrZU_libSystemZdZaZddylib_arc4random 调用的 open$UNIX2003。 如果您在 gdb 中运行模拟器二进制文件时遇到此问题,请确保首先“设置 start-with-shell off”。 ==99640== ==99640== 进程以信号 6 (SIGABRT) 的默认操作终止 ==99640== 在 0x8B5DEF6:__kill(在 /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 (在/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/usr/lib/libSystem.dylib) ==99640== by 0x33FC208: open$UNIX2003 (在/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/usr/lib/libSystem.dylib) ==99640== by 0x1AAD6F3: arc4random (vg_preloaded.c:163) ==99640== 由 0x8AFFB7E:create_scalable_zone(在 /usr/lib/libSystem.B.dylib 中) ==99640== 由 0x8AFF7EA:_malloc_initialize(在 /usr/lib/libSystem.B.dylib 中) ==99640== 0x8B23449:malloc_create_zone(在 /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== 0x8B233D3:_dispatch_continuation_alloc_from_heap(在 /usr/lib/libSystem.B.dylib 中)

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

还有其他建议吗?

【问题讨论】:

  • 我遇到了同样的问题。不过还没有解决方案。

标签: objective-c debugging ios valgrind


【解决方案1】:

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

#import "stdio.h" #import "fcntl.h" int open$UNIX2003(const char *pathname, int flags, mode_t mode) { 返回打开(路径名,标志,模式); } int read$UNIX2003(int fildes, void *buf, size_t nbyte) { 返回读取(fildes,buf,nbyte); } int close$UNIX2003(int fildes) { 返回关闭(文件); }

【讨论】:

    【解决方案2】:

    这是一个可怕的 hack,我不知道它的含义是什么……但它确实解决了问题:

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

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

    这似乎是使 valgrind 无法正常工作的唯一因素......您的里程可能会有所不同。

    【讨论】:

    • 喜欢它,出于某种原因,我什至没有想到要破解 valgrind 源代码。谢谢。
    • 我的意思是,它让我害怕,而且是一个非常肮脏的黑客。我不知道它需要什么实际的随机数。但是......它启动并给了我有用的信息,所以它不可能都是坏的:)
    猜你喜欢
    • 2012-01-07
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2011-05-30
    • 2011-05-29
    相关资源
    最近更新 更多