iOS自动化调试:自动编译启动

This is a subtitle

Posted by PaysonChen on April 22, 2024

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