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,但如果你开了多个实例,端口冲突就会报错。
我的小技巧:启动日志里如果出现“Warning: Could not find...”之类的提示,别急着忽略。我曾经因为一个纹理文件缺失,导致整个场景的材质全变成了粉红色,排查了整整两天。

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就忙不过来了。
避坑指南:我曾经在仿真中加了20个激光雷达,结果Tick时间从12ms直接飙到200ms。后来发现,每个雷达的点云数据都在主线程里处理,根本没做异步。所以,如果你发现Tick时间持续偏高,先检查传感器配置。

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”,别慌。我教你一个排查思路:

  1. 看错误类型:是内存访问错误、空指针、还是断言失败?
  2. 看堆栈第一行:哪个函数里崩的?比如这里是FCarlaServer::Tick(),说明是在仿真步进时出的问题。
  3. 回忆刚才的操作:崩溃前你做了什么?是生成了大量车辆?还是修改了传感器参数?
我曾经踩过的坑:有一次,我写了个Python脚本,每帧都生成一个新的行人。结果跑了5分钟,Carla直接崩了。日志里显示“Out of memory”。后来一查,我生成的行人从来没销毁过,内存越堆越多。所以,如果你看到内存相关的错误,先检查有没有资源泄漏。

另外,还有一种常见的崩溃是“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

你看,服务器虽然启动了,但地图加载失败。客户端连上来,只能看到一个空世界。

我的排查步骤:

  1. 先确认地图路径:是不是拼写错了?Town01还是Town01_Opt?
  2. 检查文件是否存在:去Carla安装目录下的Content/Carla/Maps里看看,有没有这个文件。
  3. 检查权限:有时候文件在,但读取权限不够。
  4. 重新导入地图:如果文件损坏,用UE编辑器重新导入一下。

嗯,其实大部分日志问题,只要你有耐心,一行一行看下去,都能找到线索。别被那些英文错误吓到,说白了就是“文件没找到”、“内存不够”、“指针为空”这几类。

好了,这一章就到这里。下一章咱们聊聊客户端日志,那又是另一番天地了。