28#include "gdbsupport/byte-vector.h"
33put_bits (uint64_t data, gdb::byte_vector &buf,
int bits, bfd_boolean big_p)
38 gdb_assert (
bits % 8 == 0);
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;
55static gdb::byte_vector
57 CORE_ADDR *start_addrp, ULONGEST *search_space_lenp,
62 ULONGEST max_count = ~(ULONGEST) 0;
64 gdb::byte_vector pattern_buf;
66 ULONGEST search_space_len;
71 error (_(
"Missing search parameters."));
80 while (*s !=
'\0' && *s !=
'/' && !isspace (*s))
99 error (_(
"Invalid size granularity."));
128 error (_(
"Invalid length."));
130 if (len > CORE_ADDR_MAX
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);
188 const gdb_byte *contents = v->
contents ().data ();
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;
218 ULONGEST max_count = 0;
219 CORE_ADDR start_addr = 0;
220 ULONGEST search_space_len = 0;
222 unsigned int found_count;
223 CORE_ADDR last_found_addr;
235 while (search_space_len >= pattern_buf.size ()
236 && found_count < max_count)
239 ULONGEST next_iter_incr;
240 CORE_ADDR found_addr;
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)
279 gdb_printf (
"%d pattern%s found.\n", found_count,
280 found_count > 1 ?
"s" :
"");
288Search memory for a sequence of bytes.\n\
290[/SIZE-CHAR] [/MAX-COUNT] START-ADDRESS, END-ADDRESS, EXPR1 [, EXPR2 ...]\n\
291find [/SIZE-CHAR] [/MAX-COUNT] START-ADDRESS, +LENGTH, EXPR1 [, EXPR2 ...]\n\
292SIZE-CHAR is one of b,h,w,g for 8,16,32,64 bit values respectively,\n\
293and if not specified the size is taken from the type of the expression\n\
294in the current language.\n\
295The two-address form specifies an inclusive range.\n\
296Note that this means for example that in the case of C-like languages\n\
297a search for an untyped 0x42 will search for \"(int) 0x42\"\n\
298which is typically four bytes, and a search for a string \"hello\" will\n\
299include the trailing '\\0'. The null terminator can be removed from\n\
300searching by using casts, e.g.: {char[5]}\"hello\".\n\
302The address of the last match is stored as the value of \"$_\".\n\
303Convenience variable \"$numfound\" is set to the number of matches."),
#define bits(obj, st, fn)
struct gdbarch * get_current_arch(void)
struct cmd_list_element * cmdlist
struct cmd_list_element * add_cmd(const char *name, enum command_class theclass, const char *doc, struct cmd_list_element **list)
void print_address(struct gdbarch *, CORE_ADDR, struct ui_file *)
struct value * parse_to_comma_and_eval(const char **expp)
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)
static void put_bits(uint64_t data, gdb::byte_vector &buf, int bits, bfd_boolean big_p)
void _initialize_mem_search()
static void find_command(const char *args, int from_tty)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
const struct builtin_type * builtin_type(struct gdbarch *gdbarch)
struct type * builtin_data_ptr
gdb::array_view< const gdb_byte > contents()
struct type * type() const
int target_search_memory(CORE_ADDR start_addr, ULONGEST search_space_len, const gdb_byte *pattern, ULONGEST pattern_len, CORE_ADDR *found_addrp)
void gdb_printf(struct ui_file *stream, const char *format,...)
CORE_ADDR value_as_address(struct value *val)
void set_internalvar(struct internalvar *var, struct value *val)
struct internalvar * lookup_internalvar(const char *name)
LONGEST value_as_long(struct value *val)
void set_internalvar_integer(struct internalvar *var, LONGEST l)
struct value * value_from_pointer(struct type *type, CORE_ADDR addr)