ARTS 08 - iOS Crash 分析攻略

Posted by Calvin on 2020-08-07

前言:什么是ARTS?

ARTS 源于耗子叔在极客时间的专栏《左耳听风》打卡活动。

Algorithm:每周至少做一个 Leetcode 的算法题。主要是为了编程训练和学习。

Review:阅读并点评至少一篇英文技术文章。主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。

Tip:学习至少一个技术技巧。主要是为了总结和归纳你在日常工作中所遇到的知识点。

Share:分享一篇有观点和思考的技术文章。主要是为了建立你的影响力,能够输出价值观。

Algorithm

两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

Python3 代码:

class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
a = ListNode() # 保留完整的链表
l3 = a # 保留完整的链表
c = 0 # 进位
while l1 or l2:
x=l1.val if l1 else 0 # 没有下一节点时取0
y=l2.val if l2 else 0
tmp = x+y
if tmp+c <10:
l3.next = ListNode(tmp+c)
c=0 # 不进位,清零
else:
l3.next = ListNode(tmp+c-10)
c=1 # 进位,进1
# print(tmp)
# print(l1)
# print(l2)
if l1:
l1 = l1.next # 进入链表的下一节点
if l2:
l2 = l2.next # 进入链表的下一节点
l3 = l3.next
if c==1:
l3.next = ListNode(1) # 最后一个进位增加一个末尾节点,元素为1
return a.next # a的第一个是0,因此去头节点

Review

iOS Crash 分析攻略

本文主要从 Crash 日志渠道、Crash 捕获的原理、看懂 Crash 日志、Crash分析方法 等角度向大家普及下 Crash 原理及分析的思路。

其中讲到的知识点有:Mach异常、UNIX信号、常见 Crash 错误码、Mach-O、汇编等。

Crash 定位的过程是不断追溯 Crash 现场发生了什么的过程,通过对 Crash 日志的原理和内容的深入了解,可以帮助我们更快更好的定位应用崩溃问题。

然而现实中可能还是会有些疑难的 Crash 不易定位,是因为 Crash 日志其实也并未保存了 Crash 现场最全的信息,更进一步的优化就是丰富 Crash 日志的信息,让我们获取更多的 Crash 现场信息, 比如 KSCrash 这个框架在这块做了一些努力。这些开源项目的代码是值得学习的。

参考&引用&拓展阅读

总线错误: https://zh.wikipedia.org/wiki/%E6%80%BB%E7%BA%BF%E9%94%99%E8%AF%AF

书籍:《深入解析 Mach OS X & iOS 操作系统》

崩溃捕获系统的原理: https://junyixie.github.io/2019/09/28/CrashMonitorSystem/

分析iOS Crash文件: https://developer.aliyun.com/article/8854

iOS开发同学的arm64入门: https://blog.cnbluebox.com/blog/2017/07/24/arm64-start/

SIGSEGV 和 SIGBUS: https://www.cnblogs.com/charlesblc/p/6262783.html?spm=ata.13261165.0.0.26cd7529Cecpmj

iOS 调试进阶:https://zhuanlan.zhihu.com/c_142064221

KSCrash:https://github.com/kstenerud/KSCrash

PLCrashReporter: https://github.com/microsoft/plcrashreporter

Tip

Ten Useful Git Log Tricks

简洁的方式查看

git log --oneline

此命令可帮助您以更简洁的方式查看提交。它会将每次提交压缩到一行,并且只有很少的信息,例如较短的提交哈希,提交消息。

按日期查看

git log --after="2020-15-05"
git log --after="2020-15-05" --before="2020-25-05" // 仅显示5月15日至5月25日的提交
git log --after="yesterday" // shows only commits from yeserday
git log --after="today" // shows only today commits
git log --before="10 day ago" // omits last 10 days commits
git log --after="1 week ago" //show only commits from last week
git log --after="2 week ago"
git log --after="2 month ago" // shows only last 2 months commits

这些命令将按给定的时间间隔过滤提交。例如,– after将仅在给定时间段之后进行提交,而– before将仅在给定时间段之前进行提交。

git日志与差异更改

git log -p

此命令将显示具有差异更改的日志。这样您就可以知道每次提交中所做的更改。

按作者过滤提交

git log --author="Srebalaji"

上面的命令将过滤出特定作者所做的提交。请注意,Git按正则表达式模式过滤掉。因此,不必担心确切的名称匹配或区分大小写。

Git日志可以采用多个选项,因此你可以根据需要组合选项。例如,

git log --after="1 week ago" --author="srebalji" -p

通过日志消息过滤提交

git log --grep="ISSUE-43560"

上面的命令将按各自的模式过滤提交。并且请记住,默认情况下它区分大小写。要使搜索不区分大小写,可以传递-i参数

git log -i --grep="issue-43560"

下面的命令正在使用正则表达式模式搜索,并将搜索两个问题ID。

git log -i --grep="issue-43560\|issue-89786"

Share

Just JavaScript 课程

著名程序员 Dan Abramov 正在撰写的 JavaScript 教程,他还没有写完。只要在上面网址报名,每写好一部分就会通过邮件发给你。

如何优雅做系统错误提示?

对于软件系统的错误提醒,作者在文章中给出了 4 点建议。

  1. 不要提示用户不关心的信息
  2. 清楚表达问题原因
  3. 给出引导建议
  4. 提示内容尽可能简短

iPadOS 鼠标的设计哲学

iPadOS 是 Apple 最近两年重点发力的系统,也是苹果希望打造强于 PC 的系统。而相比较于传统的 PC,iPad 本身是触摸设备,而如何使鼠标的接入更加的好用和自然,这是 Apple 花了很大心思做的事情。

作者王禹效在这篇文章里详细分析了 Apple 是如何为 iPadOS 设计鼠标功能的,包括与传统桌面操作系统鼠标在逻辑、显示和设计上的区别,以及 Apple 做出这些改变的原因。

作者认为其实 Apple 不是什么魔法师,只是在设计时认真的去为用户做考量,愿意在这些别人不在意的细节上投资。一点点积累之后,就有了自己独特的用户体验。