有没有人得到地址 – 消毒剂(称为asan或-fsanitize =地址)的iOS?

Address-Sanitizer https://code.google.com/p/address-sanitizer/wiki/AddressSanitizer

我已经编译了我自己的llvm(相当直接的编译),因为苹果的llvm不支持这个function。

我已经testing了mac命令行程序的铿锵声,它的工作原理(但没有显示源代码行)。

对于iOS,还是有一些问题:

  • 编译模拟器版本:预编译头文件报告错误:

在/Users/fluke/Documents/projects/tmp/testAsanNoARC/testAsanNoARC/testAsanNoARC-Prefix.pch:12中包含的文件中:从/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/包含的文件中SDKs / iPhoneSimulator6.1.sdk / System / Library / Frameworks / UIKit.framework / Headers / UIKit.h:9:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1 (UIAccelerometer *)加速度计didAccelerate :() UIAcceleration *)加速NS_DEPRECATED_IOS(2_0,5_0); ^ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIAccelerometer.h:33:12:note:声明已明确标记为不可用@interface UIAccelerometer:NSObject {^ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/System/Library/Frameworks/UIKit.framework /Headers/UIAccelerometer.h:53:71:error:'UIAcceleration'is unavailable:not available on OS X – (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration NS_DEPRECATED_IOS(2_0,5_0); …

  • 编译为设备版本,它报告缺乏libarc(但实际上我不启用ARC)

ld:找不到文件:/Users/fluke/Documents/tools/asan/Debug+Asserts/lib/arc/libarclite_iphoneos.a clang:error:linker命令失败,退出代码1(使用-v查看调用)

  • 所以我尝试使用它作为一个单独的库 – 只是新的lib目标,并使用我自己的铛,而主要目标仍然使用苹果的llvm。 该程序编译(可能需要链接到build立llvm的asan dylib),但不工作,因为我需要在我们的程序入口之前加载。

谁有这样做的经验?

我终于在朋友的帮助下为我工作了。

  • 将所有c / c ++代码移动到xcode项目的新目标(cocoa lib目标)。 使项目build立和运行正常,因为它是一个单独的应用程序之前分开的C / C ++代码到一个库。

  • build立llvm。 ref http://blog.wadetregaskis.com/tot-clang-llvm-in-xcode/

  • 给xcode添加一个clang选项。 为了方便您可以使用这个模板: http : //blog.wadetregaskis.com/tot-clang-llvm-in-xcode/ 。 改变铛path的铿锵刚build立在上一步。

  • 更改xcode中的lib目标以使用新的clang / llvm,添加cflag -fsanitize =地址。 然后build立,如果一些API(如opengl /系统videofunction)报告不支持,那么你可以把它放到应用程序项目,你的铛不支持编译它。

  • 如果通过编译,它会报告__asan_xxx函数的链接问题,将一个名为“libclang_rt.asan_osx_dynamic.dylib”的库添加到应用程序的链接依赖项中,它位于您的llvm的./Debug+Asserts/lib/clang/3.4/中lib / darwin /文件夹。

  • 那么你需要指定输出文件,否则报告将转到标准输出的颜色字符,这会混淆你。 把这些行放到main.m中:

    extern void __sanitizer_set_report_path(const char * path); __sanitizer_set_report_path( “/ TMP / asan.txt”);

  • 那么你可以让你的程序出现一些内存错误,比如在释放或堆缓冲区溢出之后使用。 asan会让程序在第一个错误中崩溃,并生成/tmp/asan.txt.number报告。

  • 你几乎在那里,报告显示与文件的偏移量的错误堆栈。 所有你需要做的是多一步 – 解决地址代码行。 您需要find项目的DWARF文件,然后使用名为asan_symbolize.py的工具来生成带有源代码行的新报告。 你可以goole asan_symbolize.py然后得到并修复这个脚本来使用DWARF文件。 你可以通过右键点击你的产品应用程序findDWARF文件,在finder中selectshow,然后上一级来获取iphone模拟器目录,打开名为your.app.dSYM的包,然后你可以在./Content中获得DWARF /资源/侏儒。

我没有在这里列出的唯一的东西是修改后的asan_symbolize.py,你可以通过自己修改它,它没有魔法,你只是纠正一些path,它会工作。

原帖中列出的错误与ASan本身无关。 当然,如果没有-sanitize = address标志,你肯定会得到它们。 目前还不支持构build和运行iOS,但是您可以构build一个针对iOS模拟器的应用程序 – 它应该可以正常工作。 请不要犹豫,直接进一步的问题address-sanitizer@googlegroups.com