NAME=dmhg/dmhga with memory dump
FILE=bins/heap/linux_glibc-2.30_x64.bin
ARGS=-n
CMDS=<<EOF
#re-map arena and [heap]
om 3 0x7ffff7f8a000 0x898 0x0 rw- arena
om 3 0x555555559000 0x3200 0x898 rw- [heap]

dmhga~?0x7ffff7f8a000
e dbg.glibc.tcache=0
dmhg~?allocated
e dbg.glibc.tcache=1
dmhg~?allocated
EOF
EXPECT=<<EOF
1
3
1
EOF
RUN

NAME=dmhgt with memory dump
FILE=bins/heap/linux_glibc-2.30_x64.bin
ARGS=-n
CMDS=<<EOF
#re-map arena and [heap]
om 3 0x7ffff7f8a000 0x898 0x0 rw- arena
om 3 0x555555559000 0x3200 0x898 rw- [heap]

e dbg.glibc.tcache=0
dmhgt~?Items[2]
e dbg.glibc.tcache=1
dmhgt~?Items[2]
EOF
EXPECT=<<EOF
0
1
EOF
RUN

NAME=dmhgl with memory dump
FILE=bins/heap/linux_glibc-2.30_x64.bin
ARGS=-n
CMDS=<<EOF
#re-map arena and [heap]
om 3 0x7ffff7f8a000 0x898 0x0 rw- arena
om 3 0x555555559000 0x3200 0x898 rw- [heap]

dmhgl~?0x7ffff7f8a000
e dbg.glibc.tcache=0
dmhgl~?0x555555559000
dmhgl~?0x555555559010
e dbg.glibc.tcache=1
dmhgl~?0x555555559000
dmhgl~?0x55555555c1a0
dmhgl~?0x55555555c1c0
EOF
EXPECT=<<EOF
1
2
1
1
1
1
EOF
RUN


NAME=dmhgc with memory dump
FILE=bins/heap/linux_glibc-2.30_x64.bin
ARGS=-n
CMDS=<<EOF
#re-map arena and [heap]
om 3 0x7ffff7f8a000 0x898 0x0 rw- arena
om 3 0x555555559000 0x3200 0x898 rw- [heap]
e dbg.glibc.tcache=1
dmhgc @ 0x555555559290~?0x20
dmhgc @ 0x555555559290~?0x555555559010
dmhgc @ 0x55555555c1a0~?0x1a0a
dmhgc @ 0x5555555592b0~?0x2ef0
EOF
EXPECT=<<EOF
1
1
1
1
EOF
RUN

NAME=multi-arena dmhg/dmhgb/dmhgc/dmhgd/dmhgf/dmhgg/dmhgm/dmhgt/dmhga/dmhgi aarch64
FILE=bins/heap/multi-arena-glibc-2.31-aarch64
ARGS=-d
CMDS=<<EOF
db @ sym.breakpoint_here
dc
dmhg~allocated?
dmhgb~Bin 000?
# dmhgc~hello?
dmhgd~Tcache?
echo ----
dmhgf~Fast bins?
dmhgg~Top?
dmhgm~malloc_state?
dmhgt~thread?
echo ----
dmhga~Thread?
$arena=$`dmhga | grep "Thread arena" | head -1 | awk -F'addr=' '{print $2}' | awk -F',' '{print $1}'`
dmhgi `$arena`~?malloc_info
EOF
REGEXP_FILTER_OUT=(?m)^[[:space:]]*\K([0-9]+|----)(?=[[:space:]]*$)
EXPECT=<<EOF
5
1
1
----
1
1
2
5
----
4
1
EOF
RUN
