地址消毒剂https://code.google.com/p/address-sanitizer/wiki/AddressSanitizer https://code.google.com/p/address-sanitizer/wiki/AddressSanitizer
我已经编译了自己的llvm(非常直接的编译),因为苹果的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);
...
- 编译设备版本,它报告缺少 libarc (但实际上我没有启用 ARC)
ld:找不到文件:/Users/fluke/Documents/tools/asan/Debug+Asserts/lib/arc/libarclite_iphoneos.a
clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 所以我尝试将它用于单独的库 - 只是新的库目标并使用我自己的 clang,而主要目标仍然使用苹果的 llvm。程序编译(可能需要链接到构建的llvm中的asan dylib),但不起作用,因为我需要在程序输入之前加载asan。
谁有这样做的经验?
在朋友的帮助下,我终于找到了asan的工作。
将所有 c/c++ 代码移动到 xcode 项目的新目标(cocoa lib 目标)。使项目正常构建和运行,因为它是一个单独的应用程序,然后将 c/c++ 代码分离到库中。
构建llvm。参考http://blog.wadetregaskis.com/tot-clang-llvm-in-xcode/ http://blog.wadetregaskis.com/tot-clang-llvm-in-xcode/
向 Xcode 添加 clang 选项。为了方便你可以使用这个模板:http://blog.wadetregaskis.com/tot-clang-llvm-in-xcode/ http://blog.wadetregaskis.com/tot-clang-llvm-in-xcode/。将 clang 路径更改为上一步中刚刚构建的 clang。
更改 xcode 中的 lib 目标以使用新的 clang/llvm,添加 cflag -fsanitize=address。然后build,如果有些api(比如opengl/系统视频功能)报不支持,那么你可以把它放到app项目中,你的clang不支持编译它。
如果你通过编译,它会报告__asan_xxx函数的链接问题,将一个名为“libclang_rt.asan_osx_dynamic.dylib”的lib添加到应用程序的链接依赖项中,它位于你的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 文件,选择在查找器中显示,然后向上一级获取 iphone 模拟器目录,打开名为 your.app.dSYM 的包,然后您可以在 ./Content 中获取 DWARF /资源/矮人。
我这里唯一没有列出的是修改后的asan_symbolize.py,你可以自己修改它,它没有魔法,你只需纠正一些路径就可以了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)