Return std::string from memory_error_message
[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 std::string
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 string_printf (_("Cannot access memory at address %s"),
199 paddress (gdbarch, memaddr));
200 case TARGET_XFER_UNAVAILABLE:
201 return string_printf (_("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 enum errors exception = GDB_NO_ERROR;
217
218 /* Build error string. */
219 std::string str = memory_error_message (err, target_gdbarch (), memaddr);
220
221 /* Choose the right error to throw. */
222 switch (err)
223 {
224 case TARGET_XFER_E_IO:
225 exception = MEMORY_ERROR;
226 break;
227 case TARGET_XFER_UNAVAILABLE:
228 exception = NOT_AVAILABLE_ERROR;
229 break;
230 }
231
232 /* Throw it. */
233 throw_error (exception, ("%s"), str.c_str ());
234 }
235
236 /* Helper function. */
237
238 static void
239 read_memory_object (enum target_object object, CORE_ADDR memaddr,
240 gdb_byte *myaddr, ssize_t len)
241 {
242 ULONGEST xfered = 0;
243
244 while (xfered < len)
245 {
246 enum target_xfer_status status;
247 ULONGEST xfered_len;
248
249 status = target_xfer_partial (current_target.beneath,
250 object, NULL,
251 myaddr + xfered, NULL,
252 memaddr + xfered, len - xfered,
253 &xfered_len);
254
255 if (status != TARGET_XFER_OK)
256 memory_error (status == TARGET_XFER_EOF ? TARGET_XFER_E_IO : status,
257 memaddr + xfered);
258
259 xfered += xfered_len;
260 QUIT;
261 }
262 }
263
264 /* Same as target_read_memory, but report an error if can't read. */
265
266 void
267 read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
268 {
269 read_memory_object (TARGET_OBJECT_MEMORY, memaddr, myaddr, len);
270 }
271
272 /* Same as target_read_stack, but report an error if can't read. */
273
274 void
275 read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
276 {
277 read_memory_object (TARGET_OBJECT_STACK_MEMORY, memaddr, myaddr, len);
278 }
279
280 /* Same as target_read_code, but report an error if can't read. */
281
282 void
283 read_code (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
284 {
285 read_memory_object (TARGET_OBJECT_CODE_MEMORY, memaddr, myaddr, len);
286 }
287
288 /* Read memory at MEMADDR of length LEN and put the contents in
289 RETURN_VALUE. Return 0 if MEMADDR couldn't be read and non-zero
290 if successful. */
291
292 int
293 safe_read_memory_integer (CORE_ADDR memaddr, int len,
294 enum bfd_endian byte_order,
295 LONGEST *return_value)
296 {
297 gdb_byte buf[sizeof (LONGEST)];
298
299 if (target_read_memory (memaddr, buf, len))
300 return 0;
301
302 *return_value = extract_signed_integer (buf, len, byte_order);
303 return 1;
304 }
305
306 /* Read memory at MEMADDR of length LEN and put the contents in
307 RETURN_VALUE. Return 0 if MEMADDR couldn't be read and non-zero
308 if successful. */
309
310 int
311 safe_read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
312 enum bfd_endian byte_order,
313 ULONGEST *return_value)
314 {
315 gdb_byte buf[sizeof (ULONGEST)];
316
317 if (target_read_memory (memaddr, buf, len))
318 return 0;
319
320 *return_value = extract_unsigned_integer (buf, len, byte_order);
321 return 1;
322 }
323
324 LONGEST
325 read_memory_integer (CORE_ADDR memaddr, int len,
326 enum bfd_endian byte_order)
327 {
328 gdb_byte buf[sizeof (LONGEST)];
329
330 read_memory (memaddr, buf, len);
331 return extract_signed_integer (buf, len, byte_order);
332 }
333
334 ULONGEST
335 read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
336 enum bfd_endian byte_order)
337 {
338 gdb_byte buf[sizeof (ULONGEST)];
339
340 read_memory (memaddr, buf, len);
341 return extract_unsigned_integer (buf, len, byte_order);
342 }
343
344 LONGEST
345 read_code_integer (CORE_ADDR memaddr, int len,
346 enum bfd_endian byte_order)
347 {
348 gdb_byte buf[sizeof (LONGEST)];
349
350 read_code (memaddr, buf, len);
351 return extract_signed_integer (buf, len, byte_order);
352 }
353
354 ULONGEST
355 read_code_unsigned_integer (CORE_ADDR memaddr, int len,
356 enum bfd_endian byte_order)
357 {
358 gdb_byte buf[sizeof (ULONGEST)];
359
360 read_code (memaddr, buf, len);
361 return extract_unsigned_integer (buf, len, byte_order);
362 }
363
364 void
365 read_memory_string (CORE_ADDR memaddr, char *buffer, int max_len)
366 {
367 char *cp;
368 int i;
369 int cnt;
370
371 cp = buffer;
372 while (1)
373 {
374 if (cp - buffer >= max_len)
375 {
376 buffer[max_len - 1] = '\0';
377 break;
378 }
379 cnt = max_len - (cp - buffer);
380 if (cnt > 8)
381 cnt = 8;
382 read_memory (memaddr + (int) (cp - buffer), (gdb_byte *) cp, cnt);
383 for (i = 0; i < cnt && *cp; i++, cp++)
384 ; /* null body */
385
386 if (i < cnt && !*cp)
387 break;
388 }
389 }
390
391 CORE_ADDR
392 read_memory_typed_address (CORE_ADDR addr, struct type *type)
393 {
394 gdb_byte *buf = (gdb_byte *) alloca (TYPE_LENGTH (type));
395
396 read_memory (addr, buf, TYPE_LENGTH (type));
397 return extract_typed_address (buf, type);
398 }
399
400 /* See gdbcore.h. */
401
402 void
403 write_memory (CORE_ADDR memaddr,
404 const bfd_byte *myaddr, ssize_t len)
405 {
406 int status;
407
408 status = target_write_memory (memaddr, myaddr, len);
409 if (status != 0)
410 memory_error (TARGET_XFER_E_IO, memaddr);
411 }
412
413 /* Same as write_memory, but notify 'memory_changed' observers. */
414
415 void
416 write_memory_with_notification (CORE_ADDR memaddr, const bfd_byte *myaddr,
417 ssize_t len)
418 {
419 write_memory (memaddr, myaddr, len);
420 observer_notify_memory_changed (current_inferior (), memaddr, len, myaddr);
421 }
422
423 /* Store VALUE at ADDR in the inferior as a LEN-byte unsigned
424 integer. */
425 void
426 write_memory_unsigned_integer (CORE_ADDR addr, int len,
427 enum bfd_endian byte_order,
428 ULONGEST value)
429 {
430 gdb_byte *buf = (gdb_byte *) alloca (len);
431
432 store_unsigned_integer (buf, len, byte_order, value);
433 write_memory (addr, buf, len);
434 }
435
436 /* Store VALUE at ADDR in the inferior as a LEN-byte signed
437 integer. */
438 void
439 write_memory_signed_integer (CORE_ADDR addr, int len,
440 enum bfd_endian byte_order,
441 LONGEST value)
442 {
443 gdb_byte *buf = (gdb_byte *) alloca (len);
444
445 store_signed_integer (buf, len, byte_order, value);
446 write_memory (addr, buf, len);
447 }
448 \f
449 /* The current default bfd target. Points to storage allocated for
450 gnutarget_string. */
451 char *gnutarget;
452
453 /* Same thing, except it is "auto" not NULL for the default case. */
454 static char *gnutarget_string;
455 static void
456 show_gnutarget_string (struct ui_file *file, int from_tty,
457 struct cmd_list_element *c,
458 const char *value)
459 {
460 fprintf_filtered (file,
461 _("The current BFD target is \"%s\".\n"), value);
462 }
463
464 static void set_gnutarget_command (char *, int,
465 struct cmd_list_element *);
466
467 static void
468 set_gnutarget_command (char *ignore, int from_tty,
469 struct cmd_list_element *c)
470 {
471 char *gend = gnutarget_string + strlen (gnutarget_string);
472
473 gend = remove_trailing_whitespace (gnutarget_string, gend);
474 *gend = '\0';
475
476 if (strcmp (gnutarget_string, "auto") == 0)
477 gnutarget = NULL;
478 else
479 gnutarget = gnutarget_string;
480 }
481
482 /* A completion function for "set gnutarget". */
483
484 static void
485 complete_set_gnutarget (struct cmd_list_element *cmd,
486 completion_tracker &tracker,
487 const char *text, const char *word)
488 {
489 static const char **bfd_targets;
490
491 if (bfd_targets == NULL)
492 {
493 int last;
494
495 bfd_targets = bfd_target_list ();
496 for (last = 0; bfd_targets[last] != NULL; ++last)
497 ;
498
499 bfd_targets = XRESIZEVEC (const char *, bfd_targets, last + 2);
500 bfd_targets[last] = "auto";
501 bfd_targets[last + 1] = NULL;
502 }
503
504 complete_on_enum (tracker, bfd_targets, text, word);
505 }
506
507 /* Set the gnutarget. */
508 void
509 set_gnutarget (const char *newtarget)
510 {
511 if (gnutarget_string != NULL)
512 xfree (gnutarget_string);
513 gnutarget_string = xstrdup (newtarget);
514 set_gnutarget_command (NULL, 0, NULL);
515 }
516
517 void
518 _initialize_core (void)
519 {
520 struct cmd_list_element *c;
521
522 c = add_cmd ("core-file", class_files, core_file_command, _("\
523 Use FILE as core dump for examining memory and registers.\n\
524 No arg means have no core file. This command has been superseded by the\n\
525 `target core' and `detach' commands."), &cmdlist);
526 set_cmd_completer (c, filename_completer);
527
528
529 c = add_setshow_string_noescape_cmd ("gnutarget", class_files,
530 &gnutarget_string, _("\
531 Set the current BFD target."), _("\
532 Show the current BFD target."), _("\
533 Use `set gnutarget auto' to specify automatic detection."),
534 set_gnutarget_command,
535 show_gnutarget_string,
536 &setlist, &showlist);
537 set_cmd_completer (c, complete_set_gnutarget);
538
539 add_alias_cmd ("g", "gnutarget", class_files, 1, &setlist);
540
541 if (getenv ("GNUTARGET"))
542 set_gnutarget (getenv ("GNUTARGET"));
543 else
544 set_gnutarget ("auto");
545 }
This page took 0.040652 seconds and 4 git commands to generate.