NAME=use of dmhg, then any command which use grep and index
FILE=bins/elf/simple_malloc_x86_64
ARGS=-d
CMDS=<<EOF
db @ sym.main
dc
dmhg > /dev/null
aa > /dev/null
dr r13=rip
pdf @ sym.main~:4
EOF
EXPECT=<<EOF
/ int main(int argc, char **argv, char **envp);
EOF
RUN

NAME=dmhg allocated
FILE=bins/elf/simple_malloc_x86_64
ARGS=-d
CMDS=<<EOF
(dmhg_tail n; dmhg~:-${n}.. | sed 's/11c\|120/1__/;  s/xf1\|xed/x__/')
dcu main
.(dmhg_tail 2)
echo ----
7dso
.(dmhg_tail 3)
EOF
REGEXP_FILTER_OUT=(status=[a-z]+)|(size=0x[_a-f0-9]+)
EXPECT=<<EOF
status=allocated
size=0x1__10
status=free
size=0x__60
status=allocated
size=0x1__10
status=allocated
size=0x20
status=free
size=0x__40
EOF
RUN

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=check dmhgf
FILE=bins/elf/glibc-heap-2.31
ARGS=-Rsetenv=LD_PRELOAD=bins/elf/libc-2.31.so -d
CMDS=<<EOF
db @ 0x004011fa
dc
dmhgf~?Chunk
dmhgf 1~?Chunk
dmhgf 2~?Chunk
dmhgf 3~?Chunk
EOF
EXPECT=<<EOF
8
8
0
0
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=dmhgb/dmhgg/dmhgm
FILE=bins/elf/glibc-heap-2.31
ARGS=-Rsetenv=LD_PRELOAD=bins/elf/libc-2.31.so -d
CMDS=<<EOF
db @ 0x004011fa
dc
dmhgb~Bin 000:?
dmhgg~Top?
dmhgm~Large?
EOF
EXPECT=<<EOF
1
1
1
EOF
RUN

NAME=dmhgb/dmhgg/dmhgm
FILE=bins/elf/glibc-heap-2.31
ARGS=-Rsetenv=LD_PRELOAD=bins/elf/libc-2.31.so -d
CMDS=<<EOF
db @ 0x004011fa
dc
dmhgb~Bin 000:?
dmhgg~Top?
dmhgm~Large?
EOF
EXPECT=<<EOF
1
1
1
EOF
RUN

NAME=multi-arena dmhga/dmhgi
FILE=bins/heap/multi-arena-glibc-2.31-amd64
ARGS=-d
CMDS=<<EOF
dc
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
4
1
EOF
RUN
