是否可以在iOS模拟器和设备上运行valgrind?

时间:2015-01-18 03:51:01

标签: ios profiling ios-simulator valgrind memcheck

我需要在一个非常大的项目中调试堆溢出。在使用valgrind之后,它似乎是检测C中堆块溢出的完美工具,所以我想用它来运行我们的iOS应用程序。

我在OS X Yosemite上从trunk创建并安装了valgrind,并编写了一个有意堆溢出的测试程序,并验证了valgrind捕获并报告它们。

现在我想用它在模拟器中运行一个测试应用程序。我已经读过它可以通过使用execl()在iOS模拟器中运行,但是当我这样做时,我在控制台中看到以下错误。

  

dyld:缺少LC_DYLD_INFO加载命令

之后,应用程序将在带有EXC_BAD_ACCESS的dyldbootstrap :: rebaseDyld()中崩溃。这还有其他必要吗? Valgrind显然也支持arm64。是否可以使用我的应用程序打包valgrind可执行文件并在设备上运行它?

#define VALGRIND "/usr/local/bin/valgrind"

int main(int argc, char * argv[]) {

    if ( argc >= 2 && strcmp(argv[1], "-valgrind") == 0 ) {
        if ( execl(VALGRIND, VALGRIND, argv[0], NULL) < 0 ) {
            NSLog(@"Failed to relaunch under valgrind");
            exit(1);
        }
        NSLog(@"Running under valgrind!!");
    }

    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

1 个答案:

答案 0 :(得分:0)

您可以使用xcrun simctl spawn在模拟器上启动任意进程,但无法在模拟器环境中运行macOS可执行文件。它与macOS共享内核,但在其他方面是不同的。您必须为iOS构建Valgrind,然后将其放在设备的数据目录中并尝试生成它。