Tag: 调试

使用LLDB在Xcode中进行调试

数据冒险 犯了错误 有时,我们会对不正确的事情做出假设。 这种说法似乎很明显,这是人的天性。 编写软件时,最好质疑您的假设是否正确。 很多时候,您会发现,仔细检查后发现事情与最初出现的情况并不完全相同。 🤔挑战你的假设 使用Xcode时,可以质疑我们的假设的一种方法是使用调试器。 调试器是一种工具,可让您使用细粒度的控件检查和操纵代码执行。 通过调试,您可以更好地了解您的代码在做什么。 这篇文章旨在简要概述Xcode中的调试以及一些可以帮助您的工具。 我打算就调试主题撰写一系列文章,这是第一篇。 调试的主题非常广泛,本文并不旨在提供完整的概述。 如果您觉得缺少什么,请继续关注本系列的更多帖子。 另外,请随时给我评论。 崩溃的土地之旅 这听起来可能有些奇怪,但是可以将代码崩溃视为旅途。 当您点击运行时,它开始运行并编译。 在此过程中,它继续使用方法并具有许多特性。 最终,它成功地找到了坠机土地。 当您开始调试时,您只有一小幅图片。 您有起点和终点,但要知道如何到达那里,就需要追溯旅程的步骤。 为了帮助您完成旅程,Apple向您赠送了一个有价值的物品LLDB调试器。 控制台和LLDB LLDB是Apple提供的软件调试器,它是Xcode中的标准调试工具。 LLDB是一个功能强大的工具,可将应用程序分解为各个组件。 它的用途不仅限于Xcode IDE,即使您无法访问其源代码,也可以使用LLDB分解并检查应用程序。 鉴于功能和用途的广泛性,本文的含义更像是粗略的概述,我不想通过详细研究这些内容而超出范围。 调用堆栈 使用LLDB,我们能够检查调用堆栈以及堆栈中的特定堆栈帧 。 调用堆栈是由应用程序创建的数据结构,用于跟踪其所有行为。 数据结构 堆栈数据结构只是一个队列,在队列中添加的最后一个元素是从中返回的第一个元素(LIFO队列-先进先出)。这与物理世界中的情况大同小异:一堆砖的顶部(如果您从底部取出,即添加的第一块砖,它们都将崩溃。) 堆叠框架 在调用堆栈中有称为堆栈帧的结构。 堆栈框架包含有关为其创建执行的信息。 在调试时,许多此类信息可能会变得有用。 数据范围从局部变量到完成时返回的内存地址。 苹果文档: 程序运行时,它将有关正在执行的操作的信息存储在称为调用栈的数据结构中。 每次调用方法时,程序都会在调用堆栈的顶部推入一个新的堆栈框架 ,其中包含以下内容:传递给该方法的参数(如果有),该方法的局部变量(如果有的话)以及指向该地址的地址。方法调用完成后返回。 断点 如果您不熟悉代码断点,请允许我给您简要介绍一下。 在Xcode中,断点使您可以在特定点中断代码的执行。 这很有用,因为它使您可以在给定的时刻详细检查应用程序的状态。 断点类型 象征绕道 在进一步进入断点之前,让我们先谈谈符号化。 符号化是将内存地址映射到更简单的函数名称。 返回我们以前计划的编程 处理断点时,重要的是要了解有不止一种类型。 让我们简要地谈谈一些重要的类型: […]

初学者的Xcode调试(1):工具

