Created
January 4, 2019 20:38
-
-
Save RichardWeiYang/123ce27f686165dca9a27278384d1081 to your computer and use it in GitHub Desktop.
GDB script to explore Qemu address space
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
define __dump_memory_region | |
set $indent = $arg1 | |
while $indent | |
printf " " | |
set $indent = $indent - 1 | |
end | |
set $mr_dump = (MemoryRegion*)$arg0 | |
printf "[%016x-%x%016x]:%s\n", $mr_dump->addr, \ | |
*((unsigned long long*)&$mr_dump->size + 1) , \ | |
$mr_dump->addr + *(unsigned long long*)&$mr_dump->size, \ | |
$mr_dump->name | |
end | |
define __dump_memory_regions | |
set $pmr = (MemoryRegion*)$arg0 | |
__dump_memory_region $pmr $arg1 | |
set $level = $arg1 + 1 | |
set $pmr = $pmr->subregions.tqh_first | |
while $pmr != 0 && $pmr != $arg0 | |
__dump_memory_region $pmr $level | |
# iterate chile if has | |
if $pmr->subregions.tqh_first | |
set $level = $level + 1 | |
set $pmr = $pmr->subregions.tqh_first | |
# iterate sibling if has | |
else | |
if $pmr->subregions_link.tqe_next | |
set $pmr = $pmr->subregions_link.tqe_next | |
# go back to uncle | |
else | |
while $pmr->container && $pmr != $arg0 | |
set $level = $level - 1 | |
if $pmr->container->subregions_link.tqe_next | |
set $pmr = $pmr->container->subregions_link.tqe_next | |
loop_break | |
else | |
set $pmr = $pmr->container | |
end | |
end | |
end | |
end | |
end | |
end | |
define dump_memory_region | |
set $root_mr = (MemoryRegion*)$arg0 | |
printf "Dump MemoryRegion:%s\n", $root_mr->name | |
__dump_memory_regions $root_mr 0 | |
end | |
document dump_memory_region | |
Dump a MemoryRegion: dump_memory_region SYM|ADDRESS | |
Example: | |
dump_memory_region system_memory | |
dump_memory_region 0x5555565036a0 | |
end | |
define dump_flatview | |
set $fv = (FlatView*)$arg0 | |
set $i = 0 | |
while $i < $fv->nr | |
printf "[%x%016x-%x%016x], offset_in_region %016x\n", \ | |
*((unsigned long long*)&$fv->ranges[$i].addr.start + 1), \ | |
*(unsigned long long*)&$fv->ranges[$i].addr.start, \ | |
*((unsigned long long*)&$fv->ranges[$i].addr.size + 1), \ | |
*(unsigned long long*)&$fv->ranges[$i].addr.start + *(unsigned long long*)&$fv->ranges[$i].addr.size, \ | |
$fv->ranges[$i].offset_in_region | |
set $i = $i + 1 | |
end | |
end | |
document dump_flatview | |
Dump a FlatView: dump_flatview ADDRESS | |
Example: | |
dump_memory_region 0x555556675be0 | |
end | |
define dump_address_spaces | |
set $as = address_spaces.tqh_first | |
while $as | |
printf "AddressSpace : %s(%p)\n", $as->name, $as | |
if $arg0 == 1 && $as->root | |
__dump_memory_regions $as->root 0 | |
else | |
printf " Root MR : %p\n", $as->root | |
printf " FlatView : %p\n", $as->current_map | |
end | |
set $as = $as->address_spaces_link.tqe_next | |
end | |
end | |
document dump_address_spaces | |
Dump a AddressSpace: dump_address_spaces 0|1 | |
Example: | |
dump_address_spaces 0 | |
dump_address_spaces 1 | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment