檢查 zxdb 中的記憶體

Zxdb 可協助您檢查記憶體偵錯用途,如下所示 指令:

aspace

aspace 指令會輸出處理程序的位址空間資訊。於 Fuchsia,虛擬記憶體包含「虛擬記憶體」階層 Objects (VMO)。

舉例來說,aspace 指令會顯示程序中的所有 VMO:

[zxdb] aspace
           Start              End  Prot   Size      Koid       Offset  Cmt.Pgs  Name
        0x200000   0x7ffffffff000  ---    127T                                  proc:14629522
        0x200000   0x7ffffffff000  ---    127T                                    root
     0xe4ff29000      0xe5012a000  ---      2M                                      useralloc
     0xe4ff2a000      0xe5012a000  rw-      2M  14629569     0x201000        2        initial-thread
    0x6d0d1ad000     0x6d4d1b2000  ---      1G  14629573          0x0        0      scudo:reserved
    0x6d4d1b2000     0x6d4d1f2000  rw-    256K  14629575       0x5000        2      scudo:primary
...
  0x42afdf75e000   0x42afdf761000  rw-     12K  14629536          0x0        1        data:uncompressed-bootfs
  0x42afdf761000   0x42afdf771000  rw-     64K  14629537          0x0       16        bss:uncompressed-bootfs

              Page size: 4096
     Total mapped bytes: 48329449472
  Total committed pages: 125 = 512000 bytes
                         (See "help aspace" for what committed pages mean.)

如果您指定位址,aspace 指令會顯示 VMO 階層 包含指定的地址。這有助於判斷地址 位於記憶體中,因為 VMO 的名稱通常表示 也就是記憶體位址

[zxdb] aspace 0x6d0d1ad000
         Start              End  Prot  Size      Koid  Offset  Cmt.Pgs  Name
      0x200000   0x7ffffffff000  ---   127T                             proc:14629522
      0x200000   0x7ffffffff000  ---   127T                               root
  0x6d0d1ad000     0x6d4d1b2000  ---     1G  14629573     0x0        0      scudo:reserved

              Page size: 4096

在上述範例中,aspace 指令詳細說明瞭以下 0x6d0d1ad000 地址:

  • 包含位址的 VMO 階層。
  • 每個 VMO 的位址和大小。
  • 每個 VMO 的名稱,有助於提供相關線索。
    • 根據這個範例的名稱,您可以辨別地址位於堆疊中 由「pthreads」分配。

Cmt.Pgs」欄顯示該報告中已修訂的頁面數量 (而非位元組) 數量 包括在對應 VMO 中讀取及寫入記憶體區域

如果 VMO 是子項 (如同對應 blob 的情況),原始資料就會是 都出現在父項 VMO 中,但實際上 參照這項資料子項中唯一會視為已修訂的網頁 就是因寫入時複製而複製的這就是 BLOB 和其他 未經修改的檔案則會有 0 個承諾的網頁計數。

輸出內容的其他詳細資料

