name: mobile-debugging description: 调试React Native应用,包括Metro打包器问题、原生错误、性能问题和崩溃分析。在故障排除或调查问题时使用。 allowed-tools: Bash, Read, Grep
移动端调试
React Native和Expo应用程序的调试指南。
何时使用
- 应用崩溃或卡死
- Metro打包器错误
- 原生模块问题
- 性能问题
- 构建失败
- 网络请求调试
常见问题与修复
Metro打包器问题
# 清除所有缓存
npx expo start --clear
watchman watch-del-all
rm -rf node_modules && npm install
# 重置打包器缓存
rm -rf /tmp/metro-*
rm -rf /tmp/haste-*
原生模块错误
# iOS: 重置Pods
cd ios && pod deintegrate && pod install && cd ..
# Android: 清理构建
cd android && ./gradlew clean && cd ..
# Expo: 预构建清理
npx expo prebuild --clean
模拟器/仿真器问题
# iOS: 重置模拟器
xcrun simctl erase all
# Android: 擦除仿真器数据
adb devices # 查找设备ID
adb -s DEVICE_ID emu kill
调试工具
React开发者工具
# 安装
npm install -g react-devtools
# 启动
react-devtools
# 在应用中:摇动设备 -> "远程JS调试"
Metro日志
# 查看详细日志
npx expo start --verbose
# iOS设备日志
npx react-native log-ios
# Android设备日志
npx react-native log-android
adb logcat
网络调试
// 启用网络检查器
import { Platform } from 'react-native';
if (__DEV__ && Platform.OS === 'ios') {
require('react-native').NativeModules.DevSettings.setIsDebuggingRemotely(true);
}
// 或使用Flipper进行高级网络检查
性能调试
识别慢渲染
// 添加性能日志
import { useEffect, useRef } from 'react';
function useRenderTime(componentName: string) {
const start = useRef(performance.now());
useEffect(() => {
const duration = performance.now() - start.current;
if (duration > 16) {
console.warn(`慢渲染: ${componentName} 耗时 ${duration.toFixed(2)}ms`);
}
});
}
// 在组件中使用
function MyComponent() {
useRenderTime('MyComponent');
return <View>...</View>;
}
内存泄漏
// 检查缺少的清理
useEffect(() => {
const subscription = someObservable.subscribe();
const timer = setInterval(() => {}, 1000);
// 必须清理!
return () => {
subscription.unsubscribe();
clearInterval(timer);
};
}, []);
错误调查
JavaScript错误
# 在堆栈跟踪中查找错误
# 检查最近的文件更改
# 验证导入和依赖项
# 检查变量名中的拼写错误
原生错误
# iOS: 检查Xcode控制台
# Android: 检查Android Studio Logcat
# 查找Java/Swift异常
# 检查原生模块兼容性
构建错误
# 检查包版本
npx expo-doctor
# 验证node/npm版本
node --version
npm --version
# 检查冲突的依赖项
npm ls PACKAGE_NAME
调试命令
# 检查端口占用
lsof -ti:8081 # Metro打包器端口
lsof -ti:19000 # Expo开发者工具
# 终止端口进程
kill -9 $(lsof -ti:8081)
# 检查设备连接
# iOS
xcrun simctl list devices
# Android
adb devices
# 重启adb
adb kill-server
adb start-server
调试检查清单
调查问题时:
- 复现:能否一致地触发问题?
- 最近更改:问题出现前更改了什么?
- 错误信息:阅读完整错误,包括堆栈跟踪
- 依赖项:检查包是否兼容
- 平台:发生在iOS、Android还是两者?
- 环境:仅开发环境还是生产构建也出现?
- 日志:检查Metro、Xcode和Logcat获取详细信息
常见错误模式
- “无法解析模块”:检查导入路径和文件是否存在
- “不变性违规”:React错误,检查组件生命周期
- “网络请求失败”:检查API URL和网络连接
- “未定义不是对象”:访问属性前检查null/undefined
- “超过最大调用堆栈大小”:无限循环或递归