非常に大規模なプロジェクトでヒープ オーバーフローをデバッグする必要があります。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]));
}
}