debug tool for game develop

本文将介绍各类开发调试工具的主要用途以及使用方式

CPU

SimplePef

PerfDog

可以查到多种指标:CPU, GPU, Memory

GPU的具体指标不同机型不一致,Mali有的能查看Early-Z Rate, Late Z Rate

Perfdog GPU Counter

Perfetto

  • 系统级的性能剖析工具,可剖析单应用,也可剖析多应用以及设备的部分性能数据

VTune

Superluminal

Unreal Insights

启动命令行中添加如下参数:

1
-tracehost=主机ip -trace=default,cpu,memory,gpu -statnamedevent

启动UnrealInsights后再启动进程,则会自动开始捕获性能数据

Android可修改UE4CommandLine.txt或通过adb shell setprop debug.ue.commandline \"启动参数\"设置

框选范围后可在右侧Counter界面查看该段时间内的Counter数,用于统计一段时间内的平均开销

在日志窗口中点击某条日志后时间轴会定位到对应帧:

Android Studio

power profiler:要求系统版本Android10+,设备Pixel6+,可查看各模块的功耗情况

assets-over-wlan

WPA & WPR

WPR可以用于生成ETL文件,WPA用于查看ETL格式文件,ETL全称为Event Trace Log

还可以通过XPerf基于命令行形式生成ETL,以及UIForETW生成ETL文件

其记录大量的事件信息,可以查看CPU利用率,GPU利用率,文件读写,磁盘读写,各进程/线程的调用堆栈等

比如我们可以使用该文件分析卡顿:

  • 查看CPU Usage视图,找到大致发生卡顿的时间区域中CPU利用率下降的区域

CPU-Usage

  • 右键Zoom后,将会放大指定的框选区域,展开指定进程的堆栈,会按开销占比显示这段时间内的堆栈

  • 使用CPU Usage (Attributed)可以查看各线程的CPU占比开销,比如主线程发生卡顿时渲染线程的利用率会下降

    • 以此便可查看此时主线程在执行什么堆栈

    CPU-Usage-Attribute

  • 如果发现文件读写卡住,则可以打开File IO视图查看

FileIO

GPUView

该工具目前包含在Windows Performance Toolkit(WPT)中,虽然工具名为GPUView,但也可以用于分析CPU卡顿

GPUView可以选中区域并放大查看这段区域的CPU采样堆栈以及各进程的CPU Queue

以及CPU Queue上的任务在GPU Queue上的执行顺序,通过Event List可以查看各类事件的触发时间

我们可以通过ID3DUserDefinedMarker添加D3D PerfMark,用于标记渲染Pass,可参考:GPUView EventView

dx11perfmarker

以及使用GUID注册任意事件调用:how to add a custom event which is visible in gpuview

PerfSDK

XCode Instruments

XCode LLDB

LLDB设置内存断点:

1
watchpoint set expression -- 地址

查看寄存器内容,例如查看r0寄存器:

1
register read r0

具体使用可以问ChatGPT

GPU

Renderdoc

Renderdoc在Windows上采用DirectX模拟的方式Replay其它图形API,Android的Hook分为Layer与非Layer的形式

DirectX程序需使用D3D_DEBUG创建Device才能截帧,Android需启用debuggable

当前存在的问题

  • 贴图Preview

Mobile上的ASTC贴图无法正确显示,比如UE中某张贴图格式指定为BGRA,在Mobile上会被压缩为ASTC

由于PC上是以DX进行模拟,因此只能以RGBA进行显示,因此Renderdoc Preview会出现错误

  • 运算精度

比如RGBA16F的贴图,由于IEEE 16Bit Float的有效精度为11位,最多显示2048。

当计算结果超出2048时,显示结果将会出现错误。

NSight

NSight有多个产品,这里主要介绍两个:

  • NSight Graphics
  • NSight System

NSight Graphics

最常用的FrameDebugger,用于截取一帧:支持D3D11, D3D12, OpenGL, Vulkan

NSight-FrameDebugger

以及提供了GPU Trace Profiler,用于Trace多帧的GPU执行状态,但是不支持D3D11,最好使用管理员权限启动

NSight GPU Trace Profiler

Trace显示如下:

image-20240122223714511

Ctrl+滚轮可以放大指定区域,查看各Pass执行开销:

Detail-GPU-Pass

以及提供了Trace Analysis, Trace Compare功能方便进行性能分析,唯一的不足在于无法长时间Trace

NSight System

可以直接启动NSight System,也可以通过NSight Graphics的System Trace页启动,要求应用使用D3D12/Vulkan

NSight System Select Device

然后配置Trace选项,下图为启动后自动开始Trace

NSight System Trace Config

实测该工具经常分析失败,数据多时失败概率显著增加

Snapdragon Profiler

  • 查看带宽:GMEM Load/Store

System Trace面板可查看Bin分块情况,GMEM的Load/Store,是否为Direct模式等

Mali Offline Compiler

Adreno Offline Compiler

  • 相比于Mali Offline Compiler得到的数据更为准确,可信

Arm Graphics Tool

Adreno GPU Profiler

Android GPU Inspector

PVRTune

Radeon GPU Profiler

XCode

GPUView

基本用法参考1.9节

PIX

微软官方出品,可以实现Timeline Trace,这点优于NSight Graphics

Memory

Adroid Address Sanitizer

HWAddress Sanitizer

Loli Profiler

Unreal Memory Report

游戏内的Console输入memreport -full即会在Saved/Profiling下生成报告

Unreal LowLevelMemory

可使用PerfreportTool可视化CSV:

StompMalloc

该模式利用缺页机制实现检测,由于PC暂不支持Address Sanitizer,该方案依然可考虑使用

Unreal Memory Insights

ADB

1
adb shell dumpsys memoryinfo

UE高级性能剖析技术 – Android内存分布和优化

XCode

  • Address Sanitizer
  • Zombie Object
  • Malloc History
  • Memory Graph

Decompile

IDA

Android真机调试

包体要求:

  • debuggable为true: UE打包时ForDistribution设置为False即可

启动Android_Server

ADB连接手机后打开Android Studio,随便新建或打开一个项目,找到Device File Explorer

Device File Explorer

找到目标应用,如:/data/data/com.lilithgames.xgame.gp,在其上右键, 选择Upload

Upload File To Android

在打开的文件选择框中选择android_server64(32位的选android_server),该文件位于:

  • IDAPro安装目录/dbgsrv/android_server64

成功将android_server64上传至手机后,在cmd窗口执行:

  • 进入shell环境:adb shell
  • 执行run-as: run-as com.lilithgames.xgame.gp
  • 提权: chmod 777 android_server64
  • 启动server:
1
2
3
4
5
6
7
# android10及以上使用该命令
IDA_LIBC_PATH=/apex/com.android.runtime/lib64/bionic/libc.so ./android_server64

# android10以下使用该命令
./android_server64

adb shell am start -D -n com.lilithgames.xgame.gp/com.epicgames.ue4.SplashActivity

Listen Android Server

此时cmd窗口可见到监听23946端口的提示,接下来再开一个cmd窗口用于转发端口:

1
adb forward tcp:23946 tcp:23946

Attach Debug

设置调试器:这里是用Remote ARM Linux/Android debugger

Set Debugger

打开Process Option,设置调试信息:

Set Debugger Info

接下来选择Attach To Process并选择目标进程进行挂载:

Attach To Process

其它命令:

  • 查询端口占用:adb shell netstat -tulpn
  • 提权:adb shell chmod 777 /data/local/android_server64
  • 读取so BuildID: readelf -n xxx.so

x64dbg

preintegrated skin rendering perlin-noise

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×