物件使用情況

程序會建立並使用核心物件來執行工作。就像記憶體可能外洩或遭到濫用 (例如無使用後使用),對核心物件的控制代碼可能外洩或遭到濫用 (例如關閉後使用)。

帳號代碼工具

為協助開發人員診斷處理問題,請使用 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 的同一個「log」物件。

請注意,這項工具可能不會顯示所有有效物件。舉例來說,即使執行緒沒有開放使用的控點,也仍可能存活下來,且 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_EXCEPTIONzx_job_set_policy,啟用「錯誤帳號代碼」工作政策。在使用這項政策的工作中啟動程序時,凡是使用已經關閉的控點都會產生例外狀況,如未處理,這些例外狀況就會終止程序,並記錄違規的呼叫堆疊,或是可能遭偵錯工具分散於互動式疑難排解。