Introduce class completion_tracker & rewrite completion<->readline interaction
[deliverable/binutils-gdb.git] / gdb / corefile.c
1 /* Core dump and executable file functions above target vector, for GDB.
2
3 Copyright (C) 1986-2017 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "defs.h"
21 #include <signal.h>
22 #include <fcntl.h>
23 #include "inferior.h"
24 #include "symtab.h"
25 #include "command.h"
26 #include "gdbcmd.h"
27 #include "bfd.h"
28 #include "target.h"
29 #include "gdbcore.h"
30 #include "dis-asm.h"
31 #include <sys/stat.h>
32 #include "completer.h"
33 #include "observer.h"
34 #include "cli/cli-utils.h"
35
36 /* Local function declarations. */
37
38 extern void _initialize_core (void);
39
40 /* You can have any number of hooks for `exec_file_command' command to
41 call. If there's only one hook, it is set in exec_file_display
42 hook. If there are two or more hooks, they are set in
43 exec_file_extra_hooks[], and deprecated_exec_file_display_hook is
44 set to a function that calls all of them. This extra complexity is
45 needed to preserve compatibility with old code that assumed that
46 only one hook could be set, and which called
47 deprecated_exec_file_display_hook directly. */
48
49 typedef void (*hook_type) (const char *);
50
51 hook_type deprecated_exec_file_display_hook; /* The original hook. */
52 static hook_type *exec_file_extra_hooks; /* Array of additional
53 hooks. */
54 static int exec_file_hook_count = 0; /* Size of array. */
55
56 /* Binary file diddling handle for the core file. */
57
58 bfd *core_bfd = NULL;
59
60 /* corelow.c target. It is never NULL after GDB initialization. */
61
62 struct target_ops *core_target;
63 \f
64
65 /* Backward compatability with old way of specifying core files. */
66
67 void
68 core_file_command (char *filename, int from_tty)
69 {
70 dont_repeat (); /* Either way, seems bogus. */
71
72 gdb_assert (core_target != NULL);
73
74 if (!filename)
75 (core_target->to_detach) (core_target, filename, from_tty);
76 else
77 (core_target->to_open) (filename, from_tty);
78 }
79 \f
80
81 /* If there are two or more functions that wish to hook into
82 exec_file_command, this function will call all of the hook
83 functions. */
84
85 static void
86 call_extra_exec_file_hooks (const char *filename)
87 {
88 int i;
89
90 for (i = 0; i < exec_file_hook_count; i++)
91 (*exec_file_extra_hooks[i]) (filename);
92 }
93
94 /* Call this to specify the hook for exec_file_command to call back.
95 This is called from the x-window display code. */
96
97 void
98 specify_exec_file_hook (void (*hook) (const char *))
99 {
100 hook_type *new_array;
101
102 if (deprecated_exec_file_display_hook != NULL)
103 {
104 /* There's already a hook installed. Arrange to have both it
105 and the subsequent hooks called. */
106 if (exec_file_hook_count == 0)
107 {
108 /* If this is the first extra hook, initialize the hook
109 array. */
110 exec_file_extra_hooks = XNEW (hook_type);
111 exec_file_extra_hooks[0] = deprecated_exec_file_display_hook;
112 deprecated_exec_file_display_hook = call_extra_exec_file_hooks;
113 exec_file_hook_count = 1;
114 }
115
116 /* Grow the hook array by one and add the new hook to the end.
117 Yes, it's inefficient to grow it by one each time but since
118 this is hardly ever called it's not a big deal. */
119 exec_file_hook_count++;
120 new_array = (hook_type *)
121 xrealloc (exec_file_extra_hooks,
122 exec_file_hook_count * sizeof (hook_type));
123 exec_file_extra_hooks = new_array;
124 exec_file_extra_hooks[exec_file_hook_count - 1] = hook;
125 }
126 else
127 deprecated_exec_file_display_hook = hook;
128 }
129
130 void
131 reopen_exec_file (void)
132 {
133 char *filename;
134 int res;
135 struct stat st;
136 struct cleanup *cleanups;
137
138 /* Don't do anything if there isn't an exec file. */
139 if (exec_bfd == NULL)
140 return;
141
142 /* If the timestamp of the exec file has changed, reopen it. */
143 filename = xstrdup (bfd_get_filename (exec_bfd));
144 cleanups = make_cleanup (xfree, filename);
145 res = stat (filename, &st);
146
147 if (res == 0 && exec_bfd_mtime && exec_bfd_mtime != st.st_mtime)
148 exec_file_attach (filename, 0);
149 else
150 /* If we accessed the file since last opening it, close it now;
151 this stops GDB from holding the executable open after it
152 exits. */
153 bfd_cache_close_all ();
154
155 do_cleanups (cleanups);
156 }
157 \f
158 /* If we have both a core file and an exec file,
159 print a warning if they don't go together. */
160
161 void
162 validate_files (void)
163 {
164 if (exec_bfd && core_bfd)
165 {
166 if (!core_file_matches_executable_p (core_bfd, exec_bfd))
167 warning (_("core file may not match specified executable file."));
168 else if (bfd_get_mtime (exec_bfd) > bfd_get_mtime (core_bfd))
169 warning (_("exec file is newer than core file."));
170 }
171 }
172
173 /* See common/common-inferior.h. */
174
175 char *
176 get_exec_file (int err)
177 {
178 if (exec_filename)
179 return exec_filename;
180 if (!err)
181 return NULL;
182
183 error (_("No executable file specified.\n\
184 Use the \"file\" or \"exec-file\" command."));
185 return NULL;
186 }
187 \f
188
189 char *
190 memory_error_message (enum target_xfer_status err,
191 struct gdbarch *gdbarch, CORE_ADDR memaddr)
192 {
193 switch (err)
194 {
195 case TARGET_XFER_E_IO:
196 /* Actually, address between memaddr and memaddr + len was out of
197 bounds. */
198 return xstrprintf (_("Cannot access memory at address %s"),
199 paddress (gdbarch, memaddr));
200 case TARGET_XFER_UNAVAILABLE:
201 return xstrprintf (_("Memory at address %s unavailable."),
202 paddress (gdbarch, memaddr));
203 default:
204 internal_error (__FILE__, __LINE__,
205 "unhandled target_xfer_status: %s (%s)",
206 target_xfer_status_to_string (err),
207 plongest (err));
208 }
209 }
210
211 /* Report a memory error by throwing a suitable exception. */
212
213 void
214 memory_error (enum target_xfer_status err, CORE_ADDR memaddr)
215 {
216 char *str;
217 enum errors exception = GDB_NO_ERROR;
218
219 /* Build error string. */
220 str = memory_error_message (err, target_gdbarch (), memaddr);
221 make_cleanup (xfree, str);
222
223 /* Choose the right error to throw. */
224 switch (err)
225 {
226 case TARGET_XFER_E_IO:
227 exception = MEMORY_ERROR;
228 break;
229 case TARGET_XFER_UNAVAILABLE:
230 exception = NOT_AVAILABLE_ERROR;
231 break;
232 }
233
234 /* Throw it. */
235 throw_error (exception, ("%s"), str);
236 }
237
238 /* Helper function. */
239
240 static void
241 read_memory_object (enum target_object object, CORE_ADDR memaddr,
242 gdb_byte *myaddr, ssize_t len)
243 {
244 ULONGEST xfered = 0;
245
246 while (xfered < len)
247 {
248 enum target_xfer_status status;
249 ULONGEST xfered_len;
250
251 status = target_xfer_partial (current_target.beneath,
252 object, NULL,
253 myaddr + xfered, NULL,
254 memaddr + xfered, len - xfered,
255 &xfered_len);
256
257 if (status != TARGET_XFER_OK)
258 memory_error (status == TARGET_XFER_EOF ? TARGET_XFER_E_IO : status,
259 memaddr + xfered);
260
261 xfered += xfered_len;
262 QUIT;
263 }
264 }
265
266 /* Same as target_read_memory, but report an error if can't read. */
267
268 void
269 read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
270 {
271 read_memory_object (TARGET_OBJECT_MEMORY, memaddr, myaddr, len);
272 }
273
274 /* Same as target_read_stack, but report an error if can't read. */
275
276 void
277 read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
278 {
279 read_memory_object (TARGET_OBJECT_STACK_MEMORY, memaddr, myaddr, len);
280 }
281
282 /* Same as target_read_code, but report an error if can't read. */
283
284 void
285 read_code (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
286 {
287 read_memory_object (TARGET_OBJECT_CODE_MEMORY, memaddr, myaddr, len);
288 }
289
290 /* Read memory at MEMADDR of length LEN and put the contents in
291 RETURN_VALUE. Return 0 if MEMADDR couldn't be read and non-zero
292 if successful. */
293
294 int
295 safe_read_memory_integer (CORE_ADDR memaddr, int len,
296 enum bfd_endian byte_order,
297 LONGEST *return_value)
298 {
299 gdb_byte buf[sizeof (LONGEST)];
300
301 if (target_read_memory (memaddr, buf, len))
302 return 0;
303
304 *return_value = extract_signed_integer (buf, len, byte_order);
305 return 1;
306 }
307
308 /* Read memory at MEMADDR of length LEN and put the contents in
309 RETURN_VALUE. Return 0 if MEMADDR couldn't be read and non-zero
310 if successful. */
311
312 int
313 safe_read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
314 enum bfd_endian byte_order,
315 ULONGEST *return_value)
316 {
317 gdb_byte buf[sizeof (ULONGEST)];
318
319 if (target_read_memory (memaddr, buf, len))
320 return 0;
321
322 *return_value = extract_unsigned_integer (buf, len, byte_order);
323 return 1;
324 }
325
326 LONGEST
327 read_memory_integer (CORE_ADDR memaddr, int len,
328 enum bfd_endian byte_order)
329 {
330 gdb_byte buf[sizeof (LONGEST)];
331
332 read_memory (memaddr, buf, len);
333 return extract_signed_integer (buf, len, byte_order);
334 }
335
336 ULONGEST
337 read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
338 enum bfd_endian byte_order)
339 {
340 gdb_byte buf[sizeof (ULONGEST)];
341
342 read_memory (memaddr, buf, len);
343 return extract_unsigned_integer (buf, len, byte_order);
344 }
345
346 LONGEST
347 read_code_integer (CORE_ADDR memaddr, int len,
348 enum bfd_endian byte_order)
349 {
350 gdb_byte buf[sizeof (LONGEST)];
351
352 read_code (memaddr, buf, len);
353 return extract_signed_integer (buf, len, byte_order);
354 }
355
356 ULONGEST
357 read_code_unsigned_integer (CORE_ADDR memaddr, int len,
358 enum bfd_endian byte_order)
359 {
360 gdb_byte buf[sizeof (ULONGEST)];
361
362 read_code (memaddr, buf, len);
363 return extract_unsigned_integer (buf, len, byte_order);
364 }
365
366 void
367 read_memory_string (CORE_ADDR memaddr, char *buffer, int max_len)
368 {
369 char *cp;
370 int i;
371 int cnt;
372
373 cp = buffer;
374 while (1)
375 {
376 if (cp - buffer >= max_len)
377 {
378 buffer[max_len - 1] = '\0';
379 break;
380 }
381 cnt = max_len - (cp - buffer);
382 if (cnt > 8)
383 cnt = 8;
384 read_memory (memaddr + (int) (cp - buffer), (gdb_byte *) cp, cnt);
385 for (i = 0; i < cnt && *cp; i++, cp++)
386 ; /* null body */
387
388 if (i < cnt && !*cp)
389 break;
390 }
391 }
392
393 CORE_ADDR
394 read_memory_typed_address (CORE_ADDR addr, struct type *type)
395 {
396 gdb_byte *buf = (gdb_byte *) alloca (TYPE_LENGTH (type));
397
398 read_memory (addr, buf, TYPE_LENGTH (type));
399 return extract_typed_address (buf, type);
400 }
401
402 /* See gdbcore.h. */
403
404 void
405 write_memory (CORE_ADDR memaddr,
406 const bfd_byte *myaddr, ssize_t len)
407 {
408 int status;
409
410 status = target_write_memory (memaddr, myaddr, len);
411 if (status != 0)
412 memory_error (TARGET_XFER_E_IO, memaddr);
413 }
414
415 /* Same as write_memory, but notify 'memory_changed' observers. */
416
417 void
418 write_memory_with_notification (CORE_ADDR memaddr, const bfd_byte *myaddr,
419 ssize_t len)
420 {
421 write_memory (memaddr, myaddr, len);
422 observer_notify_memory_changed (current_inferior (), memaddr, len, myaddr);
423 }
424
425 /* Store VALUE at ADDR in the inferior as a LEN-byte unsigned
426 integer. */
427 void
428 write_memory_unsigned_integer (CORE_ADDR addr, int len,
429 enum bfd_endian byte_order,
430 ULONGEST value)
431 {
432 gdb_byte *buf = (gdb_byte *) alloca (len);
433
434 store_unsigned_integer (buf, len, byte_order, value);
435 write_memory (addr, buf, len);
436 }
437
438 /* Store VALUE at ADDR in the inferior as a LEN-byte signed
439 integer. */
440 void
441 write_memory_signed_integer (CORE_ADDR addr, int len,
442 enum bfd_endian byte_order,
443 LONGEST value)
444 {
445 gdb_byte *buf = (gdb_byte *) alloca (len);
446
447 store_signed_integer (buf, len, byte_order, value);
448 write_memory (addr, buf, len);
449 }
450 \f
451 /* The current default bfd target. Points to storage allocated for
452 gnutarget_string. */
453 char *gnutarget;
454
455 /* Same thing, except it is "auto" not NULL for the default case. */
456 static char *gnutarget_string;
457 static void
458 show_gnutarget_string (struct ui_file *file, int from_tty,
459 struct cmd_list_element *c,
460 const char *value)
461 {
462 fprintf_filtered (file,
463 _("The current BFD target is \"%s\".\n"), value);
464 }
465
466 static void set_gnutarget_command (char *, int,
467 struct cmd_list_element *);
468
469 static void
470 set_gnutarget_command (char *ignore, int from_tty,
471 struct cmd_list_element *c)
472 {
473 char *gend = gnutarget_string + strlen (gnutarget_string);
474
475 gend = remove_trailing_whitespace (gnutarget_string, gend);
476 *gend = '\0';
477
478 if (strcmp (gnutarget_string, "auto") == 0)
479 gnutarget = NULL;
480 else
481 gnutarget = gnutarget_string;
482 }
483
484 /* A completion function for "set gnutarget". */
485
486 static void
487 complete_set_gnutarget (struct cmd_list_element *cmd,
488 completion_tracker &tracker,
489 const char *text, const char *word)
490 {
491 static const char **bfd_targets;
492
493 if (bfd_targets == NULL)
494 {
495 int last;
496
497 bfd_targets = bfd_target_list ();
498 for (last = 0; bfd_targets[last] != NULL; ++last)
499 ;
500
501 bfd_targets = XRESIZEVEC (const char *, bfd_targets, last + 2);
502 bfd_targets[last] = "auto";
503 bfd_targets[last + 1] = NULL;
504 }
505
506 complete_on_enum (tracker, bfd_targets, text, word);
507 }
508
509 /* Set the gnutarget. */
510 void
511 set_gnutarget (const char *newtarget)
512 {
513 if (gnutarget_string != NULL)
514 xfree (gnutarget_string);
515 gnutarget_string = xstrdup (newtarget);
516 set_gnutarget_command (NULL, 0, NULL);
517 }
518
519 void
520 _initialize_core (void)
521 {
522 struct cmd_list_element *c;
523
524 c = add_cmd ("core-file", class_files, core_file_command, _("\
525 Use FILE as core dump for examining memory and registers.\n\
526 No arg means have no core file. This command has been superseded by the\n\
527 `target core' and `detach' commands."), &cmdlist);
528 set_cmd_completer (c, filename_completer);
529
530
531 c = add_setshow_string_noescape_cmd ("gnutarget", class_files,
532 &gnutarget_string, _("\
533 Set the current BFD target."), _("\
534 Show the current BFD target."), _("\
535 Use `set gnutarget auto' to specify automatic detection."),
536 set_gnutarget_command,
537 show_gnutarget_string,
538 &setlist, &showlist);
539 set_cmd_completer (c, complete_set_gnutarget);
540
541 add_alias_cmd ("g", "gnutarget", class_files, 1, &setlist);
542
543 if (getenv ("GNUTARGET"))
544 set_gnutarget (getenv ("GNUTARGET"));
545 else
546 set_gnutarget ("auto");
547 }
This page took 0.042509 seconds and 5 git commands to generate.