3、服务器日志分析:服务器启动日志、世界Tick日志、蓝图注册日志、地图加载日志、错误与崩溃日志
好,咱们进入第三章。服务器日志分析。
说实话,很多做Carla仿真的朋友,一看到日志文件就头疼。几百上千行,密密麻麻的,不知道从哪看起。我个人习惯是,先抓大放小,先看启动阶段,再看运行阶段,最后查错误。今天我就把这套思路拆开,跟你聊聊。
3.1 服务器启动日志——一切从这里开始
Carla服务器启动时,会打印一堆信息。这些信息看似杂乱,其实藏着很多关键线索。
我一般会先看这几行:
LogCarlaServer: Display: Starting Carla server...
LogCarlaServer: Display: Version: 0.9.14
LogCarlaServer: Display: Map: /Game/Carla/Maps/Town01
LogCarlaServer: Display: Streaming level: /Game/Carla/Maps/Town01_Opt
LogCarlaServer: Display: Using hardware: NVIDIA GeForce RTX 3080
LogCarlaServer: Display: Listening on port 2000
嗯,这里要注意几个点:
- 版本号:确认是不是你期望的版本。版本不匹配,后面客户端连不上是常有的事。
- 地图名:是不是你要加载的地图?我遇到过有人配错了地图路径,结果加载了个空场景,跑了一下午才发现。
- 硬件信息:显卡型号对不对?显存够不够?如果显示的是“Unknown”,那大概率驱动有问题。
- 端口号:默认是2000,但如果你开了多个实例,端口冲突就会报错。
3.2 世界Tick日志——仿真运行的脉搏
世界Tick,说白了就是每一帧仿真步进。Carla每走一步,都会打印Tick信息。
LogCarlaServer: Display: Tick 0: DeltaSeconds=0.033, FrameTime=12.4ms
LogCarlaServer: Display: Tick 1: DeltaSeconds=0.033, FrameTime=11.8ms
LogCarlaServer: Display: Tick 2: DeltaSeconds=0.033, FrameTime=45.2ms // 注意这里
LogCarlaServer: Display: Tick 3: DeltaSeconds=0.033, FrameTime=13.1ms
你看,Tick 2的FrameTime突然飙到了45.2ms。为什么会这样?
我个人经验,这种瞬时卡顿通常有几个原因:
- 物理引擎计算过载:比如突然有大量车辆碰撞检测。
- 渲染瓶颈:某个复杂模型突然进入视野,显卡扛不住了。
- 传感器数据回传:如果你开了多个摄像头或激光雷达,数据量一大,CPU就忙不过来了。
3.3 蓝图注册日志——你的资产都注册了吗?
蓝图(Blueprint)是Carla里定义车辆、行人、传感器的模板。服务器启动时,会扫描并注册所有可用的蓝图。
LogCarlaServer: Display: Registering blueprint: /Game/Carla/Blueprints/Vehicles/Vehicle_4W_Base
LogCarlaServer: Display: Registering blueprint: /Game/Carla/Blueprints/Vehicles/Vehicle_2W_Base
LogCarlaServer: Display: Registering blueprint: /Game/Carla/Blueprints/Sensors/Camera_RGB
LogCarlaServer: Warning: Failed to register blueprint: /Game/Carla/Blueprints/Vehicles/Broken_Car
LogCarlaServer: Display: Total blueprints registered: 127
这里有个关键点:注册失败的蓝图。如果某个蓝图加载失败,你后面用客户端去生成它,就会报“Blueprint not found”。
我记得有一次,客户说他们的车模加载不出来。我一看日志,发现那个车模的材质引用了外部贴图,路径写死了,换台机器就找不到。所以,我建议你养成习惯:
- 启动后先看“Total blueprints registered”这个数字,跟预期是否一致。
- 如果少了,去查“Failed to register”的具体原因。
- 自定义蓝图的话,路径一定要用相对路径,别写死。
3.4 地图加载日志——场景能不能跑起来,就看这里
地图加载是仿真启动中最耗时的环节。日志里会详细记录每一步的加载进度。
LogCarlaServer: Display: Loading map: /Game/Carla/Maps/Town05
LogCarlaServer: Display: Map file size: 1.2GB
LogCarlaServer: Display: Loading static meshes... Done (3.4s)
LogCarlaServer: Display: Loading textures... Done (2.1s)
LogCarlaServer: Display: Loading navigation data... Done (0.8s)
LogCarlaServer: Display: Loading traffic lights... Done (0.3s)
LogCarlaServer: Display: Map loaded successfully in 6.6s
嗯,这里要注意几个时间点:
- 静态网格体加载时间:如果超过10秒,说明模型太复杂,或者硬盘读写速度跟不上。
- 导航数据加载:这个很关键。如果导航数据加载失败,行人、车辆就不会自动寻路,全傻站着。
- 总加载时间:一般控制在10秒以内算正常。超过30秒,你就要考虑优化地图了。
重点:如果地图加载到一半卡住了,日志里没有“Map loaded successfully”这一行,那基本可以断定是地图文件损坏或者资源缺失。我遇到过最离谱的一次,是地图里一个路灯模型引用了不存在的碰撞体,导致加载到99%就崩溃。排查了三个小时,最后用UE编辑器打开地图才找到问题。
3.5 错误与崩溃日志——最头疼但也最有价值的部分
这部分是大家最不想看到,但又不得不面对的。Carla崩溃时,会打印错误堆栈。
LogCarlaServer: Error: Fatal error! Unhandled exception: Access violation reading location 0x00000000
LogCarlaServer: Error: Stack trace:
LogCarlaServer: Error: 0x00007FF6A1B2C3D4: FCarlaServer::Tick() + 0x123
LogCarlaServer: Error: 0x00007FF6A1B2E5F6: FEngineLoop::Tick() + 0x456
LogCarlaServer: Error: 0x00007FF6A1B30789: FEngineLoop::Run() + 0x789
LogCarlaServer: Error: 0x00007FF6A1B329AB: WinMain() + 0xABC
看到这种“Access violation”或者“Segmentation fault”,别慌。我教你一个排查思路:
- 看错误类型:是内存访问错误、空指针、还是断言失败?
- 看堆栈第一行:哪个函数里崩的?比如这里是
FCarlaServer::Tick(),说明是在仿真步进时出的问题。 - 回忆刚才的操作:崩溃前你做了什么?是生成了大量车辆?还是修改了传感器参数?
另外,还有一种常见的崩溃是“Assertion failed”。比如:
LogCarlaServer: Error: Assertion failed: (Vehicle != nullptr) at line 256 of CarlaServer.cpp
这种错误其实比空指针好排查。因为它明确告诉你了:某个地方断言Vehicle不能为空,但它偏偏是空。你顺着这个线索,去检查那个Vehicle对象是不是已经被销毁了,或者根本没创建成功。
3.6 实战:一个完整的日志分析案例
好,咱们来走一遍完整的分析流程。假设你启动Carla后,客户端连不上,日志如下:
LogCarlaServer: Display: Starting Carla server...
LogCarlaServer: Display: Version: 0.9.14
LogCarlaServer: Display: Map: /Game/Carla/Maps/Town01
LogCarlaServer: Error: Failed to load map: /Game/Carla/Maps/Town01
LogCarlaServer: Error: Map file not found
LogCarlaServer: Display: Listening on port 2000
你看,服务器虽然启动了,但地图加载失败。客户端连上来,只能看到一个空世界。
我的排查步骤:
- 先确认地图路径:是不是拼写错了?Town01还是Town01_Opt?
- 检查文件是否存在:去Carla安装目录下的Content/Carla/Maps里看看,有没有这个文件。
- 检查权限:有时候文件在,但读取权限不够。
- 重新导入地图:如果文件损坏,用UE编辑器重新导入一下。
嗯,其实大部分日志问题,只要你有耐心,一行一行看下去,都能找到线索。别被那些英文错误吓到,说白了就是“文件没找到”、“内存不够”、“指针为空”这几类。
好了,这一章就到这里。下一章咱们聊聊客户端日志,那又是另一番天地了。