def base_len_of(arg, len = DUMP_BYTES)
      segments = @info.call(:segments) || {}
      segments = segments.each_with_object({}) do |(k, seg), memo|
        memo[k] = seg.base
      end
      base = case arg
             when Integer then arg
             when Symbol then segments[arg]
             when String then Helper.evaluate(arg, store: segments)
             end
      raise ArgumentError, "Invalid base: #{arg.inspect}" unless base.is_a?(Integer) # invalid usage

      [base, len]
    end
def base_len_of(arg, len = DUMP_BYTES)
      segments = @info.call(:segments) || {}
      segments = segments.each_with_object({}) do |(k, seg), memo|
        memo[k] = seg.base
      end
      base = case arg
             when Integer then arg
             when Symbol then segments[arg]
             when String then Helper.evaluate(arg, store: segments)
             end
      raise ArgumentError, "Invalid base: #{arg.inspect}" unless base.is_a?(Integer) # invalid usage

      [base, len]
    end
Get the base address and length.

 +@info+ will be used for getting the segment base,
 so we can support use symbol as base address.
 @param [Integer, Symbol, String] arg The base address, see examples.
 @param [Integer] len An integer.
 @example
   base_len_of(123, 321) #=> [123, 321]
   base_len_of(123) #=> [123, DUMP_BYTES]
   base_len_of(:heap, 10) #=> [0x603000, 10] # assume heap base @ 0x603000
   base_len_of('heap+0x30', 10) #=> [0x603030, 10]
   base_len_of('elf+0x3*2-1') #=> [0x400005, DUMP_BYTES]