【发布时间】:2015-03-16 09:57:43
【问题描述】:
我需要在一个非常大的项目中调试堆溢出。在使用了 valgrind 之后,它似乎是检测 C 中堆块溢出的完美工具,所以我想用它来运行我们的 iOS 应用程序。
我已经在 OS X Yosemite 上从主干构建并安装了 valgrind,并编写了一个带有故意堆溢出的测试程序,并验证了 valgrind 捕获并报告它们。
现在我想用它在模拟器中运行一个测试应用程序。我读过它可以通过使用 execl() 在 iOS 模拟器中运行,但是当我这样做时,我在控制台中看到以下错误。
dyld:缺少 LC_DYLD_INFO 加载命令
之后,应用程序将在 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]));
}
}
【问题讨论】:
-
我遇到了完全相同的问题。 Valgrind 在非模拟器可执行文件上运行良好。这个 execl 技巧以前可以工作......
-
您好,您找到解决方案了吗? :) 非常感谢这个问题的解决方法。
标签: ios profiling ios-simulator valgrind memcheck