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

标签 ios profiling ios-simulator valgrind memcheck

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

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

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

dyld: missing LC_DYLD_INFO load command

在那之后,应用程序将在 dyldbootstrap::rebaseDyld() 中崩溃并出现 EXC_BAD_ACCESS。这里还需要其他东西吗? 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]));
    }
}

最佳答案

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

关于ios - 是否可以在 iOS 模拟器和设备上运行 valgrind?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28006952/

相关文章:

objective-c - 调用指定返回类型和参数的内联 block

mysql - 如何清除 MySQL 查询配置文件

java - NetBeans 配置文件菜单丢失

iphone - iPhone模拟器崩溃?

ios - 如何通过 callkit 在 iOS 上结束通话?

ios - 如何识别哪个 GMSMarker 被点击 - iOS, Swift

linux - 可以从 perf.data 文件生成 perf-stat 结果吗?

删除设备后 Xamarin (VS) 中缺少 iOS 模拟器

ios - 在 iPhone X 模拟器的顶部和底部看到黑条

ios - 我们可以用 Generic 创建字典吗?