以下是可加在輸出內容中的輸出內容中的相關 VMO 名稱 aspace 指令:

  • initial-thread:啟動執行緒的堆疊。
  • pthread_t:0x...:pthread 建立的執行緒堆疊。地址 表示該執行緒 `pthread_t 結構的記憶體位置。
  • *uncompressed-bootfs:來自啟動檔案系統 (核心) 的記憶體對應程式庫 系統程式庫)。libs 指令會顯示相關程式庫名稱 讓我們看看 DNS 解析 進一步探索內部和外部位址
  • stack: msg of ...:啟動堆疊。這個 非常小的堆疊 由動態連結器和載入器程式碼產生
  • scudo:*:使用 Scudo 記憶體管理工具分配的頁面。如果程序 這些區域就是應用程式堆積
  • vdso/next:實作下一個系統呼叫的內建程式庫。
  • vdso/stable:實作穩定系統呼叫的內建程式庫。
  • blob-*:來自 blobf 的對應程式庫。libs 指令會傳回 該位址的程式庫名稱

如要進一步瞭解 VMO,請使用指令 handle -k <koid>

mem-analyze

這項指令會嘗試將記憶體解讀為指標,並將記憶體解碼 指向剛才提到的網頁含有對應符號的地址會經過符號化處理,其他 位址會指出其所屬記憶體對應區域的名稱。

本範例會分析 0x42ff9c2fdd30

[zxdb] mem-analyze 0x42ff9c2fdd30
       Address               Data
0x42ff9c2fdd30 0x00000000000015f0
0x42ff9c2fdd38 0x0000000000000008
0x42ff9c2fdd40 0x000042f401a8a730 ▷ ldso
0x42ff9c2fdd48 0x000042f401a8a9f8 ▷ $(dls3.app)
0x42ff9c2fdd50 0x0000000000000053
0x42ff9c2fdd58 0x0000000010469c6b
0x42ff9c2fdd60 0x000042f401a8a9f8 ▷ $(dls3.app)
0x42ff9c2fdd68 0x0000000000000000
0x42ff9c2fdd70 0x000042ff9c2fde70 ▷ inside map "stack: msg of 0x1000"
0x42ff9c2fdd78 0x000042f4015e5548 ▷ dls3 + 0x42b
0x42ff9c2fdd80 0x10469c6b10769c7b
0x42ff9c2fdd88 0x10569c3310469c23
0x42ff9c2fdd90 0x10469c2710469c37

stack-data 指令是 mem-analyze 的變化版本,可協助您分析堆疊。 詳情請參閱 stack-data

mem-read

mem-read 指令提供指定位址的十六進位傾印。您也可以 您可以使用 -size (-s) 選項,覆寫要讀取的預設位元組大小。

以下範例顯示位址 0x42ff9c2fdd30 的十六進位傾印,但只有讀取 最多 100 個位元組:

[zxdb] mem-read -s 100 0x42ff9c2fdd30
0x42ff9c2fdd30:  f0 15 00 00 00 00 00 00-08 00 00 00 00 00 00 00  |
0x42ff9c2fdd40:  30 a7 a8 01 f4 42 00 00-f8 a9 a8 01 f4 42 00 00  |0    B       B
0x42ff9c2fdd50:  53 00 00 00 00 00 00 00-6b 9c 46 10 00 00 00 00  |S       k F
0x42ff9c2fdd60:  f8 a9 a8 01 f4 42 00 00-00 00 00 00 00 00 00 00  |     B
0x42ff9c2fdd70:  70 de 2f 9c ff 42 00 00-48 55 5e 01 f4 42 00 00  |p /  B  HU^  B
0x42ff9c2fdd80:  7b 9c 76 10 6b 9c 46 10-23 9c 46 10 33 9c 56 10  |{ v k F # F 3 V
0x42ff9c2fdd90:  37 9c 46 10

mem-read 指令也支援可得出地址的運算式。 舉例來說,如果指標的類型具有已知大小,則自動傾印作業會自動 會顯示許多位元組:

[zxdb] mem-read &self->main_waker
0x1605a5d1ed0:  70 1a c8 36 47 04 00 00-68 fe 3d dd 25 01 00 00  |p  6G   h = %

stack-data

stack-data 指令會提供低層級的堆疊分析。這項功能可以正常運作 與 mem-analyze 類似。stack-data預設為目前的頂端 透過執行緒記錄stack-data 指令會嘗試將位於 但也會新增已知暫存器值的註解 以及執行緒的堆疊基準指標

例如:

[zxdb] stack-data
      Address               Data
0x1605a5d1428 0x000042a352fca11f ◁ rsp. ▷ _zx_port_wait + 0x1f
0x1605a5d1430 0x000001605a5d1460 ◁ frame 1 rsp. ▷ inside map "initial-thread"
0x1605a5d1438 0x000001605a5d1540 ▷ inside map "initial-thread"
0x1605a5d1440 0x7fffffffffffffff
0x1605a5d1448 0x0000044ab6c81800 ▷ inside map "scudo:primary"
0x1605a5d1450 0x000001605a5d14d0 ◁ rbp, frame 1 base. ▷ inside map "initial-thread"
0x1605a5d1458 0x00000125dd3566f5 ▷ fuchsia_zircon_status::Status::ok
0x1605a5d1460 0x0000000000000000 ◁ frame 2 rsp
0x1605a5d1468 0x0000000000000000
0x1605a5d1470 0x0000000000000000
0x1605a5d1478 0x0000000000000000
0x1605a5d1480 0x0000000000000000 ◁ rdx, r14

在附註欄中:

  • 向左箭頭指出指向該堆疊位置的登錄點。
  • 向右箭頭指出堆疊進入點的值 如果轉譯為地址

sym-near

sym-near 指令會嘗試將地址對應到符號名稱。執行 指令會輸出位於 或前面,而且最常用於判斷指標指向的目標。

例如:

[zxdb] sym-near 0x125dd3a845e
0x125dd3a845e, power_manager::main() • main.rs:37