iOS自动化调试:自动编译启动
最近发现了一个莫名其他的BBUG,程序已启动就出现了一个崩溃,崩溃堆栈让人摸不着头脑:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0 libobjc.A.dylib _cache_getImp + 8
1 libobjc.A.dylib _object_getMethodImplementation + 212
2 CoreFoundation __NSIsNSString + 136
3 CoreFoundation -[NSTaggedPointerString isEqual:] + 176
4 CoreFoundation _CFEqual + 748
5 CoreFoundation __CFURLComponentsCopyString + 480
6 CoreFoundation __CFURLComponentsCopyURLRelativeToURL + 24
7 Foundation -[__NSConcreteURLComponents URL] + 44
8 Foundation -[NSURL(NSURL) initWithString:relativeToURL:encodingInvalidCharacters:] + 436
9 Foundation +[NSURL(NSURL) URLWithString:relativeToURL:] + 44
10 TheRouter -[TheRouter pathComponentsWithURLString:] (TheRouter.m:263)
11 TheRouter -[TheRouter registURLString:openHandler:] (TheRouter.m:53)
12 TheRouter -[TheRouter(Annotation) registController:storyBoard:path:] (TheRouter+Annotation.m:84)
13 TheRouter __55-[TheRouter(Annotation) registPathAnnotationsWithHost:]_block_invoke (TheRouter+Annotation.m:47)
尝试找答案以及咨询chatgpt,大概得到了一些结论:
可能的崩溃原因和解决方法:
- 内存访问问题:最常见的崩溃原因是访问已释放的内存或无效的对象。请检查在 block 中使用的对象是否已经正确释放或者是否存在野指针问题。
- 线程安全问题:如果多个线程同时访问和修改共享数据,可能会导致竞争条件(race condition)和数据不一致性。确保在多线程环境下使用适当的同步机制来保护共享数据。
- 异常处理:检查 block 中是否有可能引发异常的代码,确保异常能够被适当地处理和捕获,以避免导致程序崩溃。
- 调试和日志:在相关的代码中添加详细的日志输出,以便跟踪程序执行路径,查找导致崩溃的具体原因。
尝试修改:去掉异步代码之后,为了验证是否解决,我需要尝试多次启动来判断本次修改是否有影响,跟GPT来回切磋和修改了几个版本后,记录下如下脚本可以实现部分需求:
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
33
34
35
36
37
38
39
40
#!/bin/bash
# 设置变量,替换为你的应用程序名称、Xcode 项目路径和设备 UDID xcworkspace xcodeproj
APP_NAME="APP_NAME"
PROJECT_PATH="xx/demo.xcworkspace"
DEVICE_UDID="00008030-000E050C21D2802E"
bundle_id="com.yourcompany.app"
AppPath="/XXX/demo-enujmiuwqdhgvfcldwlvhjxzzewr/Build/Products/Debug-iphoneos/demo.app"
sleepToDebug=20
# 循环执行调试和安装过程
while true
do
echo "Building and installing $APP_NAME..."
# TODO: 如果不需要编译,可以注释下一行代码 使用 xcodebuild 构建应用程序
# xcodebuild -workspace "$PROJECT_PATH" -scheme "$APP_NAME" -configuration Debug \
-destination "id=$DEVICE_UDID"
#clean build
# 检查构建结果,如果构建成功则安装应用程序到设备上
# if [ $? -eq 0 ]; then
# 使用 ios-deploy 将应用程序安装到设备上
ios-deploy --id "$DEVICE_UDID" --bundle $AppPath --justlaunch
# 检查安装结果,如果安装成功则继续下一轮循环
if [ $? -eq 0 ]; then
echo "App installed successfully!"
else
echo "Failed to install app."
fi
# else
# echo "Build failed."
# fi
# 等待一段时间后继续下一轮循环,例如等待 sleepToDebug 秒
# sleep $sleepToDebug
done