纳兰若水


  • 首页

  • 归档

  • 分类

  • 标签

如何自建 Crash 平台

发表于 2019-02-20 | 分类于 iOS
字数统计: 4.7k | 阅读时长 ≈ 22

【译】Symbolicating an iOS Crash Report

通常,当您收到来自iTunes连接的崩溃报告或提供移动崩溃收集和报告的第三方服务(如Apteligent)时,该服务将负责为您提供符号化后的崩溃。如果你没有上传符号,你可能会发现自己有一个非符号化的崩溃,没有别的东西可以继续。这样的崩溃文件对于调试可能影响大量用户的问题并不是非常有用。

在这种情况下,您必须通过将回溯堆栈地址解析为符号来对崩溃报告进行符号化,以获取有关崩溃的有用信息。

幸运的是,完全有可能手动符号化崩溃报告。本文将概述您需要的信息,向您展示如何解释崩溃报告,并查看OSX和XCode上可用的一些工具来符号化崩溃。

崩溃报告中只有两个部分与符号化异常跟踪相关。第一个是 Exception Backtrace 部分。这显示了崩溃时应用程序的调用堆栈。此特定崩溃日志片段显示了我们的 ApteligentExampleApp 应用程序内部崩溃的回溯。

1
2
3
4
5
Last Exception Backtrace:
0 CoreFoundation 0x000000018708b100 0x186f80000 + 1093888
1 libobjc.A.dylib 0x00000001939441fc 0x19393c000 + 33276
2 CoreFoundation 0x000000018708b040 0x186f80000 + 1093696
3 ApteligentExampleApp 0x000000010003acc4 0x10002c000 + 60612
阅读全文 »

block 探索

发表于 2019-02-10
字数统计: 2.1k | 阅读时长 ≈ 9

block 转 c++ 源码

如下代码 .h .m文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//TestClang.h
@interface TestClang : NSObject
+ (void)testBlcok;
@end

//TestClang.m
#import "TestClang.h"
static int numGlobel = 29;
@implementation TestClang
+ (void)testBlcok {
//没有截获局部变量 __NSGlobalBlock__
void(^block1)(void) = ^{
NSLog(@"just a block");
    };
NSLog(@" block1 = %@", block1);
block1();
static int numStatic = 12;
int num = 10;
__block int numBlock = 19;
__block int numBlock2 = 30;
__block int numBlockTest = 30;
    void(^block2)(void) = ^{
NSLog(@"just a block === %d, numStatic = %d numGlobel = %d numBlock=%d numBlock2=%d numBlockTest = %d", num,numStatic,numGlobel,numBlock,numBlock2,numBlockTest);
    };
num = 33;
numStatic = 121;
numGlobel = 129;
numBlock = 22222;
block2();
NSLog(@"block2 = %@", block2);
}
@end

执行:xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc TestClang.m
不要引用其他头文件,以免导出报Error
目录下生成了一个TestClang.cpp文件

  • testBlock 对应的方法变为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//_C_ 表示为类方法 _I_ 为实例方法
static void _C_TestClang_testBlcok(Class self, SEL _cmd) {

void(*block1)(void) = ((void (*)())&__TestClang__testBlcok_block_impl_0((void *)__TestClang__testBlcok_block_func_0, &__TestClang__testBlcok_block_desc_0_DATA));
NSLog((NSString *)&__NSConstantStringImpl__var_folders_nc_qvb_bh854tz1y0p1hdk5y6km0000gn_T_TestClang_cf514e_mi_1, block1);
((void (*)(__block_impl *))((__block_impl *)block1)->FuncPtr)((__block_impl *)block1);
static int numStatic = 12;
int num = 10;
__attribute__((__blocks__(byref))) __Block_byref_numBlock_0 numBlock = {(void*)0,(__Block_byref_numBlock_0 *)&numBlock, 0, sizeof(__Block_byref_numBlock_0), 19};
__attribute__((__blocks__(byref))) __Block_byref_numBlock2_1 numBlock2 = {(void*)0,(__Block_byref_numBlock2_1 *)&numBlock2, 0, sizeof(__Block_byref_numBlock2_1), 30};
__attribute__((__blocks__(byref))) __Block_byref_numBlockTest_2 numBlockTest = {(void*)0,(__Block_byref_numBlockTest_2 *)&numBlockTest, 0, sizeof(__Block_byref_numBlockTest_2), 30};

    void(*block2)(void) = ((void (*)())&__TestClang__testBlcok_block_impl_1((void *)__TestClang__testBlcok_block_func_1, &__TestClang__testBlcok_block_desc_1_DATA, num, &numStatic, (__Block_byref_numBlock_0 *)&numBlock, (__Block_byref_numBlock2_1 *)&numBlock2, (__Block_byref_numBlockTest_2 *)&numBlockTest, 570425344));
num = 33;
numStatic = 121;
numGlobel = 129;
(numBlock.__forwarding->numBlock) = 22222;
((void (*)(__block_impl *))((__block_impl *)block2)->FuncPtr)((__block_impl *)block2);
NSLog((NSString *)&__NSConstantStringImpl__var_folders_nc_qvb_bh854tz1y0p1hdk5y6km0000gn_T_TestClang_cf514e_mi_3, block2);
}
阅读全文 »

武功山游记

发表于 2018-12-31 | 分类于 游记
字数统计: 988 | 阅读时长 ≈ 3