调试是开发人员的惯常做法,可能会占用大量时间并带来深深的挫败感。 轻松快捷地进行调试始终是一个令人愉快的目标。 让我们探索一些可以立即应用的调试工具! NSLog(Obj -C)/打印(Swift) 在控制台中打印是一种常用的调试方法,尤其是在无法添加调试器(例如在生产应用程序中)或尝试调试竞争条件问题的情况下无法使用断点时。 但是,它需要比其他调试方法更长的时间,因为它要求您在每次更改日志消息时都重新运行该应用程序。 您还需要记住在完成调试后清理它们,尤其是当记录的消息包含敏感信息时。 基本断点用法 调试而不接触代码库的一种常见方法是设置断点。 您所需要做的就是单击代码编辑视图左侧的行号,然后会出现一个蓝色的断点箭头。 以下是使用断点的最常用方法: 检查Xcode调试区域左侧面板中的变量; (要查看该实例的属性,请单击变量左侧的箭头。) 键入po (打印对象)或直接在控制台中使用变量名进行print 。 您可以通过单击调试区域右下角的两个按钮来显示或隐藏左右面板。 有时,您可能会发现未显示变量值,但显示了“ 无法读取数据 ”错误,或者即使您知道这是一个谎言,也将这些值显示为nil 。 这通常是由于构建设置中的优化级别所致。 确保在“ 调试 ”配置中将其设置为“ 无 ”。 当您使用Cocoapods并尝试进入Pod的代码时,请确保您在Pods项目的相应Pod目标中检查了优化级别。 基本的断点工具可以解决很多调试需求,但不是全部。 当您要调试竞争条件时,在断点处停止永远不是最好的方法。 另一种情况是您不知道在哪里放置断点。 例如,您希望程序在引发错误的地方停止。 为了调试这些情况,我们需要深入研究更高级的断点用法。 高级断点用法 更多类型的断点 在Xcode的左侧,单击导航区域中的断点图标。 您可以在左下角看到一个“ + ”按钮,它允许您添加不同种类的断点。 以下是一些常用的断点类型: 建议使用“ 异常断点 ”来捕获异常并显示相关信息。 “ Symbolic Breakpoint ”使您可以停止无法访问的方法。 它通常用于阻止第三方库或iOS框架的方法。 例如,您可以使用-[UIViewController viewDidLoad]为该方法创建一个断点。 暂时禁用断点 您可以单击断点以启用/禁用它。 您也可以将断点拖到另一行或将其拖到代码编辑区域,然后释放鼠标将其删除。 编辑断点 […]

使用网络链接调节器实用程序

通过iOS和macOS上的Network Link Conditioner,您可以在网络条件下测试应用程序,例如用户在使用应用程序时可能遇到的情况。 它允许您模拟网络条件,例如3G,边缘或高延迟DNS。 在iOS上使用网络链接调节器 您可以在iOS的“设置”应用程序的开发人员页面中找到“网络”部分。 除了启用多路径网络,您还可以导航到默认情况下禁用的网络链接调节器。 您可以在此处阅读有关多路径网络的更多信息。 可以在“网络链接调节器”页面上找到默认预设的列表。 您可以通过点击其中之一来选择预设。 启用该开关,以在所选预设上测试您的应用。 可以通过导航到“ Add a profile页面来定义适合您需求的自定义预设。 在MacOS上使用网络链接调节器 在MacOS上使用该实用程序之前,您需要为当前Xcode版本安装其他工具。 通过导航到Xcode Main Menu > Open Developer Tool > More Developers Tools您可以在登录后下载这些工具。 在下载的.dmg内,您可以找到许多有趣的实用程序。 可以在“ Hardware文件夹中找到“网络链接调节器”。 通过双击该应用程序,您可以在“系统偏好设置”中安装该实用程序。 该应用程序与iOS版本非常相似,还包含一系列自定义预设。 这些可用于模拟一系列网络条件。 除此之外,您还可以在“ Manage Profiles页面中定义自己的预设。 选择预设并启用开关后,您可以在仿真网络预设的同时开始在模拟器中测试Mac OS应用或iOS应用。 这个故事最初发布在: https://www.avanderlee.com/debugging/network-link-conditioner-utility/

Hello RemoteDebug iOS WebKit适配器:从任何地方调试Safari和iOS WebView

目的 此适配器可通过基于Chrome调试协议(CDP)的工具在iOS上调试Safari / Webkit。 该项目的范围是提供一个协议适配器,以处理Chrome调试协议和Webkit远程调试协议之间的API差异 。 该项目是在顶部构建的,是现有ios-webkit-debug-proxy项目的延续。 目标 我希望通过拥有一个开放源代码协议适配器,我们可以团结精力和资源,直到现在为止,这些资源和资源一直用于保持 Apache Cordova 和iOS WebKit / Safari Web调试为各种工具和客户端工作。 使用一个遵循Chrome调试协议(CDP)API的中央协议适配器,工具可以专注于实现该API,并让协议适配器处理兼容性。 建筑 协议适配器在TypeScript中作为基于节点的CLI工具实现,该工具启动ios-webkit-debug-proxy的实例,检测连接的iOS设备,然后根据iOS版本启动正确的协议适配器的实例。

