本文将介绍各类开发调试工具的主要用途以及使用方式
CPU
SimplePef
PerfDog
可以查到多种指标:CPU, GPU, Memory
GPU的具体指标不同机型不一致,Mali有的能查看Early-Z Rate, Late Z Rate
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+,可查看各模块的功耗情况
WPA & WPR
WPR可以用于生成ETL文件,WPA用于查看ETL格式文件,ETL全称为Event Trace Log
还可以通过XPerf基于命令行形式生成ETL,以及UIForETW生成ETL文件
其记录大量的事件信息,可以查看CPU利用率,GPU利用率,文件读写,磁盘读写,各进程/线程的调用堆栈等
比如我们可以使用该文件分析卡顿:
- 查看CPU Usage视图,找到大致发生卡顿的时间区域中CPU利用率下降的区域
右键Zoom后,将会放大指定的框选区域,展开指定进程的堆栈,会按开销占比显示这段时间内的堆栈
使用CPU Usage (Attributed)可以查看各线程的CPU占比开销,比如主线程发生卡顿时渲染线程的利用率会下降
- 以此便可查看此时主线程在执行什么堆栈
如果发现文件读写卡住,则可以打开File IO视图查看
GPUView
该工具目前包含在Windows Performance Toolkit(WPT)中,虽然工具名为GPUView,但也可以用于分析CPU卡顿
GPUView可以选中区域并放大查看这段区域的CPU采样堆栈以及各进程的CPU Queue
以及CPU Queue上的任务在GPU Queue上的执行顺序,通过Event List可以查看各类事件的触发时间
我们可以通过ID3DUserDefinedMarker添加D3D PerfMark,用于标记渲染Pass,可参考:GPUView EventView
以及使用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
以及提供了GPU Trace Profiler,用于Trace多帧的GPU执行状态,但是不支持D3D11,最好使用管理员权限启动
Trace显示如下:
Ctrl+滚轮可以放大指定区域,查看各Pass执行开销:
以及提供了Trace Analysis, Trace Compare功能方便进行性能分析,唯一的不足在于无法长时间Trace
NSight System
可以直接启动NSight System,也可以通过NSight Graphics的System Trace页启动,要求应用使用D3D12/Vulkan
然后配置Trace选项,下图为启动后自动开始Trace
实测该工具经常分析失败,数据多时失败概率显著增加
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
- Instruments
- Optimizing GPU performance
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 |
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
找到目标应用,如:/data/data/com.lilithgames.xgame.gp
,在其上右键, 选择Upload
在打开的文件选择框中选择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 | # android10及以上使用该命令 |
此时cmd窗口可见到监听23946端口的提示,接下来再开一个cmd窗口用于转发端口:
1 | adb forward tcp:23946 tcp:23946 |
Attach Debug
设置调试器:这里是用Remote ARM Linux/Android debugger
打开Process Option
,设置调试信息:
接下来选择Attach To Process
并选择目标进程进行挂载:
其它命令:
- 查询端口占用:adb shell netstat -tulpn
- 提权:adb shell chmod 777 /data/local/android_server64
- 读取so BuildID: readelf -n xxx.so
Comments