Zxdb 可以帮助您检查内存以进行调试,方法如下: 命令:
- 
显示映射的内存区域。
 - 
转储内存以帮助您解释指针。
 - 
转储进程内存。
 - 
提供堆栈的底层分析。
 - 
将地址映射到符号。
 
aspace
aspace 命令会输出进程的地址空间信息。在
Fuchsia,虚拟内存由虚拟内存层级结构组成
对象 (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 的名称通常表示什么类型的区域
找到该内存地址
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 中,但实际上间接映射的子 VMO 引用此数据。子级中唯一计为已提交的页面 因写入时复制而复制的内容。这就是 BLOB 和其他 未修改的文件的提交页数将为 0。
有关输出的其他详细信息
以下是相关的 VMO 名称,可以包含在
aspace 命令:
initial-thread:启动线程的堆栈。pthread_t:0x...:pthread 创建的线程的堆栈。地址 表示该线程的 `pthread_t 结构体的内存位置。*uncompressed-bootfs:来自 bootfs(核心 系统库)。libs命令可以告诉您 地址。stack: msg of ...:启动堆栈。这个非常小的堆栈 由动态链接器和加载器代码决定scudo:*:使用 Scudo 内存管理器分配的页面。如果进程 这些区域就是应用堆vdso/next:实现后续系统调用的内置库。vdso/stable:用于实现稳定系统调用的内置库。blob-*:来自 blobfs 的映射库。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