进程会创建并使用内核对象来执行工作。正如记忆可以 被泄露或滥用(例如释放后使用),内核对象的句柄 泄露或被滥用(例如 use-after-close)。
标识名工具
为帮助开发者诊断处理问题,请使用下面的 handles
工具
是 wlancfg.cm 进程 29831 的示例:
$ handles 29831
handle koid rkoid rights type
0xa8d44a0f: 29973 0x0000d0ef vmo
0xa8e44aab: 29847 29846 0x0000f00e channel
0xa8d44a0b: 29972 0x0000d0ef vmo
0xa8e42413: 9931 9930 0x0000f00e channel
0xa8d44a07: 29971 0x0000d0ef vmo
0xa8f44a1f: 29969 29970 0x0000f00e channel
0xa8a44a3b: 29964 0x0000d0ef vmo
0xa8d44a17: 29962 29963 0x0000f00e channel
0xa8844a43: 29961 0x0000d0ef vmo
0xa8f44a4b: 29960 0x0000d0ef vmo
0xa8e44a3f: 29959 0x0000d0ef vmo
0xa8e44a23: 29958 0x0000800f port
0xa8f44a2f: 29957 0x0000d0ef vmo
0xa8644a53: 29911 0x0000d0ef vmo
0xa8a44a7f: 29908 0x0000d0ef vmo
0xa8844a6b: 29907 0x0000d0ef vmo
0xa8f44a63: 29906 0x0000d0ef vmo
0xa8844a6f: 29905 0x0000d0ef vmo
0xa8f44a8b: 29904 0x0000d0ef vmo
0xa8944a9f: 29903 0x0000d0ef vmo
0xa8444a83: 29900 0x0000800f vmar
0xa8e44a77: 29845 0x0000d0ef vmo
0xa8f44a8f: 1034 0x0000d0f7 vmo
0xa8d44aa3: 1129 0x0000d00b log
0xa8d44abf: 1129 0x0000d00b log
0xa8d44abb: 1129 0x0000d00b log
0xa8644aef: 29827 29828 0x0000f00e channel
0xa8844ac3: 29826 8711 0x0007dfcf job
0xa8144afb: 29825 29824 0x0000f00e channel
0xa8e44adb: 29816 29817 0x0000f00e channel
0xa8e44ad3: 29776 29777 0x0000f00e channel
0xa894496b: 29766 29767 0x0000f00e channel
0xa8d44a97: 29833 29831 0x0004d2cf thread
0xa8d44a93: 29832 0x0000801f vmar
0xa8d44aaf: 29831 29826 0x0006d3cf process
0xa8f44a73: 29850 0x0000d00b log
0xa8f44af3: 29768 29769 0x0000f00e channel
0xa8e44aa7: 29834 29835 0x0000f00e channel
38 handles
handles <pid>
工具会转储进程句柄表
该特定进程的可访问句柄。
对于每个手柄,该工具都会输出手柄值、它的对象的 koid 指向相关的 koid (rkoid),如果相应对象具有相关的对象, 标识名的权利和对象的类型。
在上面的示例中,它显示了 38 个唯一句柄,这些句柄映射到 36 个唯一 对象;3 个句柄指向同一个“日志”与 Koid 1129 对应的对象
请注意,该工具可能不会显示所有活跃对象。 例如,即使没有向线程打开的句柄,线程也可能处于活动状态,并且 VMO 可由关联的 VMAR 保持活跃状态。
handles
工具支持按对象类型过滤和反向过滤;使用
handles --help
即可查看所有选项。
调试程序中的句柄
您可以使用调试程序查看句柄信息。
为此,请附加到相关进程并运行 handles
命令。这会显示
值、对象类型和对象 koid:
[zxdb] handles
504103211 ZX_OBJ_TYPE_VMO 27851
504103271 ZX_OBJ_TYPE_VMO 27719
505151859 ZX_OBJ_TYPE_VMO 27720
505151867 ZX_OBJ_TYPE_VMO 27718
506200511 ZX_OBJ_TYPE_PORT 27976
507249163 ZX_OBJ_TYPE_VMAR 27716
508297363 ZX_OBJ_TYPE_VMO 28200
508297379 ZX_OBJ_TYPE_VMO 28187
508297387 ZX_OBJ_TYPE_SOCKET 28189
508297731 ZX_OBJ_TYPE_CLOCK 1263
508297735 ZX_OBJ_TYPE_LOG 1275
508297755 ZX_OBJ_TYPE_LOG 1275
您还可以通过调用 handle
并指定句柄来查看有关句柄的基本信息
值:
[zxdb] handle 508302371
Type ZX_OBJ_TYPE_CHANNEL
Value 508302371
Rights ZX_RIGHT_TRANSFER
ZX_RIGHT_READ
ZX_RIGHT_WRITE
ZX_RIGHT_SIGNAL
ZX_RIGHT_SIGNAL_PEER
ZX_RIGHT_WAIT
ZX_RIGHT_INSPECT
Koid 31062
Related koid 31061
如果句柄引用的对象与另一个对象(例如
渠道或作业的父级),则 related_koid
是该对象的 koid。如果有
没有其他相关对象,则此值为零。在这个例子中,相关的 koid 是
频道这种关系是不可变的:即使related_koid
相关对象已不存在。
错误句柄政策
在关闭后使用句柄 或关闭已经关闭的标识名都是错误, 来诊断错误。
为了帮助开发者发现这些问题,“错误句柄”作业政策可以 使用 zx_job_set_policy 启用 条件为 ZX_POL_BAD_HANDLE,操作为 ZX_POL_ACTION_ALLOW_EXCEPTION.当进程在具有 此政策,因此使用已关闭的标识名会导致例外情况 如果未处理,则会终止进程并记录违规的调用堆栈 或者可以被调试程序捕获的内容 进行交互式问题排查