有谁能够在 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)吗? 的相关文章

  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 如何在 Swift 中将文件名与文件扩展名分开?

    给定包中文件的名称 我想将该文件加载到我的 Swift 应用程序中 所以我需要使用这个方法 let soundURL NSBundle mainBundle URLForResource fname withExtension ext 无论
  • iOS - 如何在 swift 中使用 `NSMutableString`

    我已经看过这段 Objective C 代码 但我很难在 swift 中做同样的事情 NSMutableAttributedString res self richTextEditor attributedText mutableCopy
  • 如何找到键盘未覆盖的视图部分(UIModalPresenationStyleFormSheet)?

    我有一个视图控制器 显示带有 UITextView 的视图 并且我想在键盘出现时调整视图的大小 以便 UITextView 不会被键盘覆盖 我几乎在所有情况下都可以正常工作 据我所知 仅当视图控制器以 ModalPresentationSt
  • React-native-vision-camera无法访问后面的普通摄像头

    我正在尝试在 iPhone 11 Pro 上使用 普通 相机 我使用反应本机视觉相机 当我运行这段代码时 const devices useCameraDevices const deviceBack devices back consol
  • 将自定义数据包含到 iOS 故障转储中

    你好 堆栈溢出 有一个简单的问题要问您 当我的应用程序在用户的设备上崩溃时 是否可以将自定义错误数据嵌入到自动生成的 iOS 故障转储中 例如 我的 SQlite 数据库由于某种原因无法运行 例如 数据库文件已损坏 我无法从这个错误中恢复
  • 如何制作带有 SWIFT 图像的弹出窗口

    我想知道如何制作类似于此示例的弹出窗口 原始窗口充满了按钮 选择这些按钮后将拉出我想要使用的图像 我会简单地创建一个可重用的UIView组件以及作为子视图所需的一切 例如UIImageView为了你的形象 UILabel or a UIBu
  • 每 24 小时触发一次方法

    我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
  • CALayer边框奇怪问题

    我正在向 CALayer 添加边框 但有一些奇怪的行为 在我应用的边框之后出现模糊边框 参见屏幕截图 这是我的代码 void configureLabel self hidden YES self textAlignment NSTextA
  • ios swift parse:从 3 个类收集数据

    我有这样的结构 User CardSet 带有指向 User objectId 的指针 user 和 col name 带有点 cards 的卡片到 Card Set objectId 和列 name 我想选择所有卡数据 包括当前用户的卡集
  • 为什么 iOS 启动屏幕很慢?

    我的 iOS 应用程序启动屏幕大约需要 3 5 秒 我有一张将在启动屏幕后加载的地图 我的用户必须等待启动屏幕加载 然后再等待 3 秒才能加载地图 有没有办法最大限度地减少启动屏幕时间 基本上这种延迟意味着you在启动过程中做了一些非常错误
  • 用户验证 Facebook 后未调用应用程序打开 Url 方法

    我已将 ios 应用程序中的 facebook 升级到 3 0 并使用提供的代码https developers facebook com docs howtos login with facebook using ios sdk http
  • 会话重新启动后 AVcapture 会话启动缓慢

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • UIViewControllerAnimatedTransitioning:旋转更改后黑屏片段

    我已经创建了一个视图控制器转换 只要我不更改设备方向 一切都正常 图 1 显示了应有的屏幕 然后我切换到下一个视图控制器 在其中更改方向 现在我回到第一个视图控制器并再次切换方向 然后我得到的结果如图 2 所示 出现黑色边框 请不要介意屏幕
  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • 如何在代码中编辑约束

    我有一个以 100 开始宽度限制的网页 当用户单击按钮时 我想将约束更改为 200 我试过这个 NSLayoutConstraint constrain NSLayoutConstraint constraintWithItem self
  • 使用 MapKit 的地形和卫星视图

    我是 Mapkit View 的新手 当我给出没有目的地的纬度和经度时 我想显示 MapKit中是否可以通过地形 卫星视图来显示地图 有教程链接吗 我看过一些访问 Google 地图 API html 文件 的示例 有必要吗 或者您可以通过
  • UIView 圆角 - Swift 2.0?

    我会尝试将一些项目更新到 Swift 2 0 我有一个视图 左上角有一个圆角 在 Swift 没有警告 没有错误 只是没有圆角 这就是它在 Swift let maskPath UIBezierPath roundedRect conten
  • 模态转场需要点击 2 次而不是 1 次

    我的 UITableView 需要点击 2 次才能显示所选单元格的详细信息页面 一次用于选择 另一次用于显示详细信息视图 我希望有一个 CLI 直接显示所单击单元格的详细视图 我在 UITableViewManager m 中使用此方法的模
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的

随机推荐