续:2018年12月31日,雪后,不一样的武功山~

一直想去看冬季的武功山,期待满山白雪皑皑,雪景连接云海。何等壮观。我提出冬季上武功山露营,一家人心痒痒,但是担心大雪封山,临回家才确定上山。但是考虑到露营太冷,改为山脚景区泡温泉,次日上山。抵达景区温泉还下着雪,就着雪泡温泉的感觉真是冰火两重天。泡够时间就 “落荒而逃” ~

次日9点到达武功山脚下,买好门票缆车票。得知山中 -6℃ ,又买好口罩手套等。脚踩防滑链,踏着积雪,向着被白雪覆盖的武功山前进。

阅读全文 »

on-demand 资源下发

发表于 2018-12-06 | 分类于 功能设计
字数统计: 576 | 阅读时长 ≈ 2

Apple On-Demand Resource

Xcode 可以给资源打 tag,被打 tag 的资源在打包时不会打到包内。需要时下载,测试时可以使用自己的服务器,但是发布到 AppStore 时需要托管到苹果的服务器。
苹果的 On-Demand Resource 文档

自建资源下发模块

了解到了苹果 On-Demand Resource 机制,我们可以结合Resource Tags 下的资源不会打包到 ipa 包的特性。设计一套自己的下发机制。

阅读全文 »

xcodeproj

发表于 2018-11-30 | 分类于 工具
字数统计: 419 | 阅读时长 ≈ 1

xcodeproj

xcodeproj 实际上是一个文件夹,打开后可以看到 project.pbxproj, xcuserdata, project.xcworkspace.

  • project.pbxproj: “在 project 里的 project”,是 xcodeproj 最主要的文件
  • project.xcworkspace: 一个子文件夹,存储了用户 workspace 的相关信息
  • xcuserdata: 另外一个文件夹,里面也是用户相关的一些信息
阅读全文 »

冲绳四日三晚游记

发表于 2018-09-11 | 分类于 游记
字数统计: 2.8k | 阅读时长 ≈ 9

行程时间: 9月7日 - 9月10日
提前一个月的时间定了吉祥航空的往返航班,2700左右/人。出发时下午5点,回程是下午7点。
行程酒店:美国村门巴公寓酒店,酒店外就是沙滩。
冲绳9月份是台风季,天气说不准,最好提前做下攻略。

Day 1

启程,第一天出发的时间是北京时间5点,到冲绳大概2个小时,不过因为冲绳是早一个小时的,所以到冲绳是当地时间晚上8点了。预订的接机去美国村的酒店,400RMB。
抵达冲绳从机场出来就感觉非常干净,各种建筑街道啥的都非常干净,各种基础设施做的也很贴心。约的日本的司机来接机的,人很有礼貌,会一点英语, 大概花了50分钟左右到美国村。入住之后就去觅食,找到了上一波推荐去的一家叫 xx食堂的店,吃了猪豚骨饭,另外在冲绳大众点评也挺好用(^__^)。
美国村夜景

阅读全文 »

Recording Animation

发表于 2018-08-22 | 分类于 技术
字数统计: 85 | 阅读时长 ≈ 1

记录一次录音动画实现

需求:根据音量大小实现一个录音波形动画,因为拿到的音量大小在10-30之间,所以会已30为最大值。其实未录音和录音之后会有另外的lottie动画,再此记录的只是录音中的动画。

demo 地址

渐变圆环实现记录

发表于 2018-07-02 | 分类于 技术
字数统计: 610 | 阅读时长 ≈ 3

先了解下坐标系
iOS layer坐标系
position属性是决定子layer在父layer上的位置,默认为(0,0)。其次,anchorPoint属性是决定子layer上的哪个点会在position所指定的位置。

阅读全文 »

度户外九龙大峡谷徒步

发表于 2018-05-19 | 分类于 游记
字数统计: 27 | 阅读时长 ≈ 1

有其他小伙伴写了游记,这里做个记录~ (^__^) 嘻嘻……
度户外·半满白草畔

故宫-长城两日游攻略

发表于 2018-05-14 | 分类于 游记
字数统计: 1.6k | 阅读时长 ≈ 5

时间: 5月12日、5月13日 (非高峰期)
购票方式:
故宫:网上购门票 + 珍宝馆 + 珠宝馆 78元/人,直接刷身份证进入。
八达岭长城:网上购大门票 + 往返直通车 87元/人

故宫

特别注意需要提前准备的:
1:下载一个故宫的讲解App(故宫博物馆三毛游)不知道还有没有其他好用的,没有特别去筛选。完了就预先下载好所有的讲解音频文件,这个app解锁所有的讲解需要15元,在到达不同地点会自动播放相应的讲解,还能看见当前的位置,真的是东西南北都分不清的路痴的福音。回来的时候还听到一个妹纸说找不到钟表馆啊,票白买啦!!(^__^) 嘻嘻……,所以下个辅助App还是很方便的。不然得去租故宫的电子讲解器(20元),人比较多,而且走的时候还要还。
2:携带中午的午餐,补充体力
3:充电宝

阅读全文 »
1234
纳兰若水

纳兰若水

随便写写读书笔记、技术学习、随想、生活、游记

37 日志
12 分类
8 标签
RSS
GitHub Twitter
© 2017 — 2022 纳兰若水
沪ICP备2021021008号-1
| Site words total count: 0 字 Site words total count: 56.8k