Zxdb 可協助您檢查記憶體偵錯用途,如下所示 指令:
-
顯示對應記憶體區域。
-
轉儲記憶體協助您解讀指標。
-
傾印程序記憶體。
-
提供堆疊的低階分析。
-
將地址對應至符號。
aspace
aspace
指令會輸出處理程序的位址空間資訊。於
Fuchsia,虛擬記憶體包含「虛擬記憶體」階層
Objects (VMO)。
舉例來說,aspace
指令會顯示程序中的所有 VMO:
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 的名稱通常表示
也就是記憶體位址
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
:
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
個位元組:
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
指令也支援可得出地址的運算式。
舉例來說,如果指標的類型具有已知大小,則自動傾印作業會自動
會顯示許多位元組:
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
指令會嘗試將位於
但也會新增已知暫存器值的註解
以及執行緒的堆疊基準指標
例如:
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 ▷ zx_status::Status::ok
0x1605a5d1460 0x0000000000000000 ◁ frame 2 rsp
0x1605a5d1468 0x0000000000000000
0x1605a5d1470 0x0000000000000000
0x1605a5d1478 0x0000000000000000
0x1605a5d1480 0x0000000000000000 ◁ rdx, r14
在附註欄中:
- 向左箭頭指出指向該堆疊位置的登錄點。
- 向右箭頭指出堆疊進入點的值 如果轉譯為地址
sym-near
sym-near
指令會嘗試將地址對應到符號名稱。執行
指令會輸出位於
或前面,而且最常用於判斷指標指向的目標。
例如:
sym-near 0x125dd3a845e
0x125dd3a845e, power_manager::main() • main.rs:37