地址 - 消毒剂https://code.google.com/p/address-sanitizer/wiki/AddressSanitizer
我编译了自己的llvm(非常简单的编译),因为apple的llvm不支持这个函数。
我已经测试了mac命令行程序的clang,它可以工作(但没有显示源代码行)。
对于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.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIAccelerometer.h:53:24:错误:' UIAccelerometer'不可用:OS X上不可用 - (void)加速度计:(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:注意:声明已明确标记为不可用 @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:错误:' UIAcceleration'不可用:OS X上不可用 - (void)加速度计:(UIAccelerometer *)加速度计didAccelerate :( UIAcceleration *)加速度NS_DEPRECATED_IOS(2_0,5_0); ...
ld:找不到文件:/Users/fluke/Documents/tools/asan/Debug+Asserts/lib/arc/libarclite_iphoneos.a clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
谁有这方面的经验?
答案 0 :(得分:1)
在朋友的帮助下,我终于得到了asan的工作。
将所有c / c ++代码移动到xcode项目的新目标(cocoa lib target)。使项目构建并正常运行,因为它是一个单独的应用程序,然后将单独的c / c ++代码添加到lib。
构建llvm。 ref http://blog.wadetregaskis.com/tot-clang-llvm-in-xcode/
为xcode添加一个clang选项。为方便起见,您可以使用此模板:http://blog.wadetregaskis.com/tot-clang-llvm-in-xcode/。将clang路径更改为刚刚在上一步构建的clang。
更改xcode中的lib目标以使用新的clang / llvm,添加一个cflag -fsanitize =地址。然后构建,如果报告不支持某些api(例如opengl /系统视频功能),那么你可以把它放到app项目中,你的clang不支持编译它。
如果你通过编译,它将报告__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报告。
你几乎就在那里,报告显示错误堆栈与文件的偏移量。您需要做的就是再一步 - 将地址解析为代码行。您需要找到项目的DWARF文件,然后使用名为asan_symbolize.py的工具生成包含源代码行的新报告。你可以goole asan_symbolize.py然后获取并修复此脚本以使用DWARF文件。您可以通过右键单击您的生产应用程序找到DWARF文件,选择show in finder,然后升级到获取iphone模拟器目录,打开名为your.app.dSYM的包,然后您可以在./Content中获取DWARF /资源/侏儒。
我在这里没有列出的唯一的东西是修改过的asan_symbolize.py,你可以自己修改它,它没有魔法,你只需要纠正一些路径就可以了。
答案 1 :(得分:0)
原帖中列出的错误与ASan本身没什么关系。你肯定会在没有-fsanitize = address标志的情况下得到它们。 目前还不支持构建和运行iOS,但是您可以构建一个针对iOS模拟器的应用程序 - 它应该可以正常工作。 请随时将更多问题发送至address-sanitizer@googlegroups.com