删除调式文件,以免混淆
This commit is contained in:
parent
99b3ea6158
commit
d7c7082397
243
DEBUG_GUIDE.md
243
DEBUG_GUIDE.md
@ -1,243 +0,0 @@
|
||||
# 调试指南
|
||||
|
||||
本文档介绍如何在开发过程中进行调试,包括断点调试、日志调试等方法。
|
||||
|
||||
## 调试方式概览
|
||||
|
||||
### 1. 批处理文件调试 (推荐新手)
|
||||
```bash
|
||||
# 启动调试模式
|
||||
./start_debug.bat
|
||||
```
|
||||
|
||||
### 2. Python脚本调试 (推荐)
|
||||
```bash
|
||||
# 直接运行调试服务器
|
||||
python debug_server.py
|
||||
```
|
||||
|
||||
### 3. VS Code调试 (推荐开发者)
|
||||
- 打开VS Code
|
||||
- 按F5或点击调试按钮
|
||||
- 选择"Debug Backend Server"配置
|
||||
|
||||
### 4. 命令行调试
|
||||
```bash
|
||||
# 激活虚拟环境
|
||||
backend\venv\Scripts\activate
|
||||
|
||||
# 设置环境变量
|
||||
set FLASK_ENV=development
|
||||
set FLASK_DEBUG=1
|
||||
set PYTHONPATH=%cd%
|
||||
|
||||
# 启动调试服务器
|
||||
python -u backend\app.py
|
||||
```
|
||||
|
||||
## 详细调试方法
|
||||
|
||||
### VS Code 断点调试
|
||||
|
||||
1. **安装Python扩展**
|
||||
- 确保VS Code已安装Python扩展
|
||||
|
||||
2. **打开项目**
|
||||
```bash
|
||||
code .
|
||||
```
|
||||
|
||||
3. **设置断点**
|
||||
- 在代码行号左侧点击设置断点
|
||||
- 红色圆点表示断点已设置
|
||||
|
||||
4. **启动调试**
|
||||
- 按F5或点击调试面板的播放按钮
|
||||
- 选择"Debug Backend Server"配置
|
||||
|
||||
5. **调试操作**
|
||||
- F10: 单步跳过
|
||||
- F11: 单步进入
|
||||
- Shift+F11: 单步跳出
|
||||
- F5: 继续执行
|
||||
- Shift+F5: 停止调试
|
||||
|
||||
### PyCharm 调试
|
||||
|
||||
1. **打开项目**
|
||||
- File -> Open -> 选择项目目录
|
||||
|
||||
2. **配置Python解释器**
|
||||
- File -> Settings -> Project -> Python Interpreter
|
||||
- 选择backend/venv/Scripts/python.exe
|
||||
|
||||
3. **创建运行配置**
|
||||
- Run -> Edit Configurations
|
||||
- 添加新的Python配置
|
||||
- Script path: debug_server.py
|
||||
- Working directory: 项目根目录
|
||||
|
||||
4. **设置断点并调试**
|
||||
- 点击行号左侧设置断点
|
||||
- 点击调试按钮启动
|
||||
|
||||
### 命令行调试
|
||||
|
||||
1. **使用pdb调试器**
|
||||
```python
|
||||
import pdb
|
||||
pdb.set_trace() # 在需要调试的地方插入
|
||||
```
|
||||
|
||||
2. **使用ipdb (增强版pdb)**
|
||||
```bash
|
||||
pip install ipdb
|
||||
```
|
||||
```python
|
||||
import ipdb
|
||||
ipdb.set_trace()
|
||||
```
|
||||
|
||||
## 调试配置说明
|
||||
|
||||
### 环境变量
|
||||
- `FLASK_ENV=development`: 启用开发模式
|
||||
- `FLASK_DEBUG=1`: 启用调试模式
|
||||
- `PYTHONPATH`: 设置Python模块搜索路径
|
||||
|
||||
### 调试端口
|
||||
- 后端服务: http://127.0.0.1:5000
|
||||
- 健康检查: http://127.0.0.1:5000/health
|
||||
- WebSocket: ws://127.0.0.1:5000/socket.io/
|
||||
|
||||
## 常见调试场景
|
||||
|
||||
### 1. WebSocket连接问题
|
||||
```python
|
||||
# 在handle_connect函数中设置断点
|
||||
@socketio.on('connect')
|
||||
def handle_connect():
|
||||
print(f'客户端连接: {request.sid}') # 添加调试输出
|
||||
# 设置断点在这里
|
||||
emit('connect_status', {'status': 'connected'})
|
||||
```
|
||||
|
||||
### 2. RTSP流问题
|
||||
```python
|
||||
# 在generate_video_frames函数中设置断点
|
||||
def generate_video_frames():
|
||||
print(f'RTSP URL: {rtsp_url}') # 调试输出
|
||||
# 设置断点检查rtsp_url值
|
||||
cap = cv2.VideoCapture(rtsp_url)
|
||||
```
|
||||
|
||||
### 3. API请求问题
|
||||
```python
|
||||
# 在API路由中设置断点
|
||||
@app.route('/api/patients', methods=['GET'])
|
||||
def get_patients():
|
||||
print(f'请求参数: {request.args}') # 调试输出
|
||||
# 设置断点检查请求参数
|
||||
```
|
||||
|
||||
### 4. 数据库操作问题
|
||||
```python
|
||||
# 在数据库操作中设置断点
|
||||
def get_patients(self, page, size, keyword):
|
||||
print(f'查询参数: page={page}, size={size}, keyword={keyword}')
|
||||
# 设置断点检查SQL查询
|
||||
```
|
||||
|
||||
## 日志调试
|
||||
|
||||
### 查看日志文件
|
||||
```bash
|
||||
# 实时查看日志
|
||||
tail -f logs/debug.log
|
||||
tail -f logs/backend.log
|
||||
```
|
||||
|
||||
### 调整日志级别
|
||||
```python
|
||||
# 在代码中临时调整日志级别
|
||||
import logging
|
||||
logging.getLogger().setLevel(logging.DEBUG)
|
||||
```
|
||||
|
||||
## 前端调试
|
||||
|
||||
### 浏览器开发者工具
|
||||
1. 按F12打开开发者工具
|
||||
2. Console标签页查看JavaScript错误
|
||||
3. Network标签页查看网络请求
|
||||
4. WebSocket连接在Network -> WS中查看
|
||||
|
||||
### 前端调试技巧
|
||||
```javascript
|
||||
// 在浏览器控制台中测试WebSocket连接
|
||||
const socket = io('http://127.0.0.1:5000');
|
||||
socket.on('connect', () => console.log('连接成功'));
|
||||
socket.emit('start_video', {});
|
||||
```
|
||||
|
||||
## 性能调试
|
||||
|
||||
### 使用cProfile
|
||||
```bash
|
||||
python -m cProfile -o profile_output.prof debug_server.py
|
||||
```
|
||||
|
||||
### 内存使用监控
|
||||
```bash
|
||||
pip install memory-profiler
|
||||
python -m memory_profiler debug_server.py
|
||||
```
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **端口被占用**
|
||||
```bash
|
||||
netstat -ano | findstr :5000
|
||||
taskkill /PID <PID> /F
|
||||
```
|
||||
|
||||
2. **模块导入错误**
|
||||
- 检查PYTHONPATH设置
|
||||
- 确认虚拟环境已激活
|
||||
|
||||
3. **权限问题**
|
||||
- 以管理员身份运行
|
||||
- 检查文件夹权限
|
||||
|
||||
4. **依赖包问题**
|
||||
```bash
|
||||
pip install -r backend/requirements.txt --force-reinstall
|
||||
```
|
||||
|
||||
### 调试检查清单
|
||||
|
||||
- [ ] Python虚拟环境已激活
|
||||
- [ ] 所有依赖包已安装
|
||||
- [ ] 环境变量设置正确
|
||||
- [ ] 端口5000未被占用
|
||||
- [ ] config.ini文件存在且配置正确
|
||||
- [ ] 日志文件可以正常写入
|
||||
- [ ] 断点设置在正确位置
|
||||
|
||||
## 调试最佳实践
|
||||
|
||||
1. **逐步调试**: 从简单的断点开始,逐步深入
|
||||
2. **日志记录**: 在关键位置添加详细的日志输出
|
||||
3. **单元测试**: 编写测试用例验证功能
|
||||
4. **代码审查**: 定期检查代码逻辑
|
||||
5. **版本控制**: 使用Git跟踪代码变更
|
||||
|
||||
## 获取帮助
|
||||
|
||||
如果遇到调试问题,可以:
|
||||
1. 查看logs目录下的日志文件
|
||||
2. 检查控制台输出信息
|
||||
3. 使用浏览器开发者工具
|
||||
4. 参考项目文档和代码注释
|
164
debug_server.py
164
debug_server.py
@ -1,164 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
身体平衡评估系统 - 调试服务器启动脚本
|
||||
|
||||
这个脚本专门用于调试模式,提供更好的调试体验:
|
||||
1. 支持IDE断点调试
|
||||
2. 详细的错误信息输出
|
||||
3. 热重载功能
|
||||
4. 调试日志输出
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
import socket
|
||||
from pathlib import Path
|
||||
|
||||
# 添加项目路径
|
||||
project_root = Path(__file__).parent
|
||||
sys.path.insert(0, str(project_root))
|
||||
sys.path.insert(0, str(project_root / 'backend'))
|
||||
|
||||
def setup_debug_logging():
|
||||
"""设置调试日志"""
|
||||
# 创建logs目录
|
||||
logs_dir = project_root / 'logs'
|
||||
logs_dir.mkdir(exist_ok=True)
|
||||
|
||||
# 配置日志格式
|
||||
logging.basicConfig(
|
||||
level=logging.DEBUG,
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s',
|
||||
handlers=[
|
||||
logging.FileHandler(logs_dir / 'debug.log', encoding='utf-8'),
|
||||
logging.StreamHandler(sys.stdout)
|
||||
]
|
||||
)
|
||||
|
||||
# 设置Flask和SocketIO的日志级别
|
||||
logging.getLogger('werkzeug').setLevel(logging.DEBUG)
|
||||
logging.getLogger('socketio').setLevel(logging.DEBUG)
|
||||
logging.getLogger('engineio').setLevel(logging.DEBUG)
|
||||
|
||||
# 禁用第三方库的详细日志
|
||||
logging.getLogger('PIL').setLevel(logging.WARNING)
|
||||
logging.getLogger('PIL.PngImagePlugin').setLevel(logging.WARNING)
|
||||
logging.getLogger('matplotlib').setLevel(logging.WARNING)
|
||||
logging.getLogger('matplotlib.font_manager').setLevel(logging.WARNING)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.info('调试日志已启用')
|
||||
return logger
|
||||
|
||||
def get_local_ip():
|
||||
"""获取本机IP地址"""
|
||||
try:
|
||||
# 创建一个UDP socket连接到外部地址来获取本机IP
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
|
||||
s.connect(("8.8.8.8", 80))
|
||||
return s.getsockname()[0]
|
||||
except Exception:
|
||||
return "127.0.0.1"
|
||||
|
||||
def check_debug_environment():
|
||||
"""检查调试环境"""
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 检查Python版本
|
||||
if sys.version_info < (3, 8):
|
||||
logger.error('需要Python 3.8或更高版本')
|
||||
return False
|
||||
|
||||
# 检查必要文件
|
||||
required_files = [
|
||||
'backend/app.py',
|
||||
'backend/config.ini',
|
||||
'backend/requirements.txt'
|
||||
]
|
||||
|
||||
for file_path in required_files:
|
||||
if not (project_root / file_path).exists():
|
||||
logger.error(f'缺少必要文件: {file_path}')
|
||||
return False
|
||||
|
||||
logger.info('调试环境检查通过')
|
||||
return True
|
||||
|
||||
def start_debug_server():
|
||||
"""启动调试服务器"""
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
try:
|
||||
# 设置环境变量
|
||||
os.environ['FLASK_ENV'] = 'development'
|
||||
os.environ['FLASK_DEBUG'] = '1'
|
||||
os.environ['PYTHONPATH'] = str(project_root)
|
||||
|
||||
# 导入Flask应用
|
||||
from backend.app import app, socketio, init_app
|
||||
|
||||
# 初始化应用
|
||||
logger.info('初始化应用...')
|
||||
try:
|
||||
init_app()
|
||||
logger.info('应用初始化成功')
|
||||
except Exception as init_e:
|
||||
logger.error(f'应用初始化失败: {init_e}', exc_info=True)
|
||||
raise
|
||||
|
||||
# 获取本机IP地址
|
||||
local_ip = get_local_ip()
|
||||
|
||||
# 启动调试服务器
|
||||
logger.info('启动调试服务器...')
|
||||
logger.info('调试模式已启用 - 可以在IDE中设置断点')
|
||||
logger.info('本地访问: http://127.0.0.1:5000')
|
||||
logger.info(f'远程访问: http://{local_ip}:5000')
|
||||
logger.info('健康检查: http://127.0.0.1:5000/health')
|
||||
logger.info('按 Ctrl+C 停止服务器')
|
||||
|
||||
# 启动SocketIO服务器(支持调试和远程访问)
|
||||
# socketio.run(
|
||||
# app,
|
||||
# host='0.0.0.0', # 允许所有IP访问
|
||||
# port=5000,
|
||||
# debug=True,
|
||||
# use_reloader=False, # 禁用热重载以避免FemtoBolt设备资源冲突
|
||||
# log_output=True, # 输出详细日志
|
||||
# allow_unsafe_werkzeug=True
|
||||
# )
|
||||
|
||||
except KeyboardInterrupt:
|
||||
logger.info('服务器被用户中断')
|
||||
except Exception as e:
|
||||
logger.error(f'服务器启动失败: {e}', exc_info=True)
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
print('='*50)
|
||||
print('身体平衡评估系统 - 调试模式')
|
||||
print('='*50)
|
||||
print()
|
||||
|
||||
# 设置调试日志
|
||||
logger = setup_debug_logging()
|
||||
|
||||
# 检查环境
|
||||
if not check_debug_environment():
|
||||
input('按任意键退出...')
|
||||
sys.exit(1)
|
||||
|
||||
# 启动调试服务器
|
||||
success = start_debug_server()
|
||||
|
||||
if not success:
|
||||
input('按任意键退出...')
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Reference in New Issue
Block a user