面试题答案
一键面试调试思路
- 设置断点:在可能出现线程安全问题的关键代码区域设置断点,例如共享资源的读写操作处。
- 启用线程调度:通过设置让LLDB可以跟踪线程的执行情况。
- 运行程序:启动程序,让其在断点处暂停。
- 检查线程状态:查看当前停住的线程信息,判断是否是出现问题的线程。
- 分析调用栈:从调用栈获取代码执行路径,找到具体引发问题的代码位置。
- 查找竞争条件:观察共享资源的访问情况,检查是否存在多个线程同时读写的情况。
- 检查数据同步:查看是否正确使用了锁、信号量等同步机制。
LLDB命令
- 设置断点:
breakpoint set -n "函数名"
:在指定函数处设置断点。breakpoint set -l 行号 -f 文件名
:在指定文件的指定行设置断点。
- 启用线程调度:
thread plan all
:跟踪所有线程。
- 运行程序:
run
:启动程序运行。
- 检查线程状态:
thread list
:列出所有线程及其状态。
- 分析调用栈:
bt
:打印当前线程的调用栈。
- 查找竞争条件:
- 通过
po
(打印对象)命令查看共享资源的值,结合调用栈分析不同线程对其访问情况。
- 通过
- 检查数据同步:
- 查看代码中锁、信号量等同步机制的使用,结合调用栈判断是否正确获取和释放锁。如使用
po
查看锁对象的状态等。
- 查看代码中锁、信号量等同步机制的使用,结合调用栈判断是否正确获取和释放锁。如使用