Skip to content

Instantly share code, notes, and snippets.

@RichardWeiYang
Created January 4, 2019 20:38
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save RichardWeiYang/123ce27f686165dca9a27278384d1081 to your computer and use it in GitHub Desktop.
Save RichardWeiYang/123ce27f686165dca9a27278384d1081 to your computer and use it in GitHub Desktop.
GDB script to explore Qemu address space
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