最近做个 IM 相关的项目,为了搞个开源的 IOS 版本,因此开启了 XCode 开发使用
遇见了如下几点问题
环境说明
Mac macOS High Sierra. 版本 10.13.6
XCode Version 9.4.1 (9F2000)
1. Pod
在 Java 的世界呆时间长了,习惯了 mvn, ant 等内容, Pod 可以认为是 ios 下的 mvn 用来管理依赖包,类似 mvn 或其他的工具类似,它有自己独立的命令,如下所示 引用于 pod命令汇总:
如需要进一步了解其使用,可以参见 pod <cmd> --help 进行查看, 比如:
pod install --help
2. llvm 控制台
进入 llvm 控制台的方式有两种:
- 调试模式下进入到断点或Pause执行程序
- 发生异常错误
当进入到 llvm 控制台之后,可以进行如下操作:
# 常见的 po 命令,用于打印对象内容
# 比如 打印当前模拟器运行时生成的工程文件位置
(llvm) po NSHomeDirectory()
"/Users/mac/Library/Developer/CoreSimulator/Devices/4467A339-CA05-4FBB-83A5-5C396770EFB1/data/Containers/Data/Application/2A4E420E-1575-461F-BBE3-85E2880C3749"
# 打印当前线程堆栈信息
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
* frame #0: 0x0000000116ec920a libsystem_kernel.dylib`mach_msg_trap + 10
frame #1: 0x0000000116ec8724 libsystem_kernel.dylib`mach_msg + 60
frame #2: 0x00000001103257d5 CoreFoundation`__CFRunLoopServiceMachPort + 229
frame #3: 0x0000000110324c19 CoreFoundation`__CFRunLoopRun + 1689
frame #4: 0x000000011032430b CoreFoundation`CFRunLoopRunSpecific + 635
frame #5: 0x0000000119a66a73 GraphicsServices`GSEventRunModal + 62
frame #6: 0x00000001124b0057 UIKit`UIApplicationMain + 159
frame #7: 0x000000010efc13c7 UCreaterChat`main at AppDelegate.swift:12
frame #8: 0x0000000116a5b955 libdyld.dylib`start + 1
同时也能执行 gdb 信息,比如:
命令 | 备注 |
---|---|
break NUM | 在指定的行上设置断点。 |
bt | 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。 |
clear | 删除设置在特定源文件、特定行上的断点。其用法为:clear FILENAME:NUM。 |
continue | 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而导致停止运行时。 |
display EXPR | 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。 |
file FILE | 装载指定的可执行文件进行调试。 |
help NAME | 显示指定命令的帮助信息。 |
info break | 显示当前断点清单,包括到达断点处的次数等。 |
info files | 显示被调试文件的详细信息。 |
info func | 显示所有的函数名称。 |
info local | 显示当函数中的局部变量信息。 |
info prog | 显示被调试程序的执行状态。 |
info var | 显示所有的全局和静态变量名称。 |
kill | 终止正被调试的程序。 |
list | 显示源代码段。 |
make | 在不退出 gdb 的情况下运行 make 工具。 |
next | 在不单步执行进入其他函数的情况下,向前执行一行源代码。 |
print EXPR | 显示表达式 EXPR 的值。 |
print-object | 打印一个对象 (即 po ) |
print (int) name | 打印一个类型 |
print-object [artist description] | 调用一个函数 (即 po ) |
set artist = @"test" | 设置变量值 |
whatis | 查看变理的数据类型 |
3. 断点问题
[问题 1] 将某些变量放到 Watch 中之后,每次进入到那个Watch 执行的地方时候,基本都会发生崩溃( 原因是构建那个对象时候,里面不支持,这时候直接 exit 0 ... )
[解决方法] 删除 .xcworkspace/ 目录下的 Expressions.xcexplist 文件即可。
mac$ find . -name "Expressions.xcexplist" -exec rm -f {} \;
4. 查看当前调试界面对应的 ViewController 等信息
在 XCode 中存在类似 Android 开发的 View Hierarchy 通过它可以打开相应的界面查看属性元素信息,如下图:
注意点击如下图标(Debug View Hierarchy) 按钮,即可出现如上界面
其附近也存在类似的如 调试内存使用的 按钮 。
5. 调试相关参数设定
类似 Eclipse 或 Android Studio 中运行时参数设定一样,对 IOS 中设定一些初始化设置,进入方式如下: [Product] -> [Edit Scheme] 即可进入如下界面:
比如 Enable Zombi Objects 或添加参数等,均在此进行操作。
6. Profile 相关使用
将程序运行起来之后,进入方式:[Product] -> [Profile] 进入如下Instrument 模板界面:
选择 [Time Profiler] 类似 Android 中可以调试函数执行的时间消耗等信息,充分调试那些函数是最耗时步骤。
7. 常见快捷键
快捷键 | 说明 |
---|---|
command + 1 | 工程导航器 |
command + 0 | 显示/隐藏导航器面板 |
command + [/] | 向前/后缩进(Shift Left/Right) |
command + option + [/] | 将当前光标所在行代码上移或者下移(Move Line Up/Down) |
option+command+←/→ | 折叠当前代码块,包括@interface …@end、@implementation …@end |
option+shift+command+←/→ | 折叠该文件内所有代码块(方法/函数:{ Methods&Functions }) |
control+shift+command+←/→ | 折叠当前注释块(/Comment Blocks/) |
shift+command+J | 在项目导航中定位当前编辑其中打开的文件(Reveal in Project Navigator)。 |
command+L | 跳转到指定行。 |
shift+command+O | Open Quickly,快速全局查找文件、符号,非常常用! |
command+点击Editor中选中的符号 | 跳转到符号定义(jump to definition)。 |
control+command+J | 跳转到指定符号的定义处或实现处(Go to Declaration/Definition)。有时工程正在Loading、Indexing或Processing files时,“command+点击”无法响应,此时可试试control+command+J |
shift+command+Y | 显示控制台(Show/Hide the debug area) |
shift+command+C | 激活聚焦控制台,光标定位到控制台呈可输入状态 |
command+K | 清除控制台(Debug->Debug Workflow->Clear Console) |
command + \ | 当前行设置/取消断点;通过鼠标点击边列中的蓝色断点来启用/禁用当前行断点。 |
command + Y | 全局激活或禁用所有的断点,激活进入调试模式(此时断点蓝色可见)。 |
command + R | 运行 |
command + control + i | 进入 Profile 界面 |