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