改进的ATS日志

当明文HTTP负载潜入您的应用程序时(您不允许进行繁重的负载吗?),iOS和macOS上的网络库CFNetwork会为您提供以下良好的控制台消息: 2017–08–27 14:08:11.589 MyApp [24489:5654631]应用传输安全性由于不安全,因此阻止了明文HTTP(http://)资源加载。 可以通过应用程序的Info.plist文件配置临时异常。 有用,但仅显示一次,并且不会告诉您该URL是什么。 我们可以通过使用未记录的UserDefaults键: com.apple.cfnetwork.ats.loglevel到2来使它更有用。 2017-08-27 14:09:31.125 MyApp [24508:5688634] ATS政策阻止了http://www.google.com/的加载。 现在,它会在每次阻止负载时记录日志,其中包括URL。 设置此键的最简单方法是编辑方案(⌘<),并将一个项目添加到“运行时在启动时传递的参数”中。 请记住,作为参数传递的UserDefaults的语法是-key -key value 。 输入-com.apple.cfnetwork.ats.loglevel 2如下所示: 请记住,此密钥未记录。 我发现它比默认的日志消息更有用,而比完整的CFNetwork诊断日志更不那么冗长,更易于使用。

调试应用商店评论错误日志

前几天,我向iOS App Store提交了应用程序的初始版本。 我已经在众多模拟器和可以访问的任何物理iOS设备上进行了测试。 尽管进行了所有测试,但我提交的应用程序显然在Apple审阅者加载时崩溃了。 调试它们的错误听起来像是一项艰巨的任务。 我可以重现崩溃吗? 如果不解决此问题,我将无法再发布我的应用程序。 幸运的是,我手头有几件事:我已上传到应用商店的存档二进制文件,以及他们附加的.txt文件中的一些崩溃日志。 注意:通常最好使用 Fabric / Crashlytics之 类的工具 来跟踪并深入 探究 bug。 使用XCode将应用程序上载到应用程序商店时,通常需要完成存档,验证并将其发送到iTunes Connect的过程。 我最初想到的是我可以使用相同的二进制文件在手机上安装该应用程序,并确认它是正确的版本且未损坏。 如果对我来说麻烦了,那将是解决问题的轻松开始。 通常,从XCode运行应用程序时,我会运行调试版本并在现场构建它。 我该如何安装与审阅者相同的东西? 在XCode中,如果转到“ Window > Organizer ,它将加载Archive Organizer 。 选择所需的存档,右侧应该有一个选项将其Export 。 临时导出。 它将创建一个包含一些文件的文件夹。 它的主要内容是.ipa文件。 要在您的设备上安装.ipa文件,请转到XCode中的Window > Devices and Simulators 。 选择Devices ,然后单击您的设备。 您应该看到已安装应用程序的列表。 如果您将.ipa文件拖到那里,它将安装您的应用程序。 可悲的是,这没有像我预期的那样对我产生任何见解或新结果。 我尝试的第二个选项是通过iTunes Connect设置“测试飞行”。 这对我来说也很好,所以继续下一步! 我可用的第二个更好的工具是审阅者附加的崩溃日志。 它们以.txt文件的形式发送,该文件具有一些可读的内容,但包含许多毫无意义的十六进制地址。 例如: 日期/时间:2018-01-01 23:51:15.4916 +0900 […]

BUGS BUSTERS

最佳iOS崩溃报告工具 一个真正的男人需要接受他并不完美。 大多数情况下,开发人员是男性,因此他们也不是完美的,有时您可能会发现应用程序中的错误。 他们尽力构建没有任何错误的应用程序,但通常情况下,错误会在发布后的一段时间内就已经暴露出来。 有时,此类错误会导致崩溃,而这是没有用户喜欢的。 这种错误并不是偶然地以这种特殊昆虫命名的,因为您感到的烦恼几乎就像被长腿跳屁股吸血性掠食性刺客咬伤一样。 这些向后弯曲的昆虫主要生活在热带地区或任何具有伪装和防护措施的栖息地,因此它们可以爬入墙壁并从其藏身处袭击您,而这些错误却发生在计算机程序和系统中。 它们会干扰源代码,设计或框架中现有系统的功能,导致系统产生意外的挫折并触发意外行为并最终崩溃。 不过,请放心,因为有许多出色的iOS崩溃报告工具可以帮助您将血腥的bug排除在外! 它们会显示崩溃和登录详细信息,以便您以后进行查看,甚至向您发送电子邮件通知,告知崩溃发生的时间和频率。 总结在系统中产生崩溃或无效输出的错误的报告通常称为错误报告,缺陷报告,故障报告,问题报告,故障报告,变更请求等。 随着时间的流逝,移动应用程序崩溃报告工具变得更加灵活,并且对开发人员更加友好。 它们变得易于集成,并提供了可用性,新功能和用户体验。 从用户的角度来看,崩溃超出了简单的烦恼范围。 当您的应用程序由于故障突然停止运行而没有任何反馈时,通常会导致数据丢失和用户烦恼。 使用崩溃报告器工具可使您从应用程序中收集记录中需要的所有信息,以解决这些小问题。 崩溃报告工具软件结合了两个元素,形成一个连贯的整体:报告库和服务器端收集器。 报告库的任务是介绍有关崩溃的详细信息。 服务器端组件的职责是收集崩溃数据分析和统计信息,并以适当的方式正确显示出来。 无论何时何地,都有崩溃报告工具的配方。 我们经常使用或在特定情况下使用的此故障分析中包含的所有工具选项。 这就是为什么我们没有选择奖牌获得者并提供评估选项。 目的是奖励每种工具的优势并展示其劣势。 然后,您可以得出结论,哪种崩溃报告框架可以解决潜在的应用崩溃问题。 Crashlytics (免费,crashlytics.com) Crashlytics,一个著名的库,被发现可广泛用于iOS应用程序崩溃报告。 Crashlytics最近被Twitter收购,它密切关注iOS应用中的所有崩溃活动,并立即将它们报告给服务器,并仔细查看每次崩溃的令人不安的画面。 Crashlytics在这方面非常高效,因为它可以找到导致应用程序崩溃的确切代码行,可以查看内存堆栈跟踪,因此您可以在相同的环境下重新创建崩溃。 Crashlytics最引人注目的是它的主动性。 与大多数其他工具不同,它考虑了诸如崩溃频率之类的问题并定义了“影响级别”。当特定崩溃发生时,它将通知您任何更改,并分析故障的所有后续后果。 当一遍又一遍报告同一崩溃时,Crashlytics会跟踪该数据,就像“嘿,您尚未解决一个尚未解决的问题,它开始变得值得一提。”从字面上看,崩溃,需要先处理其他事情。 对于每个用户,Crashlytics会立即为每个用户立即向所有员工发送消息,以确保制定了程序并且不会发现任何应用程序崩溃事件。 该工具易于使用,具有经过精心设计的应用程序仪表板,以及系统中发生的应用程序崩溃的所有详细信息以及崩溃的位置, 日期和时间 ,易于使用。 Crashlytics不仅报告崩溃并显示错误,而且还提供了一个界面,允许用户并简化对其的访问。 例如,如果您的应用程序的较新版本中解决了某种类型的崩溃,则可以将其标记为已修复并从仪表板中删除。 然后,Crashlytics将在您的早期版本的应用中跳过此类崩溃。 Crashlytics提供了有关您的应用程序正在使用的设备的详细信息,可帮助您了解确切的运行环境以解决问题。 这些信息包括: 内存 操作系统版本 取向 电池状态 设备是否越狱 磁盘空间 Crashlytics支持与第三方应用程序维护(如Campfire,JIRA,Hipchat,Pivotal Tracker,Redmine和Pager Duty)的集成。 Crashlytics的唯一缺点是它不支持移动应用程序分发功能。 Instabug ($ 0- $ […]

React Native —使用iOS版Safari的快速`console.log / warn / error`

有很多方法可以调试React Native,例如: 面子书 反应堆 React Native调试器 我只想分享我通常使用的一种方法,即使用Safari的 Web Inspector 。 并且不需要远程调试JS。 如何使用它: 对于真实设备:在设置 > Safari > 高级中启用Web Inspector 在macOS中打开Safari ,转到菜单:“ 开发” >“ YOUR_PHONE /模拟器” >“ JSContext” Web检查器将打开并显示您的代码中console.log/warn/error所说的内容 这种方式的缺点和优点: 缺点:非常易于使用,而且超级快。 优点:只能查看console.log / warn / error 谢谢您的阅读!!!

React Native调试简介-iOS

优秀的软件开发人员还必须是出色的调试器 作为软件开发人员,我们产生代码并引入错误。 不是故意的,但是我们做到了! 当涉及调试本机应用程序时,特别是作为初学者,这是真的! 由于Xcode不支持调试javascript代码,因此即使您是经验丰富的iOS开发人员,您也将难以调试React代码。 因此,在本文中,我将逐步介绍如何使用不同的工具在react-native应用程序中调试javascript代码。 使用Chrome控制台进行调试 这是调试本地应用程序的最简单,最常用的方法。 Chrome Dev Tools具有标准的调试功能。 它将显示所有控制台输出,使用断点,调试器暂停等。 在iOS模拟器或设备中运行您的应用程序 在iOS模拟器上按Command + D或摇动物理设备,这将打开以下应用程序内开发人员菜单, 3.点击“远程调试JS”。 然后,Chrome调试器将自动在http:// localhost:8081 / debugger-ui打开 4.启用“暂停捕获的异常”以获得更好的调试体验。 5.按Command + Option + I打开Chrome开发者工具,或通过Chrome菜单View > Developer > Developer Tools打开它。 并确保您在Console选项卡上 6.现在,您应该能够看到调试控制台。 7.现在,无论何时执行console.log语句,它都将出现在“ Console选项卡中。 使用Visual Studio代码进行调试 安装React Native Tools扩展。 单击视图栏中的调试图标,然后单击齿轮图标以选择添加配置。 从配置下拉列表中选择React Native调试环境,以便创建新的launch.json文件。 要启动调试会话,请从配置下拉菜单中选择“ Debug iOS ,然后单击“开始”按钮(或按F5键) 5,现在您可以在代码中放置断点并在模拟器上运行,请确保Debug JS Remotely启用Debug JS Remotely 如果您在任何浏览器标签上都运行了chrome调试器,则需要关闭该调试器。 其他VS调试器将无法正常工作。 […]

引入AlamofireSafariLogger —一个轻量级的Alamofire网络通话监控库

在开发周期中,我花了大量时间进行网络调试。 在android中,我们有Stetho。 我可以在没有Android Studio的Chrome网络检查器上查看所有请求和响应。 在iOS开发中,我使用控制台日志或Charles,这需要在特定的macOS上进行一些设置(或许可)。 我已经在iOS开发上找到了Stetho等效的设备,但是它没有简单的解决方案。 我写AlamofireSafariLogger是因为我想更轻松地进行网络呼叫调试。 最终结果是,我记录了从Alamofire到Safari Web检查器的所有请求和响应。 与Stetho不同,我不是在“网络”选项卡中而是在“控制台”选项卡中登录。 最终结果如下所示。 设定 pod’AlamofireSafariLogger’ 在您的appDelegate中, func application(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?)->布尔{ //添加此startLogging()行 AlamofireSafariLogger.shared.startLogging() // … } 而已。 现在,您需要在Safari中启用开发菜单。 在Safari Perference>高级>选中“在菜单栏中显示开发菜单” 如果您要使用设备进行调试,请打开“设置”> Safari>“高级”>启用“ Web检查器”。 当您的应用程序运行时,您会在开发人员标签下找到“ about:blank”。 单击它,您现在可以使用Web检查器调试alamofire网络通话! 当前设计中的控制台日志级别: 标题:日志 身体:警告 错误:错误