'Get virtual memory mapping range of an address
Args:
- address: target address (Int)
- maps: only find in provided maps (List)
Returns:
- tuple of virtual memory info (start, end, perm, mapname)'

@memoized
def get_vmrange(self, address, maps=None):

    if (address is None):
        return None
    if (maps is None):
        maps = self.get_vmmap()
    if maps:
        for (start, end, perm, mapname) in maps:
            if ((start <= address) and (end > address)):
                return (start, end, perm, mapname)
    else:
        try:
            gdb.selected_inferior().read_memory(address, 1)
            start = (address & 18446744073709547520L)
            end = (start + 4096)
            return (start, end, 'rwx', 'unknown')
        except:
            return None
