41 size_t last = buf.size ();
42 buf.resize (last + bytes);
43 for (i = 0; i < bytes; i++)
45 int index = big_p ? bytes - i - 1 : i;
47 buf[last + index] = data & 0xff;
71 error (
_(
"Missing search parameters."));
80 while (*s !=
'\0' && *s !=
'/' && !isspace (*s))
99 error (
_(
"Invalid size granularity."));
128 error (
_(
"Invalid length."));
131 || (start_addr + len - 1) < start_addr)
132 error (
_(
"Search space too large."));
133 search_space_len = len;
141 if (start_addr > end_addr)
142 error (
_(
"Invalid search space, end precedes start."));
143 search_space_len = end_addr - start_addr + 1;
147 if (search_space_len == 0)
148 error (
_(
"Overflow in address range " 149 "computation, choose smaller range."));
173 pattern_buf.push_back (x);
176 put_bits (x, pattern_buf, 16, big_p);
179 put_bits (x, pattern_buf, 32, big_p);
182 put_bits (x, pattern_buf, 64, big_p);
189 pattern_buf.insert (pattern_buf.end (), contents,
198 if (pattern_buf.empty ())
199 error (
_(
"Missing search pattern."));
201 if (search_space_len < pattern_buf.size ())
202 error (
_(
"Search space too small to contain pattern."));
204 *max_countp = max_count;
205 *start_addrp = start_addr;
206 *search_space_lenp = search_space_len;
222 unsigned int found_count;
235 while (search_space_len >= pattern_buf.size ()
236 && found_count < max_count)
252 last_found_addr = found_addr;
255 next_iter_incr = (found_addr - start_addr) + 1;
258 if (search_space_len >= next_iter_incr)
259 search_space_len -= next_iter_incr;
261 search_space_len = 0;
262 start_addr += next_iter_incr;
276 if (found_count == 0)
280 found_count > 1 ?
"s" :
"");
287 Search memory for a sequence of bytes.\n\ 289 [/size-char] [/max-count] start-address, end-address, expr1 [, expr2 ...]\n\ 290 find [/size-char] [/max-count] start-address, +length, expr1 [, expr2 ...]\n\ 291 size-char is one of b,h,w,g for 8,16,32,64 bit values respectively,\n\ 292 and if not specified the size is taken from the type of the expression\n\ 293 in the current language.\n\ 294 Note that this means for example that in the case of C-like languages\n\ 295 a search for an untyped 0x42 will search for \"(int) 0x42\"\n\ 296 which is typically four bytes, and a search for a string \"hello\" will\n\ 297 include the trailing '\\0'. The null terminator can be removed from\n\ 298 searching by using casts, e.g.: {char[5]}\"hello\".\n\ 300 The address of the last match is stored as the value of \"$_\".\n\ 301 Convenience variable \"$numfound\" is set to the number of matches."),
void print_address(struct gdbarch *, CORE_ADDR, struct ui_file *)
LONGEST value_as_long(struct value *val)
static gdb::byte_vector parse_find_args(const char *args, ULONGEST *max_countp, CORE_ADDR *start_addrp, ULONGEST *search_space_lenp, bfd_boolean big_p)
const struct builtin_type * builtin_type(struct gdbarch *gdbarch)
struct cmd_list_element * add_cmd(const char *name, enum command_class theclass, const char *doc, struct cmd_list_element **list)
struct cmd_list_element * cmdlist
struct internalvar * lookup_internalvar(const char *name)
char * skip_spaces(char *chp)
#define bits(obj, st, fn)
void printf_filtered(const char *format,...)
static void find_command(const char *args, int from_tty)
const gdb_byte * value_contents(struct value *value)
void _initialize_mem_search(void)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
void set_internalvar(struct internalvar *var, struct value *val)
struct gdbarch * get_current_arch(void)
struct value * parse_to_comma_and_eval(const char **expp)
struct value * value_from_pointer(struct type *type, CORE_ADDR addr)
struct type * builtin_data_ptr
int target_search_memory(CORE_ADDR start_addr, ULONGEST search_space_len, const gdb_byte *pattern, ULONGEST pattern_len, CORE_ADDR *found_addrp)
static void put_bits(bfd_uint64_t data, gdb::byte_vector &buf, int bits, bfd_boolean big_p)
void set_internalvar_integer(struct internalvar *var, LONGEST l)
gdb::def_vector< gdb_byte > byte_vector
unsigned long long ULONGEST
struct type * value_type(const struct value *value)
CORE_ADDR value_as_address(struct value *val)
#define TYPE_LENGTH(thistype)
void error(const char *fmt,...)