39 for (i = 0; i < bytes; i++)
41 int index = big_p ? bytes - i - 1 : i;
43 buf[index] = data & 0xff;
64 #define INITIAL_PATTERN_BUF_SIZE 100
76 error (
_(
"Missing search parameters."));
78 pattern_buf =
xmalloc (pattern_buf_size);
79 pattern_buf_end = pattern_buf;
89 while (*s !=
'\0' && *s !=
'/' && !isspace (*s))
108 error (
_(
"Invalid size granularity."));
138 error (
_(
"Invalid length."));
141 || (start_addr + len - 1) < start_addr)
142 error (
_(
"Search space too large."));
143 search_space_len =
len;
151 if (start_addr > end_addr)
152 error (
_(
"Invalid search space, end precedes start."));
153 search_space_len = end_addr - start_addr + 1;
157 if (search_space_len == 0)
158 error (
_(
"Overflow in address range "
159 "computation, choose smaller range."));
180 pattern_buf_size_need = (pattern_buf_end - pattern_buf
182 if (pattern_buf_size_need > pattern_buf_size)
184 size_t current_offset = pattern_buf_end - pattern_buf;
186 pattern_buf_size = pattern_buf_size_need * 2;
187 pattern_buf =
xrealloc (pattern_buf, pattern_buf_size);
188 pattern_buf_end = pattern_buf + current_offset;
197 *pattern_buf_end++ = x;
200 put_bits (x, pattern_buf_end, 16, big_p);
201 pattern_buf_end +=
sizeof (int16_t);
204 put_bits (x, pattern_buf_end, 32, big_p);
205 pattern_buf_end +=
sizeof (int32_t);
208 put_bits (x, pattern_buf_end, 64, big_p);
209 pattern_buf_end +=
sizeof (int64_t);
224 if (pattern_buf_end == pattern_buf)
225 error (
_(
"Missing search pattern."));
227 pattern_len = pattern_buf_end - pattern_buf;
229 if (search_space_len < pattern_len)
230 error (
_(
"Search space too small to contain pattern."));
232 *max_countp = max_count;
233 *pattern_bufp = pattern_buf;
234 *pattern_lenp = pattern_len;
235 *start_addrp = start_addr;
236 *search_space_lenp = search_space_len;
256 unsigned int found_count;
261 &start_addr, &search_space_len, big_p);
270 while (search_space_len >= pattern_len
271 && found_count < max_count)
277 pattern_buf, pattern_len, &found_addr);
285 last_found_addr = found_addr;
288 next_iter_incr = (found_addr - start_addr) + 1;
291 if (search_space_len >= next_iter_incr)
292 search_space_len -= next_iter_incr;
294 search_space_len = 0;
295 start_addr += next_iter_incr;
309 if (found_count == 0)
313 found_count > 1 ?
"s" :
"");
325 Search memory for a sequence of bytes.\n\
327 [/size-char] [/max-count] start-address, end-address, expr1 [, expr2 ...]\n\
328 find [/size-char] [/max-count] start-address, +length, expr1 [, expr2 ...]\n\
329 size-char is one of b,h,w,g for 8,16,32,64 bit values respectively,\n\
330 and if not specified the size is taken from the type of the expression\n\
331 in the current language.\n\
332 Note that this means for example that in the case of C-like languages\n\
333 a search for an untyped 0x42 will search for \"(int) 0x42\"\n\
334 which is typically four bytes.\n\
336 The address of the last match is stored as the value of \"$_\".\n\
337 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)
struct ui_file * gdb_stdout
const struct builtin_type * builtin_type(struct gdbarch *gdbarch)
struct cmd_list_element * cmdlist
struct internalvar * lookup_internalvar(const char *name)
#define bits(obj, st, fn)
void printf_filtered(const char *format,...)
const gdb_byte * value_contents(struct value *value)
void initialize_file_ftype(void)
const char * skip_spaces_const(const char *chp)
struct cmd_list_element * add_cmd(const char *name, enum command_class theclass, cmd_cfunc_ftype *fun, const char *doc, struct cmd_list_element **list)
void free_current_contents(void *ptr)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
void set_internalvar(struct internalvar *var, struct value *val)
struct cleanup * make_cleanup(make_cleanup_ftype *function, void *arg)
struct gdbarch * get_current_arch(void)
struct value * parse_to_comma_and_eval(const char **expp)
PTR xrealloc(PTR ptr, size_t size)
struct value * value_from_pointer(struct type *type, CORE_ADDR addr)
void discard_cleanups(struct cleanup *old_chain)
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)
void set_internalvar_integer(struct internalvar *var, LONGEST l)
initialize_file_ftype _initialize_mem_search
unsigned long long ULONGEST
#define INITIAL_PATTERN_BUF_SIZE
struct type * value_type(const struct value *value)
CORE_ADDR value_as_address(struct value *val)
#define TYPE_LENGTH(thistype)
static void find_command(char *args, int from_tty)
void error(const char *fmt,...)
static void parse_find_args(char *args, ULONGEST *max_countp, gdb_byte **pattern_bufp, ULONGEST *pattern_lenp, CORE_ADDR *start_addrp, ULONGEST *search_space_lenp, bfd_boolean big_p)
static void put_bits(bfd_uint64_t data, gdb_byte *buf, int bits, bfd_boolean big_p)
void do_cleanups(struct cleanup *old_chain)
const ULONGEST const LONGEST len