有谁能够在 iOS 上使用 Address-Sanitizer(称为 asan 或 -fsanitize=address)吗?

2024-04-08

地址消毒剂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(使用前将#替换为@)

有谁能够在 iOS 上使用 Address-Sanitizer(称为 asan 或 -fsanitize=address)吗? 的相关文章

  • NSMutableAttributedString 的自动换行

    我有 NSMutableAttributedString 并且字符串很长 我想在 UIlabel 上显示它时进行自动换行 如果是 NSString 我会继续做这样的事情 动态 UILabel 截断文本 https stackoverflow
  • 如何在 Instagram 等应用中使用“@”提及用户

    我正在创建一个具有照片共享功能的应用程序 并且我正在尝试添加提及 或标记 用户的功能 Twitter 最初开始使用 和用户名来标记用户 但现在从 Facebook 到 Instagram 都在使用它 这是iOS端实现的还是后端实现的 我目前
  • UICollectionViewCell - 内容不会与单元格的 contentView 一起动画

    问题看起来像这样 http i imgur com 5iaAiGQ mp4 https i imgur com 5iaAiGQ mp4 红色是cell contentView的颜色 这是代码 https github com nezhybo
  • 在 iOS 8 Today 扩展中获取 parse.com 用户数据时出现异常

    我正在尝试获取 PFUser 的 PFObjects 列表以在 iOS 8 Today Widget 中显示 按照此博客文章 http blog parse com announcements introducing local data
  • iOS 信号处理程序可以轻松收集哪些原因信息?

    我正在尝试向应用程序添加一些崩溃日志记录 并且我有一个signal设置处理程序以捕获标准 致命 信号 我可以在信号处理程序中实际 简单地收集哪些 原因 信息 如果有 以进行记录 我花了大约 2 小时谷歌搜索内容 但我找到的大部分内容都是针对
  • 如果您要使用的库尚不支持 Carthage 该怎么办

    我正在评估 Carthage 是否适合我的项目 我想找到答案的问题之一是当我想要使用的库 框架不支持 Carthage 时该怎么办然而 你们中有人曾经遇到过这个问题并找到了解决方案吗 Thanks 迦太基需要的主要东西是一个框架 并且该框架
  • 如何在ios应用程序中打开应用程序商店?

    我正在使用此代码对 iOS 应用程序中的应用程序进行评分 let appLink https itunes apple com us app name of the app id idnumber mt 8 let url URL stri
  • 共享扩展 - 自 iOS 14 以来首次尝试时应用程序未显示在共享菜单中

    升级到 Xcode 12 和 iOS 14 后 似乎开始发生一些奇怪的事情 应用程序以前在共享菜单选项中显示良好 但突然它表现得很奇怪 并且仅在第二次尝试后才显示 我的目标是获取网页网址 这是我的共享激活规则 我什至尝试过新项目 并添加了带
  • 无法覆盖 Rustup 工具链以自定义构建 iOS 工具链

    我正在用我的 Rust 版本创建我自己的工具链 我需要它与 iOS 架构进行交叉编译 当尝试设置默认工具链或覆盖当前目录的工具链时 我收到有关工具链名称的错误 以下是我创建这个新工具链所采取的步骤 创建 Rustup 工具链 rustup
  • 为什么界面构建器不能使用 UIView 的具体通用子类?

    首先 这已被投票关闭 作为为什么不能直接在 Interface Builder 中使用泛型的重复 TLDR 的答案是 IB 使用 Objective C 而 Objective C 不支持泛型 无论如何 没有办法指定泛型的 特殊性 即它使用
  • 如何检测 iPhone 中按下的键盘按键?

    我想检测用户何时按下任何键盘键 仅在键入任何字符时调用的任何方法 而不是在显示键盘时调用的方法 Thanks 您可以在用户每次按键时直接处理键盘事件 Swift 对于文本字段 请使用以下委托方法 func textField textFie
  • 通过 Facebook iOS SDK 获取我的所有活动

    在我的 iOS 应用程序中 我使用以下代码获取访问令牌 self facebook authorize NSArray arrayWithObjects user events friends events nil 然后我使用以下代码请求我
  • iPhone应用程序NSNumber内存泄漏

    我遇到了内存泄漏 但我不知道它从哪里来以及如何修复它 在某些时候 我计算两个位置之间的距离 double calc self getDistance location to otherLocation NSNumber distance N
  • 正式协议对象有什么用

    我们可以在源代码中创建协议对象 但是正式的协议对象有什么用呢 Protocol myObj protocol protocolName 您可以使用它来检查对象是否符合协议 anotherObject conformsToProtocol m
  • 无法在动画块内更改隐藏属性

    我在 UIStackView 中嵌入了两个 UILabel 顶部标签始终可见 但底部标签可通过hidden财产 我希望这个效果是动画的 所以我把它放在一个动画块中 private func toggleResultLabel value D
  • 如何使用 OpenGL ES 2.0 旋转对象?

    在 OpenGL ES 1 1 中 您可以使用glRotatef 旋转模型 但 OpenGL ES 2 0 中不存在该函数 那么 在OpenGL ES 2 0中如何进行旋转呢 为了遵循克里斯蒂安所说的 您需要自己跟踪模型视图矩阵并操纵它来执
  • 表视图重新加载部分崩溃

    我有一个包含 4 个部分的表格视图 每个部分有 1 2 个表格视图单元格 第一个单元格有一个 uiswitch 作为附件视图 控制应用程序的颜色主题 在白天模式和夜间模式之间切换 一旦按下开关 就会调用一个函数 更改导航栏的颜色和背景颜色
  • 如何使 Raspberry Pi 3 可被 iOS 和 CoreBluetooth 发现?

    我有一个 Raspberry Pi 3 我正在尝试使其可供 iOS 设备发现 我跑了sudo hciconfig hci0 piscan让它被发现 我可以用我的 iMac 看到它 在 iOS 上 我使用 CoreBluetooth 并扫描附
  • 如何在 Objective-C 中创建委托?

    我知道代表如何工作 也知道如何使用它们 但我该如何创建它们呢 Objective C 委托是一个已分配给delegate属性另一个对象 要创建一个 您需要定义一个实现您感兴趣的委托方法的类 并将该类标记为实现委托协议 例如 假设您有一个UI
  • Xcode:仅发布适用于 iPhone 的应用程序更新? [复制]

    这个问题在这里已经有答案了 我过去曾为 iPhone 和 iPad 制作过应用程序 但最新的更新仅适用于 iPhone 我换了Target Device Family to iPhone Only并存档和验证 但我收到错误 This bun

随机推荐