<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[chaoyuan899的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/chaoyuan899</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; chaoyuan899]]></copyright><item><title><![CDATA[如何使用dSYM文件来符号化崩溃信息]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/155543118</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/155543118</guid><author>chaoyuan899</author><pubDate>Wed, 03 Dec 2025 23:39:45 +0800</pubDate><description><![CDATA[iOS崩溃日志符号化摘要：本文介绍了如何将不可读的崩溃堆栈信息转换为可读格式。主要内容包括：1）符号化必要性，原始崩溃日志难以定位问题；2）获取dSYM文件的方法，包括调试环境配置和从ipa包提取；3）手动分析.crash文件，展示了崩溃日志结构。通过dSYM文件中的地址映射关系，可将十六进制地址转换为具体的函数名和行号，帮助开发者快速定位崩溃原因。文中详细说明了Xcode配置、命令行工具使用及日志分析方法。]]></description><category></category></item><item><title><![CDATA[详解没有dSYM文件如何解析iOS崩溃日志]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/155542708</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/155542708</guid><author>chaoyuan899</author><pubDate>Wed, 03 Dec 2025 22:59:10 +0800</pubDate><description><![CDATA[本文介绍了在iOS应用崩溃日志缺失dSYM文件时的符号化方法。通过分析崩溃日志中的内存地址，结合二进制文件的基址和偏移量，可以恢复符号表定位具体崩溃函数。文章详细演示了如何从非标准崩溃日志中提取基址信息，并利用开源工具restore-symbol恢复符号表。该方法能有效解决因dSYM文件丢失导致的崩溃定位问题，为开发者提供了一种替代的崩溃分析方案。]]></description><category></category></item><item><title><![CDATA[ips 文件符号化]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/155542942</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/155542942</guid><author>chaoyuan899</author><pubDate>Wed, 03 Dec 2025 22:56:44 +0800</pubDate><description><![CDATA[以上符号化需要的几个文件都放到同一个目录下面，例如 crashLog，然后 cd 到 crashLog ，执行以下命令。然后再执行回上面的符号化命令就可以看到。1、导出 ips 文件，改后缀名为。3、导出 dsym 包。]]></description><category></category></item><item><title><![CDATA[使用 atos 符号化具体崩溃行]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/155542731</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/155542731</guid><author>chaoyuan899</author><pubDate>Wed, 03 Dec 2025 22:40:08 +0800</pubDate><description><![CDATA[摘要：文章介绍了iOS应用崩溃日志的分析方法，重点讲解了使用atos工具符号化崩溃地址的步骤。通过计算模块加载地址和崩溃地址，结合xcrun atos命令可以将机器码转换为可读的函数名。同时指出需要注意处理不同ARM架构的情况，并提及系统库符号化需要借助IDA或otool工具。文章还提供了系统符号表存储路径和otool的使用示例，为开发者提供了实用的崩溃日志分析指导。]]></description><category></category></item><item><title><![CDATA[确定crash文件和dSYM是否对应]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/155542631</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/155542631</guid><author>chaoyuan899</author><pubDate>Wed, 03 Dec 2025 22:32:53 +0800</pubDate><description><![CDATA[摘要 通过UUID匹配确保crash文件与调试符号文件(dSYM)对应是iOS崩溃分析的关键步骤。三个关键UUID需要一致：应用程序二进制文件(xx.app)、调试符号文件(xx.app.dSYM)和崩溃报告中的UUID。可以使用dwarfdump --uuid命令查看前两者的UUID，而崩溃报告的UUID位于Binary Images部分的尖括号内。匹配这些UUID能确保正确解析崩溃堆栈信息。此外，崩溃报告还提供了slide address(0x1000ac000)等重要调试信息。]]></description><category></category></item><item><title><![CDATA[符号表和 dSYM UUID 确认]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/155542548</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/155542548</guid><author>chaoyuan899</author><pubDate>Wed, 03 Dec 2025 22:27:12 +0800</pubDate><description><![CDATA[本文介绍了iOS开发中符号表与dSYM文件的重要性及使用方法。符号表用于映射内存地址与代码位置，帮助解析Crash堆栈。dSYM文件包含调试信息，需在发布时备份。文章详细说明了如何定位、生成dSYM文件，检查其UUID匹配性，并从Xcode/iTunes找回已发布的dSYM文件。特别提醒开启Bitcode时需从App Store下载对应dSYM文件。最后介绍了通过Bugly工具上传符号表的方法，为开发者提供了完整的Crash分析解决方案。]]></description><category></category></item><item><title><![CDATA[从源码看 Block 和 __block 的实现]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/149330642</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/149330642</guid><author>chaoyuan899</author><pubDate>Tue, 15 Jul 2025 16:17:20 +0800</pubDate><description><![CDATA[本文通过对比C++代码增量，探究了Objective-C中Block的实现原理。Block的本质是一个匿名函数，在底层被转换为包含函数指针的结构体。主要包含三个核心结构：__block_impl（通用Block头）、__main_block_desc_0（描述符）和__main_block_func_0（执行体）。Block的调用过程是通过结构体获取函数指针，再转换为合适类型后执行。文章详细解析了Block结构的内存布局和调用机制，揭示了Objective-C中闭包的底层实现原理。]]></description><category></category></item><item><title><![CDATA[【翻译】使用 Live Photo - 关于 Apple Live Photo 格式的深入讨论]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/149178464</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/149178464</guid><author>chaoyuan899</author><pubDate>Tue, 08 Jul 2025 13:53:05 +0800</pubDate><description><![CDATA[本文介绍了Live Photo的组成结构和编程处理方法。Live Photo由主图像（HEIC/JPEG）和动态视频（MOV）组成，通过assetIdentifier绑定。文章详细讲解了如何： 通过Photos框架获取Live Photo资源 使用PHAssetResource提取Live Photo的配对照片和视频 创建Live Photo的关键步骤： 为封面照片添加标识符元数据 为视频添加包含标识符的AVMetadataItem 使用AVFoundation框架处理视频元数据 文中提供了Swift代码示]]></description><category></category></item><item><title><![CDATA[关于 Apple Live Photo 的探究以及实现]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/149113365</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/149113365</guid><author>chaoyuan899</author><pubDate>Mon, 07 Jul 2025 17:47:44 +0800</pubDate><description><![CDATA[摘要（149字） Live Photo是一种基于HEIC格式的动态图像技术，结合了静态照片和短视频。HEIC相比JPEG具有显著优势：文件体积减少40%-60%，支持透明通道、多帧图像和HDR等特性，特别适合iPhone的Live Photo功能。HEIC采用HEVC编码，与苹果硬件深度优化，为iCloud存储节省空间。视频转Live Photo需将视频帧与音频封装为HEIC格式。常见图片格式中，HEIC、WebP和AVIF是新一代高效格式，而JPEG/PNG仍广泛兼容使用。]]></description><category></category></item><item><title><![CDATA[iOS Mach 异常、Unix 信号 和NSException 异常]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/107183847</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/107183847</guid><author>chaoyuan899</author><pubDate>Tue, 07 Jul 2020 16:20:14 +0800</pubDate><description><![CDATA[前言

Crash的主要原因是你的应用收到了未处理的信号。

未处理信号可能来源于三个地方：kernel、其他进程、以及App本身。

因此，crash异常也分为三种：

Mach异常：是指最底层的内核级异常。用户态的开发者可以直接通过Mach API设置thread，task，host的异常端口，来捕获Mach异常。
	Unix信号：又称BSD 信号，如果开发者没有捕获Mach异常，则会被host层的方法ux_exception()将异常转换为对应的UNIX信号，并通过方法threadsignal()将信]]></description><category></category></item><item><title><![CDATA[汇编定位 objc_msgSend + 16 出错的问题]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/106827246</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/106827246</guid><author>chaoyuan899</author><pubDate>Thu, 18 Jun 2020 15:07:03 +0800</pubDate><description><![CDATA[前言：

本文涉及到汇编的部分基础，对汇编不懂的同学可以先看看iOS汇编入门-arm64基础这篇文章。

先看下出错堆栈


#0 Thread

SIGSEGV

SEGV_ACCERR

0 libobjc.A.dylib	0x000000018de86f30 objc_msgSend + 16
1 HLLCourseLive	    0x0000000100318ee0 0x0000000100060000 + 2854624
2 AVFAudio	        0x00000001a843d2a8]]></description><category></category></item><item><title><![CDATA[iOS Crash栈的捕获和分析]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/106696151</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/106696151</guid><author>chaoyuan899</author><pubDate>Thu, 11 Jun 2020 20:21:44 +0800</pubDate><description><![CDATA[在iOS应用开发和线上运行的过程中，我们总会被反馈到各种各样的崩溃。很多崩溃通过case的描述，就能很快的重现并得到修复，但是更多的崩溃也许这一辈子就发生这么一次，也许我们永远不知道它什么时候再会出现。

同时，就算我们捕获到一个Crash栈，由于版本环境等种种原因，或者发生崩溃的代码我们就无法得到它详细的源码，我们往往会对着一片全是程序指令偏移量的Crash栈一脸蒙蔽。
基于以上事实，我们需要从Crash栈的捕获和分析这两个角度进行深入的了解。

本博客主要内容分为两部分：

OC中的Crash异常的总结]]></description><category></category></item><item><title><![CDATA[iOS 汇编入门 - arm64基础]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/104535224</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/104535224</guid><author>chaoyuan899</author><pubDate>Thu, 27 Feb 2020 13:54:20 +0800</pubDate><description><![CDATA[前言



iOS 中常见的架构有 armv7、armv7s、arm64、i386、x86_64 这些。



其中， armv7 、armv7s 、arm 64 都是 ARM 处理器的指令集，i386 、x86_64 是 Mac 处理器的指令集



这些指令集对应的机型有以下这些：



arm64e: iphone XS | iphone XS Max | iPhoneXR
arm...]]></description><category></category></item><item><title><![CDATA[使用 Charles 解决部分App无法上网的问题（SSL Pinning）]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/102679246</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/102679246</guid><author>chaoyuan899</author><pubDate>Tue, 22 Oct 2019 11:24:04 +0800</pubDate><description><![CDATA[设置好 Charles 代理之后发现打开目标 App debug 的时候弹窗“网络异常”提醒，测试 Safari 正常和其他 App 发现大部分都可以打开。
Google之后发现这是因为该 App 使用了SSL Pinning 的原因。SSL Pinning 意味着 App 拷贝了一份服务器的公钥在本地，在进行网络连接的时候使用了本地的公钥进行加密了。由于 Charles 的密钥无法匹配导致拒接...]]></description><category></category></item><item><title><![CDATA[一次编译同时启动多个模拟器]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/79818471</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/79818471</guid><author>chaoyuan899</author><pubDate>Wed, 04 Apr 2018 15:48:58 +0800</pubDate><description><![CDATA[
  
    原文 https://buildingvts.com/launch-multiple-ios-simulators-on-a-single-compile-985fd2ad5eb1
  


当你写完自动布局需要测试在不同模拟器上的运行效果时你是否很头疼，需要一个一个模拟器去启动运行。

这时候如果可以一编译就同时启动多个模拟器那该是多么好啊。XCode 9 有一个新的特性——允许...]]></description><category></category></item><item><title><![CDATA[iOS高级调试&逆向技术-汇编寄存器调用]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/75089447</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/75089447</guid><author>chaoyuan899</author><pubDate>Thu, 13 Jul 2017 18:20:50 +0800</pubDate><description><![CDATA[前言本文翻译自Assembly Register Calling Convention Tutorial 序言通过本教程，你会可以看到CPU使用的寄存器，并探索和修改传递给函数调用的参数。还将学习常见的苹果计算机架构以及如何在函数中使用寄存器。这就是所谓架构的调用约定。 了解汇编是如何工作的，以及特定架构调用约定是如何工作是一项极其重要的技能。它可以让你在没有源码的情况下，观察和修改传递给函数的参数]]></description><category></category></item><item><title><![CDATA[分离静态库架构]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/72461123</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/72461123</guid><author>chaoyuan899</author><pubDate>Thu, 18 May 2017 11:17:45 +0800</pubDate><description><![CDATA[先来看一段 MakeFile 脚本：OUT = libkugouplayer_VIPER3DRender.aOBJS =       \
        ../../Limiter.cpp \
        ../../ViPER3DEffect.cpp \
        ../../../AudioEffect.cpp
INCLUDE = -I../../../ \
          -I.]]></description><category></category></item><item><title><![CDATA[ARC 下 C++/OC 混编计数器的问题]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/72346775</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/72346775</guid><author>chaoyuan899</author><pubDate>Tue, 16 May 2017 20:54:37 +0800</pubDate><description><![CDATA[ARC 模式下，object-C 编写的代码的内存管理都交给了自动引用计数器了，不用我们自己再去操心内存的管理，但使用 Core Foundation 框架或者是和 C++ 混编时，代码的内存还是需要我们自己去管理的，这时候就需要注意了！Core Foundation 主要是由不透明类型(opaque type)，即 C 结构体组成，语言层面并不支持继承和多态，而 Core Foundation能够]]></description><category></category></item><item><title><![CDATA[拷贝头文件shell]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/71126661</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/71126661</guid><author>chaoyuan899</author><pubDate>Wed, 03 May 2017 17:03:05 +0800</pubDate><description><![CDATA[简单的拷贝头文件的话其实一个命令就可以搞定了find ./ -type f -not -name "*.h" -delete然后 copy 到你想要的地方，但这样做得不够完全，会出现一些空的目录，而且每次都要手动去敲命令，还是觉得挺麻烦的。所以还是写一个脚本执行好点，如上图，想要的 copy 的是 include 里面的头文件。脚本如下：#!/bin/bash
header_path=$SRCROO]]></description><category></category></item><item><title><![CDATA[AVAudioSessionInterruptionNotification not called]]></title><link>https://blog.youkuaiyun.com/chaoyuan899/article/details/52087274</link><guid>https://blog.youkuaiyun.com/chaoyuan899/article/details/52087274</guid><author>chaoyuan899</author><pubDate>Mon, 01 Aug 2016 17:39:51 +0800</pubDate><description><![CDATA[问题描述：
监听了系统的打断事件，在来电的时候有收到系统打断的 AVAudioSessionInterruptionTypeBegan 通知，却没有收到 AVAudioSessionInterruptionTypeEnd 通知。
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:n]]></description><category></category></item></channel></rss>