2009-04-30 10:58:37 +08:00
|
|
|
/* Process record and replay target for GDB, the GNU debugger.
|
|
|
|
|
2012-01-04 16:17:56 +08:00
|
|
|
Copyright (C) 2008-2012 Free Software Foundation, Inc.
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
This file is part of GDB.
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
#include "defs.h"
|
|
|
|
#include "gdbcmd.h"
|
|
|
|
#include "regcache.h"
|
|
|
|
#include "gdbthread.h"
|
|
|
|
#include "event-top.h"
|
|
|
|
#include "exceptions.h"
|
2009-10-23 03:36:06 +08:00
|
|
|
#include "completer.h"
|
|
|
|
#include "arch-utils.h"
|
2009-10-23 03:32:11 +08:00
|
|
|
#include "gdbcore.h"
|
|
|
|
#include "exec.h"
|
2009-04-30 10:58:37 +08:00
|
|
|
#include "record.h"
|
2009-10-23 03:36:06 +08:00
|
|
|
#include "elf-bfd.h"
|
|
|
|
#include "gcore.h"
|
2011-05-27 02:11:33 +08:00
|
|
|
#include "event-loop.h"
|
|
|
|
#include "inf-loop.h"
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
#include <signal.h>
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* This module implements "target record", also known as "process
|
|
|
|
record and replay". This target sits on top of a "normal" target
|
|
|
|
(a target that "has execution"), and provides a record and replay
|
|
|
|
functionality, including reverse debugging.
|
|
|
|
|
|
|
|
Target record has two modes: recording, and replaying.
|
|
|
|
|
|
|
|
In record mode, we intercept the to_resume and to_wait methods.
|
|
|
|
Whenever gdb resumes the target, we run the target in single step
|
|
|
|
mode, and we build up an execution log in which, for each executed
|
|
|
|
instruction, we record all changes in memory and register state.
|
|
|
|
This is invisible to the user, to whom it just looks like an
|
|
|
|
ordinary debugging session (except for performance degredation).
|
|
|
|
|
|
|
|
In replay mode, instead of actually letting the inferior run as a
|
|
|
|
process, we simulate its execution by playing back the recorded
|
|
|
|
execution log. For each instruction in the log, we simulate the
|
|
|
|
instruction's side effects by duplicating the changes that it would
|
|
|
|
have made on memory and registers. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
#define DEFAULT_RECORD_INSN_MAX_NUM 200000
|
|
|
|
|
|
|
|
#define RECORD_IS_REPLAY \
|
|
|
|
(record_list->next || execution_direction == EXEC_REVERSE)
|
|
|
|
|
2009-10-23 03:36:06 +08:00
|
|
|
#define RECORD_FILE_MAGIC netorder32(0x20091016)
|
|
|
|
|
2009-09-08 08:50:42 +08:00
|
|
|
/* These are the core structs of the process record functionality.
|
2009-04-30 10:58:37 +08:00
|
|
|
|
2009-09-08 08:50:42 +08:00
|
|
|
A record_entry is a record of the value change of a register
|
2009-04-30 10:58:37 +08:00
|
|
|
("record_reg") or a part of memory ("record_mem"). And each
|
2009-09-08 08:50:42 +08:00
|
|
|
instruction must have a struct record_entry ("record_end") that
|
|
|
|
indicates that this is the last struct record_entry of this
|
|
|
|
instruction.
|
2009-04-30 10:58:37 +08:00
|
|
|
|
2009-09-08 08:50:42 +08:00
|
|
|
Each struct record_entry is linked to "record_list" by "prev" and
|
|
|
|
"next" pointers. */
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
struct record_mem_entry
|
|
|
|
{
|
|
|
|
CORE_ADDR addr;
|
|
|
|
int len;
|
2009-08-05 02:19:52 +08:00
|
|
|
/* Set this flag if target memory for this entry
|
|
|
|
can no longer be accessed. */
|
|
|
|
int mem_entry_not_accessible;
|
2009-10-19 00:10:42 +08:00
|
|
|
union
|
|
|
|
{
|
|
|
|
gdb_byte *ptr;
|
|
|
|
gdb_byte buf[sizeof (gdb_byte *)];
|
|
|
|
} u;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct record_reg_entry
|
|
|
|
{
|
|
|
|
unsigned short num;
|
|
|
|
unsigned short len;
|
|
|
|
union
|
|
|
|
{
|
|
|
|
gdb_byte *ptr;
|
|
|
|
gdb_byte buf[2 * sizeof (gdb_byte *)];
|
|
|
|
} u;
|
2009-04-30 10:58:37 +08:00
|
|
|
};
|
|
|
|
|
2009-09-21 13:54:09 +08:00
|
|
|
struct record_end_entry
|
|
|
|
{
|
2012-05-25 00:39:15 +08:00
|
|
|
enum gdb_signal sigval;
|
2009-10-21 23:21:16 +08:00
|
|
|
ULONGEST insn_num;
|
2009-09-21 13:54:09 +08:00
|
|
|
};
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
enum record_type
|
|
|
|
{
|
|
|
|
record_end = 0,
|
|
|
|
record_reg,
|
|
|
|
record_mem
|
|
|
|
};
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* This is the data structure that makes up the execution log.
|
|
|
|
|
|
|
|
The execution log consists of a single linked list of entries
|
|
|
|
of type "struct record_entry". It is doubly linked so that it
|
|
|
|
can be traversed in either direction.
|
|
|
|
|
|
|
|
The start of the list is anchored by a struct called
|
|
|
|
"record_first". The pointer "record_list" either points to the
|
|
|
|
last entry that was added to the list (in record mode), or to the
|
|
|
|
next entry in the list that will be executed (in replay mode).
|
|
|
|
|
|
|
|
Each list element (struct record_entry), in addition to next and
|
|
|
|
prev pointers, consists of a union of three entry types: mem, reg,
|
|
|
|
and end. A field called "type" determines which entry type is
|
|
|
|
represented by a given list element.
|
|
|
|
|
|
|
|
Each instruction that is added to the execution log is represented
|
|
|
|
by a variable number of list elements ('entries'). The instruction
|
|
|
|
will have one "reg" entry for each register that is changed by
|
|
|
|
executing the instruction (including the PC in every case). It
|
|
|
|
will also have one "mem" entry for each memory change. Finally,
|
|
|
|
each instruction will have an "end" entry that separates it from
|
|
|
|
the changes associated with the next instruction. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
struct record_entry
|
|
|
|
{
|
|
|
|
struct record_entry *prev;
|
|
|
|
struct record_entry *next;
|
|
|
|
enum record_type type;
|
|
|
|
union
|
|
|
|
{
|
|
|
|
/* reg */
|
|
|
|
struct record_reg_entry reg;
|
|
|
|
/* mem */
|
|
|
|
struct record_mem_entry mem;
|
2009-09-21 13:54:09 +08:00
|
|
|
/* end */
|
|
|
|
struct record_end_entry end;
|
2009-04-30 10:58:37 +08:00
|
|
|
} u;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* This is the debug switch for process record. */
|
|
|
|
int record_debug = 0;
|
|
|
|
|
2010-06-22 10:15:46 +08:00
|
|
|
/* If true, query if PREC cannot record memory
|
|
|
|
change of next instruction. */
|
|
|
|
int record_memory_query = 0;
|
|
|
|
|
2009-10-23 03:32:11 +08:00
|
|
|
struct record_core_buf_entry
|
|
|
|
{
|
|
|
|
struct record_core_buf_entry *prev;
|
|
|
|
struct target_section *p;
|
|
|
|
bfd_byte *buf;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Record buf with core target. */
|
|
|
|
static gdb_byte *record_core_regbuf = NULL;
|
|
|
|
static struct target_section *record_core_start;
|
|
|
|
static struct target_section *record_core_end;
|
|
|
|
static struct record_core_buf_entry *record_core_buf_list = NULL;
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* The following variables are used for managing the linked list that
|
|
|
|
represents the execution log.
|
|
|
|
|
|
|
|
record_first is the anchor that holds down the beginning of the list.
|
|
|
|
|
|
|
|
record_list serves two functions:
|
|
|
|
1) In record mode, it anchors the end of the list.
|
|
|
|
2) In replay mode, it traverses the list and points to
|
|
|
|
the next instruction that must be emulated.
|
|
|
|
|
|
|
|
record_arch_list_head and record_arch_list_tail are used to manage
|
|
|
|
a separate list, which is used to build up the change elements of
|
|
|
|
the currently executing instruction during record mode. When this
|
|
|
|
instruction has been completely annotated in the "arch list", it
|
|
|
|
will be appended to the main execution log. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static struct record_entry record_first;
|
|
|
|
static struct record_entry *record_list = &record_first;
|
|
|
|
static struct record_entry *record_arch_list_head = NULL;
|
|
|
|
static struct record_entry *record_arch_list_tail = NULL;
|
|
|
|
|
|
|
|
/* 1 ask user. 0 auto delete the last struct record_entry. */
|
|
|
|
static int record_stop_at_limit = 1;
|
2009-10-21 23:21:16 +08:00
|
|
|
/* Maximum allowed number of insns in execution log. */
|
2009-10-16 01:27:54 +08:00
|
|
|
static unsigned int record_insn_max_num = DEFAULT_RECORD_INSN_MAX_NUM;
|
2009-10-21 23:21:16 +08:00
|
|
|
/* Actual count of insns presently in execution log. */
|
2009-04-30 10:58:37 +08:00
|
|
|
static int record_insn_num = 0;
|
2009-10-21 23:21:16 +08:00
|
|
|
/* Count of insns logged so far (may be larger
|
|
|
|
than count of insns presently in execution log). */
|
|
|
|
static ULONGEST record_insn_count;
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
/* The target_ops of process record. */
|
|
|
|
static struct target_ops record_ops;
|
2009-10-23 03:32:11 +08:00
|
|
|
static struct target_ops record_core_ops;
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
/* The beneath function pointers. */
|
|
|
|
static struct target_ops *record_beneath_to_resume_ops;
|
|
|
|
static void (*record_beneath_to_resume) (struct target_ops *, ptid_t, int,
|
2012-05-25 00:39:15 +08:00
|
|
|
enum gdb_signal);
|
2009-04-30 10:58:37 +08:00
|
|
|
static struct target_ops *record_beneath_to_wait_ops;
|
|
|
|
static ptid_t (*record_beneath_to_wait) (struct target_ops *, ptid_t,
|
2009-05-21 23:48:42 +08:00
|
|
|
struct target_waitstatus *,
|
|
|
|
int);
|
2009-04-30 10:58:37 +08:00
|
|
|
static struct target_ops *record_beneath_to_store_registers_ops;
|
|
|
|
static void (*record_beneath_to_store_registers) (struct target_ops *,
|
|
|
|
struct regcache *,
|
|
|
|
int regno);
|
|
|
|
static struct target_ops *record_beneath_to_xfer_partial_ops;
|
|
|
|
static LONGEST (*record_beneath_to_xfer_partial) (struct target_ops *ops,
|
|
|
|
enum target_object object,
|
|
|
|
const char *annex,
|
|
|
|
gdb_byte *readbuf,
|
|
|
|
const gdb_byte *writebuf,
|
|
|
|
ULONGEST offset,
|
|
|
|
LONGEST len);
|
* breakpoint.h (struct breakpoint): New member GDBARCH.
* breakpoint.c: Include "arch-utils.h".
(set_raw_breakpoint_without_location): Add GDBARCH parameter.
Use it to set breakpoint architecture.
(set_raw_breakpoint): Add GDBARCH parameter.
(create_internal_breakpoint): Likewise.
(create_catchpoint): Likewise.
(create_fork_vfork_event_catchpoint): Likewise.
(create_breakpoint): Likewise.
(create_breakpoints): Likewise.
(break_command_really): Likewise.
(create_ada_exception_breakpoint): Likewise.
Update local callers to pass architecture:
(create_internal_breakpoint): Update.
(create_overlay_event_breakpoint): Update.
(create_longjmp_master_breakpoint): Update.
(create_thread_event_breakpoint): Update.
(create_solib_event_breakpoint): Update.
(create_catchpoint): Update.
(create_fork_vfork_event_catchpoint): Update.
(set_momentary_breakpoint): Update.
(clone_momentary_breakpoint): Update.
(create_breakpoint): Update.
(create_breakpoints): Update.
(break_command_really): Update.
(break_command_1): Update.
(set_breakpoint): Update.
(watch_command_1): Update.
(catch_fork_command_1): Update.
(catch_exec_commnd_1): Update.
(handle_gnu_v3_exceptions): Update.
(create_ada_exception_breakpoint): Update.
(catch_ada_exception_command): Update.
(catch_assert_command): Update.
(trace_command): Update.
* breakpoint.h (struct bp_location): New member GDBARCH.
* breakpoint.c (get_sal_arch): New function.
(set_raw_breakpoint): Set location architecture.
(add_location_to_breakpoint): Likewise.
(clone_momentary_breakpoint): Likewise.
(watch_command_1): Likewise.
(update_watchpoint): Likewise.
(bp_loc_is_permanent): Use location architecture instead of
current_gdbarch.
(adjust_breakpoint_address): Add GDBARCH parameter; use it
instead of current_gdbarch.
Update callers of adjust_breakpoint_address to pass
breakpoint location architecture:
(set_raw_breakpoint): Update.
(watch_command_1): Update.
* tracepoint.c: (collect_symbol): Add GDBARCH parameter, use instead
of current_gdbarch.
(add_local_symbols): Add GDBARCH parameter. Pass to collect_symbol.
(encode_actions): Pass tracepoint architecture to add_local_symbols
(encode_actions): Use tracepoint architecture instead of
current_gdbarch. Pass it to add_local_symbols and collect_symbol.
* breakpoint.h (struct breakpoint_ops): Replace last_addr parameter
of print_one callback with last_loc.
* breakpoint.c (print_one_breakpoint_location): Replace last_addr
parameter with last_loc.
(print_one_breakpoint): Likewise.
(do_captured_breakpoint_query): Update call.
(breakpoint_1): Pass last_loc instead of last_addr to
print_one_breakpoint. Pass last location architecture instead of
current_gdbarch to set_next_address.
Update all implementations of the print_one callback:
* breakpoint.c (print_one_catch_fork): Update.
(print_one_catch_vfork): Update.
(print_one_catch_exec): Update.
(print_one_exception_catchpoint): Update.
* ada-lang.c (print_one_exception): Update.
(print_one_catch_exception): Update.
(print_one_catch_exception_unhandled): Update.
(print_one_catch_assert): Update.
* breakpoint.c (print_one_breakpoint_location): Add PRINT_ADDRESS_BITS
parameter. Use it instead of gdbarch_addr_bit (current_gdbarch).
(print_one_breakpoint): Add PRINT_ADDRESS_BITS parameter and pass it
to print_one_breakpoint_location.
(breakpoint_address_bits): New function.
(do_captured_breakpoint_query): Compute number of address bits to print
and pass it to print_one_breakpoint.
(breakpoint_1): Likewise. Use it instead of current_gdbarch.
* breakpoint.h (create_thread_event_breakpoint): Add GDBARCH.
* breakpoint.c (create_thread_event_breakpoint): Likewise.
Update callers to create_thread_event_breakpoint:
* aix-thread.c (pd_enable): Update.
* linux-thread-db.c (enable_thread_event): Update.
* breakpoint.h (create_solib_event_breakpoint): Add GDBARCH.
* breakpoint.c (create_solib_event_breakpoint): Likewise.
Update callers to create_solib_event_breakpoint:
* solib-frv.c (enable_break, enable_break2): Update.
* solib-pa64.c (pa64_solib_create_inferior_hook): Update.
* solib-som.c (som_solib_create_inferior_hook): Update.
* solib-darwin.c (darwin_solib_create_inferior_hook): Update.
* solib-svr4.c (enable_break): Update.
* breakpoint.h (insert_single_step_breakpoint): Add GDBARCH.
* breakpoint.c (insert_single_step_breakpoint): Likewise.
Update callers to insert_single_step_breakpoint:
* alpha-tdep.c (alpha_software_single_step): Update.
* arm-linux-tdep.c (arm_linux_software_single_step): Update.
* arm-tdep.c (arm_software_single_step): Update.
* cris-tdep.c (cris_software_single_step): Update.
* rs6000-aix-tdep.c (rs6000_software_single_step): Update.
* rs6000-tdep.c (ppc_deal_with_atomic_sequence): Update.
* sparc-tdep.c (sparc_software_single_step): Update.
* spu-tdep.c (spu_software_single_step): Update.
* mips-tdep.c (deal_with_atomic_sequence): Add GDBARCH parameter.
Pass it to insert_single_step_breakpoint.
(mips_software_single_step): Pass architecture to
deal_with_atomic_sequence and insert_single_step_breakpoint.
* breakpoint.h (deprecated_insert_raw_breakpoint): Add GDBARCH.
(deprecated_remove_raw_breakpoint): Likewise.
* breakpoint.c (deprecated_insert_raw_breakpoint): Add GDBARCH.
(deprecated_remove_raw_breakpoint): Likewise.
Update callers to deprecated_insert_raw_breakpoint and
deprecated_remove_raw_breakpoint:
* breakpoint.c (single_step_gdbarch): New static variable.
(insert_single_step_breakpoint): Pass GDBARCH parameter to
deprecated_insert_raw_breakpoint. Store it in single_step_gdbarch.
(remove_single_step_breakpoints): Pass architecture stored in
single_step_gdbarch to deprecated_remove_raw_breakpoint.
* rs6000-nat.c (exec_one_dummy_insn): Update.
* solib-irix.c (enable_break, disable_break): Update.
* procfs.c (procfs_mourn_inferior): Update.
(remove_dbx_link_breakpoint): Update.
* breakpoint.h (set_breakpoint): Add GDBARCH parameter.
(set_momentary_breakpoint, set_momentary_breakpoint_at_pc): Likewise.
* breakpoint.c (set_breakpoint): Add GDBARCH parameter.
(set_momentary_breakpoint, set_momentary_breakpoint_at_pc): Likewise.
Update callers to set_breakpoint, set_momentary_breakpoint and
set_momentary_breakpoint_at_pc:
* breakpoint.c (set_momentary_breakpoint_at_pc): Update.
(until_break_command): Update.
* infcall.c (call_function_by_hand): Update.
* infcmd.c (finish_backward, finish_forward): Update.
* infrun.c (insert_step_resume_breakpoint_at_sal): Add GDBARCH
parameter. Pass it to set_momentary_breakpoint.
(insert_longjmp_resume_breakpoint): Add GDBARCH parameter.
Pass it to set_momentary_breakpoint_at_pc.
(handle_inferior_event): Update.
(insert_step_resume_breakpoint_at_frame): Update.
(insert_step_resume_breakpoint_at_caller): Update..
* mi/mi-cmd-break.c: Include "arch-utils.h".
(mi_cmd_break_insert): Update.
* target.h (struct target_ops): Add GDBARCH parameter to
to_insert_breakpoint, to_remove_breakpoint, to_insert_hw_breakpoint,
and to_remove_hw_breakpoint members.
(target_insert_breakpoint, target_remove_breakpoint,
target_insert_hw_breakpoint, target_remove_hw_breakpoint): Add GDBARCH
parameter, pass to target routine.
(memory_remove_breakpoint, memory_insert_breakpoint): Add GDBARCH
parameter.
* target.c (debug_to_insert_breakpoint, debug_to_remove_breakpoint,
debug_to_insert_hw_breakpoint, debug_to_remove_hw_breakpoint): Add
GDBARCH parameter, pass to target routine.
(update_current_target): Update function signature.
* breakpoint.c (insert_bp_location, remove_breakpoint,
deprecated_insert_raw_breakpoint, deprecated_remove_raw_breakpoint):
Pass architecture to target_ routines.
Update all implementations of the target breakpoint routines to take
GDBARCH parameter and use it instead of GDBARCH as appropriate:
* corelow.c (ignore): Update.
* exec.c (ignore): Update.
* mem-break.c (memory_insert_breakpoint): Update.
(memory_remove_breakpoint): Update.
* monitor.c (monitor_insert_breakpoint): Update.
(monitor_remove_breakpoint): Update.
* record.c (record_insert_breakpoint): Update.
(record_beneath_to_insert_breakpoint): Update.
(record_remove_breakpoint): Update.
(record_beneath_to_remove_breakpoint): Update.
* remote.c (remote_insert_breakpoint): Update.
(remote_remove_breakpoint): Update.
(remote_insert_hw_breakpoint): Update.
(remote_remove_hw_breakpoint): Update.
* remote-m32r-sdi.c (m32r_insert_breakpoint): Update.
(m32r_remove_breakpoint): Update.
* remote-mips.c (mips_insert_breakpoint): Update.
(mips_remove_breakpoint): Update.
* i386-nat.c (i386_insert_hw_breakpoint): Update.
(i386_remove_hw_breakpoint): Update.
* nto-procfs.c (procfs_insert_breakpoint): Update.
(procfs_remove_breakpoint): Update.
(procfs_insert_hw_breakpoint): Update.
(procfs_remove_hw_breakpoint): Update.
doc/ChangeLog:
* gdbint.texi (Examples of Use of @code{ui_out} functions):
Update example code extrated from breakpoint.c.
2009-07-03 01:12:28 +08:00
|
|
|
static int (*record_beneath_to_insert_breakpoint) (struct gdbarch *,
|
|
|
|
struct bp_target_info *);
|
|
|
|
static int (*record_beneath_to_remove_breakpoint) (struct gdbarch *,
|
|
|
|
struct bp_target_info *);
|
2009-11-22 23:38:59 +08:00
|
|
|
static int (*record_beneath_to_stopped_by_watchpoint) (void);
|
|
|
|
static int (*record_beneath_to_stopped_data_address) (struct target_ops *,
|
|
|
|
CORE_ADDR *);
|
2011-05-27 02:11:33 +08:00
|
|
|
static void (*record_beneath_to_async) (void (*) (enum inferior_event_type, void *), void *);
|
2009-04-30 10:58:37 +08:00
|
|
|
|
2009-10-16 01:15:56 +08:00
|
|
|
/* Alloc and free functions for record_reg, record_mem, and record_end
|
|
|
|
entries. */
|
|
|
|
|
|
|
|
/* Alloc a record_reg record entry. */
|
|
|
|
|
|
|
|
static inline struct record_entry *
|
|
|
|
record_reg_alloc (struct regcache *regcache, int regnum)
|
|
|
|
{
|
|
|
|
struct record_entry *rec;
|
|
|
|
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
|
|
|
|
|
|
|
rec = (struct record_entry *) xcalloc (1, sizeof (struct record_entry));
|
|
|
|
rec->type = record_reg;
|
|
|
|
rec->u.reg.num = regnum;
|
2009-10-19 00:10:42 +08:00
|
|
|
rec->u.reg.len = register_size (gdbarch, regnum);
|
|
|
|
if (rec->u.reg.len > sizeof (rec->u.reg.u.buf))
|
|
|
|
rec->u.reg.u.ptr = (gdb_byte *) xmalloc (rec->u.reg.len);
|
2009-10-16 01:15:56 +08:00
|
|
|
|
|
|
|
return rec;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Free a record_reg record entry. */
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
record_reg_release (struct record_entry *rec)
|
|
|
|
{
|
|
|
|
gdb_assert (rec->type == record_reg);
|
2009-10-19 00:10:42 +08:00
|
|
|
if (rec->u.reg.len > sizeof (rec->u.reg.u.buf))
|
|
|
|
xfree (rec->u.reg.u.ptr);
|
2009-10-16 01:15:56 +08:00
|
|
|
xfree (rec);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Alloc a record_mem record entry. */
|
|
|
|
|
|
|
|
static inline struct record_entry *
|
|
|
|
record_mem_alloc (CORE_ADDR addr, int len)
|
|
|
|
{
|
|
|
|
struct record_entry *rec;
|
|
|
|
|
|
|
|
rec = (struct record_entry *) xcalloc (1, sizeof (struct record_entry));
|
|
|
|
rec->type = record_mem;
|
|
|
|
rec->u.mem.addr = addr;
|
|
|
|
rec->u.mem.len = len;
|
2009-10-19 00:10:42 +08:00
|
|
|
if (rec->u.mem.len > sizeof (rec->u.mem.u.buf))
|
|
|
|
rec->u.mem.u.ptr = (gdb_byte *) xmalloc (len);
|
2009-10-16 01:15:56 +08:00
|
|
|
|
|
|
|
return rec;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Free a record_mem record entry. */
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
record_mem_release (struct record_entry *rec)
|
|
|
|
{
|
|
|
|
gdb_assert (rec->type == record_mem);
|
2009-10-19 00:10:42 +08:00
|
|
|
if (rec->u.mem.len > sizeof (rec->u.mem.u.buf))
|
|
|
|
xfree (rec->u.mem.u.ptr);
|
2009-10-16 01:15:56 +08:00
|
|
|
xfree (rec);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Alloc a record_end record entry. */
|
|
|
|
|
|
|
|
static inline struct record_entry *
|
|
|
|
record_end_alloc (void)
|
|
|
|
{
|
|
|
|
struct record_entry *rec;
|
|
|
|
|
|
|
|
rec = (struct record_entry *) xcalloc (1, sizeof (struct record_entry));
|
|
|
|
rec->type = record_end;
|
|
|
|
|
|
|
|
return rec;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Free a record_end record entry. */
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
record_end_release (struct record_entry *rec)
|
|
|
|
{
|
|
|
|
xfree (rec);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Free one record entry, any type.
|
|
|
|
Return entry->type, in case caller wants to know. */
|
|
|
|
|
|
|
|
static inline enum record_type
|
|
|
|
record_entry_release (struct record_entry *rec)
|
|
|
|
{
|
|
|
|
enum record_type type = rec->type;
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case record_reg:
|
|
|
|
record_reg_release (rec);
|
|
|
|
break;
|
|
|
|
case record_mem:
|
|
|
|
record_mem_release (rec);
|
|
|
|
break;
|
|
|
|
case record_end:
|
|
|
|
record_end_release (rec);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return type;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Free all record entries in list pointed to by REC. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
|
|
|
record_list_release (struct record_entry *rec)
|
|
|
|
{
|
|
|
|
if (!rec)
|
|
|
|
return;
|
|
|
|
|
|
|
|
while (rec->next)
|
2009-10-16 01:15:56 +08:00
|
|
|
rec = rec->next;
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
while (rec->prev)
|
|
|
|
{
|
|
|
|
rec = rec->prev;
|
2009-10-16 01:15:56 +08:00
|
|
|
record_entry_release (rec->next);
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
|
2009-10-16 01:15:56 +08:00
|
|
|
if (rec == &record_first)
|
|
|
|
{
|
|
|
|
record_insn_num = 0;
|
|
|
|
record_first.next = NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
record_entry_release (rec);
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
|
2009-10-16 01:15:56 +08:00
|
|
|
/* Free all record entries forward of the given list position. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
2009-10-16 01:15:56 +08:00
|
|
|
record_list_release_following (struct record_entry *rec)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
|
|
|
struct record_entry *tmp = rec->next;
|
2009-10-16 01:15:56 +08:00
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
rec->next = NULL;
|
|
|
|
while (tmp)
|
|
|
|
{
|
|
|
|
rec = tmp->next;
|
2009-10-16 01:15:56 +08:00
|
|
|
if (record_entry_release (tmp) == record_end)
|
2009-10-21 23:21:16 +08:00
|
|
|
{
|
|
|
|
record_insn_num--;
|
|
|
|
record_insn_count--;
|
|
|
|
}
|
2009-04-30 10:58:37 +08:00
|
|
|
tmp = rec;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-10-16 00:57:36 +08:00
|
|
|
/* Delete the first instruction from the beginning of the log, to make
|
|
|
|
room for adding a new instruction at the end of the log.
|
|
|
|
|
|
|
|
Note -- this function does not modify record_insn_num. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
|
|
|
record_list_release_first (void)
|
|
|
|
{
|
2009-10-16 01:15:56 +08:00
|
|
|
struct record_entry *tmp;
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
if (!record_first.next)
|
|
|
|
return;
|
|
|
|
|
2009-10-16 01:15:56 +08:00
|
|
|
/* Loop until a record_end. */
|
2009-04-30 10:58:37 +08:00
|
|
|
while (1)
|
|
|
|
{
|
2009-10-16 01:15:56 +08:00
|
|
|
/* Cut record_first.next out of the linked list. */
|
2009-04-30 10:58:37 +08:00
|
|
|
tmp = record_first.next;
|
|
|
|
record_first.next = tmp->next;
|
2009-10-16 01:15:56 +08:00
|
|
|
tmp->next->prev = &record_first;
|
|
|
|
|
|
|
|
/* tmp is now isolated, and can be deleted. */
|
|
|
|
if (record_entry_release (tmp) == record_end)
|
2009-10-21 23:21:16 +08:00
|
|
|
break; /* End loop at first record_end. */
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
if (!record_first.next)
|
|
|
|
{
|
|
|
|
gdb_assert (record_insn_num == 1);
|
2009-10-16 01:15:56 +08:00
|
|
|
break; /* End loop when list is empty. */
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Add a struct record_entry to record_arch_list. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_arch_list_add (struct record_entry *rec)
|
|
|
|
{
|
|
|
|
if (record_debug > 1)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: record_arch_list_add %s.\n",
|
|
|
|
host_address_to_string (rec));
|
|
|
|
|
|
|
|
if (record_arch_list_tail)
|
|
|
|
{
|
|
|
|
record_arch_list_tail->next = rec;
|
|
|
|
rec->prev = record_arch_list_tail;
|
|
|
|
record_arch_list_tail = rec;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
record_arch_list_head = rec;
|
|
|
|
record_arch_list_tail = rec;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-10-19 00:10:42 +08:00
|
|
|
/* Return the value storage location of a record entry. */
|
|
|
|
static inline gdb_byte *
|
|
|
|
record_get_loc (struct record_entry *rec)
|
|
|
|
{
|
|
|
|
switch (rec->type) {
|
|
|
|
case record_mem:
|
|
|
|
if (rec->u.mem.len > sizeof (rec->u.mem.u.buf))
|
|
|
|
return rec->u.mem.u.ptr;
|
|
|
|
else
|
|
|
|
return rec->u.mem.u.buf;
|
|
|
|
case record_reg:
|
|
|
|
if (rec->u.reg.len > sizeof (rec->u.reg.u.buf))
|
|
|
|
return rec->u.reg.u.ptr;
|
|
|
|
else
|
|
|
|
return rec->u.reg.u.buf;
|
|
|
|
case record_end:
|
|
|
|
default:
|
2010-08-19 03:13:33 +08:00
|
|
|
gdb_assert_not_reached ("unexpected record_entry type");
|
2009-10-19 00:10:42 +08:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Record the value of a register NUM to record_arch_list. */
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
int
|
2009-10-16 01:15:56 +08:00
|
|
|
record_arch_list_add_reg (struct regcache *regcache, int regnum)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
|
|
|
struct record_entry *rec;
|
|
|
|
|
|
|
|
if (record_debug > 1)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: add register num = %d to "
|
|
|
|
"record list.\n",
|
2009-10-16 01:15:56 +08:00
|
|
|
regnum);
|
2009-04-30 10:58:37 +08:00
|
|
|
|
2009-10-16 01:15:56 +08:00
|
|
|
rec = record_reg_alloc (regcache, regnum);
|
2009-04-30 10:58:37 +08:00
|
|
|
|
2009-10-19 00:10:42 +08:00
|
|
|
regcache_raw_read (regcache, regnum, record_get_loc (rec));
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
record_arch_list_add (rec);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Record the value of a region of memory whose address is ADDR and
|
|
|
|
length is LEN to record_arch_list. */
|
|
|
|
|
|
|
|
int
|
|
|
|
record_arch_list_add_mem (CORE_ADDR addr, int len)
|
|
|
|
{
|
|
|
|
struct record_entry *rec;
|
|
|
|
|
|
|
|
if (record_debug > 1)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
* defs.h (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter.
* utils.c (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter, use it instead of current_gdbarch.
* ui-out.h (ui_out_field_core_addr): Add GDBARCH parameter.
* ui-out.c (ui_out_field_core_addr): Add GDBARCH parameter,
use it instead of current_gdbarch.
Update calls to ui_out_field_core_addr to pass architecture:
* ada-lang.c (print_one_exception): Update.
* breakpoint.c (print_one_breakpoint_location,
print_one_exception_catchpoint): Update.
* disasm.c (dump_insns): Update.
* darwin-nat-info.c (darwin_debug_regions_recurse): Update.
* mi/mi-main.c (mi_cmd_data_read_memory): Update.
* mi/mi-symbol-cmds.c: Include "objfiles.h".
(mi_cmd_symbol_list_lines): Update.
* stack.c (print_frame_info, print_frame): Update.
Update callers of paddress to pass architecture:
* ada-tasks.c (info_task): Update.
* ada-valprint.c (ada_val_print_1): Update.
* annotate.c (annotate_source, annotate_frame_begin): Update.
* breakpoint.c (insert_bp_location, describe_other_breakpoints,
mention): Update.
* cli/cli-cmds.c (edit_command, list_command, print_disassembly):
Update.
* corefile.c (memory_error): Update.
* c-valprint.c (print_function_pointer_address, c_val_print): Update.
* disasm.c (dis_asm_print_address): Update.
* exec.c (print_section_info): Update.
* f-valprint.c (f_val_print): Update.
* infcmd.c: Include "arch-utils.h".
(jump_command, program_info): Update.
* linux-fork.c: Include "arch-utils.h".
(info_forks_command): Update.
* m2-valprint.c (print_function_pointer_address,
print_unpacked_pointer, print_variable_at_address,
m2_val_print): Update.
* m32r-rom.c (m32r_load_section, m32r_load, m32r_upload_command):
Update.
* printcmd.c (print_address, print_address_demangle, address_info):
Update.
* p-valprint.c (pascal_val_print): Update.
* source.c: Include "arch-utils.h".
(line_info): Update.
* stack.c (frame_info, print_block_frame_labels): Update.
* symfile.c (add_symbol_file_command, list_overlays_command): Update.
* symmisc.c (dump_msymbols, dump_psymtab, dump_symtab_1,
print_symbol, print_partial_symbols, maintenance_info_psymtabs,
maintenance_check_symtabs): Update.
* symtab.c (find_pc_sect_symtab): Update.
* target.c (deprecated_debug_xfer_memory): Update.
* tracepoint.c (scope_info): Update.
* tui/tui-stack.c (tui_make_status_line): Update.
* valprint.c (val_print_string): Update.
Update callers of paddr_nz to use paddress instead (keeping
user-visible output identical):
* alpha-tdep.c (alpha_heuristic_proc_start): Update.
* amd64-tdep.c (fixup_riprel, amd64_displaced_step_copy_insn,
amd64_displaced_step_fixup): Update.
* arch-utils.c (simple_displaced_step_copy_insn): Update.
* auxv.c (fprint_target_auxv): Update.
* breakpoint.c (insert_single_step_breakpoint): Update.
* buildsym.c (finish_block): Update.
* cli/cli-dump.c (restore_section_callback): Update.
* fbsd-nat.c (fbsd_find_memory_regions): Update.
* frame.c (frame_unwind_register_value): Update.
* gcore.c (gcore_create_callback): Update.
* hppa-tdep.c (hppa_frame_cache, hppa_skip_trampoline_code): Update.
* i386-tdep.c (i386_displaced_step_fixup, i386_record_modrm,
i386_record_lea_modrm_addr, i386_record_lea_modrm,
i386_process_record): Update.
* ia64-tdep.c (ia64_frame_this_id, ia64_sigtramp_frame_this_id,
ia64_libunwind_frame_this_id, ia64_libunwind_sigtramp_frame_this_id,
ia64_dummy_id, ia64_access_reg, ia64_access_rse_reg): Update.
* infrun.c (displaced_step_prepare, displaced_step_fixup,
handle_inferior_event, insert_step_resume_breakpoint_at_sal,
insert_longjmp_resume_breakpoint): Update.
* linux-nat.c (linux_nat_find_memory_regions): Update.
* linux-record.c (record_linux_system_call): Update.
* mips-tdep.c (heuristic_proc_start, mips_eabi_push_dummy_call,
mips_n32n64_push_dummy_call, mips_o32_push_dummy_call,
mips_o64_push_dummy_call): Update.
* monitor.c (monitor_error, monitor_remove_breakpoint): Update.
* record.c (record_arch_list_add_mem, record_wait,
record_xfer_partial): Update.
* remote-mips.c (mips_fetch_word, mips_check_lsi_error,
mips_common_breakpoint): Update.
* remote-sim.c (gdbsim_xfer_inferior_memory): Update.
* rs6000-tdep.c (ppc_displaced_step_fixup): Update.
* solib-som.c (som_current_sos): Update.
* symfile.c (load_progress, generic_load): Update.
* symfile-mem.c (add_vsyscall_page): Update.
* valops.c (value_fetch_lazy): Update.
* windows-tdep.c (windows_xfer_shared_library): Update.
Update callers of paddr_nz to use paddress instead (changing
user-visible output to make it more correct):
* dwarf2loc.c (locexpr_describe_location): Update.
* ia64-tdep.c (ia64_memory_insert_breakpoint,
ia64_memory_remove_breakpoint): Update.
* jv-valprint.c (java_value_print): Update.
* m32c-tdep.c (m32c_m16c_address_to_pointer): Update.
* monitor.c (monitor_read_memory): Update.
Update callers of paddr to use paddress instead (changing
user-visible output to make it more correct):
* arm-tdep.c (arm_push_dummy_call): Update.
* breakpoint.c (insert_bp_location, create_thread_event_breakpoint,
create_breakpoint): Update.
* darwin-nat-info.c (darwin_debug_regions): Update.
* dcache.c (dcache_info): Update.
* dsrec.c (load_srec, make_srec): Update.
* dwarf2-frame.c (dwarf2_restore_rule, execute_cfa_program,
dwarf2_frame_cache): Update.
* gcore.c (gcore_copy_callback): Update.
* gnu-nat.c (gnu_xfer_memory): Update.
* mips-linux-nat.c (mips_show_dr): Update.
* monitor.c (monitor_write_memory, monitor_insert_breakpoint,
monitor_remove_breakpoint): Update.
* remote.c (compare_sections_command): Update.
* remote-m32r-sdi.c (m32r_xfer_memory, m32r_insert_breakpoint,
m32r_remove_breakpoint, m32r_insert_watchpoint,
m32r_remove_watchpoint): Update.
* sol-thread.c (info_cb): Update.
* symfile.c (load_progress): Update.
Update callers of paddress or paddr_nz to use hex_string instead
(changes output of internal/error/debug messages only):
* dwarf2read.c (dump_die_shallow): Update.
* frame.c (fprint_field, fprint_frame, frame_pc_unwind,
get_frame_func, create_new_frame): Update.
* hppa-tdep.c (find_unwind_entry, unwind_command): Update.
* ia64-tdep.c (get_kernel_table, ia64_find_proc_info_x,
ia64_get_dyn_info_list): Update.
* maint.c (maintenance_translate_address): Update.
* mi/mi-cmd-var.c (mi_cmd_var_create): Update.
* target.c (target_flash_erase): Update.
Update callers of paddr/paddr_nz to use phex/phex_nz instead,
using an appropriate address size. Remove use of strlen_paddr.
* exec.c (exec_files_info): Update.
* i386-nat.c (i386_show_dr): Update.
* remote.c (remote_flash_erase): Update.
* m32r-rom.c (m32r_load_section): Update.
* monitor.c (monitor_vsprintf, monitor_store_register): Update.
* remote.c (remote_check_symbols, remote_search_memory): Update.
* remote-mips.c (mips_request, mips_common_breakpoint): Update.
* scm-valprint.c (scm_ipruk, scm_scmval_print): Update.
* sh64-tdep.c (sh64_show_media_regs, sh64_show_compact_regs): Update.
* sh-tdep.c (sh_generic_show_regs, sh3_show_regs, sh2e_show_regs,
sh2a_show_regs, sh2a_nofpu_show_regs, sh3e_show_regs,
sh3_dsp_show_regs, sh4_show_regs, sh4_nofpu_show_regs,
sh_dsp_show_regs): Update.
* xcoffsolib.c (sharedlibrary_command): Update.
* maint.c (maint_print_section_info): Add ADDR_SIZE parameter.
Use hex_string_custom instead of paddr.
(print_bfd_section_info): Pass address size.
(print_objfile_section_info): Likewise.
* annotate.h (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* annotate.c (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* source.c (identify_source_line): Update call to annotate_source.
* stack.c (print_frame_info, print_frame): Update call to
annotate_frame_begin.
* breakpoint.c (describe_other_breakpoints): Add GDBARCH parameter.
(create_breakpoint, create_ada_exception_breakpoint): Update call.
* stack.c (print_block_frame_labels): Add GDBARCH parameter.
(print_frame_label_vars): Update call.
* symmisc.c (print_partial_symbols): Add GDBARCH parameter.
(dump_psymtab): Update call to print_partial_symbols.
(struct print_symbol_args): Add GDBARCH member.
(dump_symtab_1): Set print_symbol_args architecture member.
(print_symbol): Use it.
* windows-tdep.h (windows_xfer_shared_library): Add GDBARCH
parameter.
* windows-tdep.c (windows_xfer_shared_library): Likewise.
* i386-cygwin-tdep.c (struct cpms_data): Add GDBARCH member.
(core_process_module_section): Pass architecture from cpms_data to
windows_xfer_shared_library.
(windows_core_xfer_shared_libraries): Initialize cmps_data
architecture member.
* windows-nat.c (windows_xfer_shared_libraries): Pass architecture
to windows_xfer_shared_library.
* defs.h (print_address): Add GDBARCH parameter.
* printcmd.c (print_address): Add GDBARCH parameter.
(print_scalar_formatted, do_examine): Update call.
* findcmd.c (find_command): Update call.
* tracepoint.c: Include "arch-utils.h".
(trace_find_line_command): Update call.
* tui/tui-disasm.c (tui_disassemble): Update call.
* value.h (print_address_demangle): Add GDBARCH parameter.
* printcmd.c (print_address_demangle): Add GDBARCH parameter.
* c-valprint.c (print_function_pointer_address, c_val_print):
Update call.
* f-valprint.c (f_val_print): Update call.
* gnu-v3-abi.c (gnuv3_print_method_ptr): Update call.
* jv-valprint.c (java_val_print): Update call.
* m2-valprint.c (print_function_pointer_address, m2_val_print):
Update call.
* p-valprint.c (pascal_val_print): Update call.
* disasm.c (gdb_disassemble_info): Install architecture into
di.application_data field.
testsuite/ChangeLog:
* gdb.threads/tls-shared.exp: Update to locexpr_describe_location
change to prefix TLS offset in hex with 0x.
doc/ChangeLog:
* gdbint.texinfo (Item Output Functions): Update signature
for ui_out_field_core_addr.
2009-07-03 01:21:10 +08:00
|
|
|
"Process record: add mem addr = %s len = %d to "
|
2009-04-30 10:58:37 +08:00
|
|
|
"record list.\n",
|
* defs.h (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter.
* utils.c (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter, use it instead of current_gdbarch.
* ui-out.h (ui_out_field_core_addr): Add GDBARCH parameter.
* ui-out.c (ui_out_field_core_addr): Add GDBARCH parameter,
use it instead of current_gdbarch.
Update calls to ui_out_field_core_addr to pass architecture:
* ada-lang.c (print_one_exception): Update.
* breakpoint.c (print_one_breakpoint_location,
print_one_exception_catchpoint): Update.
* disasm.c (dump_insns): Update.
* darwin-nat-info.c (darwin_debug_regions_recurse): Update.
* mi/mi-main.c (mi_cmd_data_read_memory): Update.
* mi/mi-symbol-cmds.c: Include "objfiles.h".
(mi_cmd_symbol_list_lines): Update.
* stack.c (print_frame_info, print_frame): Update.
Update callers of paddress to pass architecture:
* ada-tasks.c (info_task): Update.
* ada-valprint.c (ada_val_print_1): Update.
* annotate.c (annotate_source, annotate_frame_begin): Update.
* breakpoint.c (insert_bp_location, describe_other_breakpoints,
mention): Update.
* cli/cli-cmds.c (edit_command, list_command, print_disassembly):
Update.
* corefile.c (memory_error): Update.
* c-valprint.c (print_function_pointer_address, c_val_print): Update.
* disasm.c (dis_asm_print_address): Update.
* exec.c (print_section_info): Update.
* f-valprint.c (f_val_print): Update.
* infcmd.c: Include "arch-utils.h".
(jump_command, program_info): Update.
* linux-fork.c: Include "arch-utils.h".
(info_forks_command): Update.
* m2-valprint.c (print_function_pointer_address,
print_unpacked_pointer, print_variable_at_address,
m2_val_print): Update.
* m32r-rom.c (m32r_load_section, m32r_load, m32r_upload_command):
Update.
* printcmd.c (print_address, print_address_demangle, address_info):
Update.
* p-valprint.c (pascal_val_print): Update.
* source.c: Include "arch-utils.h".
(line_info): Update.
* stack.c (frame_info, print_block_frame_labels): Update.
* symfile.c (add_symbol_file_command, list_overlays_command): Update.
* symmisc.c (dump_msymbols, dump_psymtab, dump_symtab_1,
print_symbol, print_partial_symbols, maintenance_info_psymtabs,
maintenance_check_symtabs): Update.
* symtab.c (find_pc_sect_symtab): Update.
* target.c (deprecated_debug_xfer_memory): Update.
* tracepoint.c (scope_info): Update.
* tui/tui-stack.c (tui_make_status_line): Update.
* valprint.c (val_print_string): Update.
Update callers of paddr_nz to use paddress instead (keeping
user-visible output identical):
* alpha-tdep.c (alpha_heuristic_proc_start): Update.
* amd64-tdep.c (fixup_riprel, amd64_displaced_step_copy_insn,
amd64_displaced_step_fixup): Update.
* arch-utils.c (simple_displaced_step_copy_insn): Update.
* auxv.c (fprint_target_auxv): Update.
* breakpoint.c (insert_single_step_breakpoint): Update.
* buildsym.c (finish_block): Update.
* cli/cli-dump.c (restore_section_callback): Update.
* fbsd-nat.c (fbsd_find_memory_regions): Update.
* frame.c (frame_unwind_register_value): Update.
* gcore.c (gcore_create_callback): Update.
* hppa-tdep.c (hppa_frame_cache, hppa_skip_trampoline_code): Update.
* i386-tdep.c (i386_displaced_step_fixup, i386_record_modrm,
i386_record_lea_modrm_addr, i386_record_lea_modrm,
i386_process_record): Update.
* ia64-tdep.c (ia64_frame_this_id, ia64_sigtramp_frame_this_id,
ia64_libunwind_frame_this_id, ia64_libunwind_sigtramp_frame_this_id,
ia64_dummy_id, ia64_access_reg, ia64_access_rse_reg): Update.
* infrun.c (displaced_step_prepare, displaced_step_fixup,
handle_inferior_event, insert_step_resume_breakpoint_at_sal,
insert_longjmp_resume_breakpoint): Update.
* linux-nat.c (linux_nat_find_memory_regions): Update.
* linux-record.c (record_linux_system_call): Update.
* mips-tdep.c (heuristic_proc_start, mips_eabi_push_dummy_call,
mips_n32n64_push_dummy_call, mips_o32_push_dummy_call,
mips_o64_push_dummy_call): Update.
* monitor.c (monitor_error, monitor_remove_breakpoint): Update.
* record.c (record_arch_list_add_mem, record_wait,
record_xfer_partial): Update.
* remote-mips.c (mips_fetch_word, mips_check_lsi_error,
mips_common_breakpoint): Update.
* remote-sim.c (gdbsim_xfer_inferior_memory): Update.
* rs6000-tdep.c (ppc_displaced_step_fixup): Update.
* solib-som.c (som_current_sos): Update.
* symfile.c (load_progress, generic_load): Update.
* symfile-mem.c (add_vsyscall_page): Update.
* valops.c (value_fetch_lazy): Update.
* windows-tdep.c (windows_xfer_shared_library): Update.
Update callers of paddr_nz to use paddress instead (changing
user-visible output to make it more correct):
* dwarf2loc.c (locexpr_describe_location): Update.
* ia64-tdep.c (ia64_memory_insert_breakpoint,
ia64_memory_remove_breakpoint): Update.
* jv-valprint.c (java_value_print): Update.
* m32c-tdep.c (m32c_m16c_address_to_pointer): Update.
* monitor.c (monitor_read_memory): Update.
Update callers of paddr to use paddress instead (changing
user-visible output to make it more correct):
* arm-tdep.c (arm_push_dummy_call): Update.
* breakpoint.c (insert_bp_location, create_thread_event_breakpoint,
create_breakpoint): Update.
* darwin-nat-info.c (darwin_debug_regions): Update.
* dcache.c (dcache_info): Update.
* dsrec.c (load_srec, make_srec): Update.
* dwarf2-frame.c (dwarf2_restore_rule, execute_cfa_program,
dwarf2_frame_cache): Update.
* gcore.c (gcore_copy_callback): Update.
* gnu-nat.c (gnu_xfer_memory): Update.
* mips-linux-nat.c (mips_show_dr): Update.
* monitor.c (monitor_write_memory, monitor_insert_breakpoint,
monitor_remove_breakpoint): Update.
* remote.c (compare_sections_command): Update.
* remote-m32r-sdi.c (m32r_xfer_memory, m32r_insert_breakpoint,
m32r_remove_breakpoint, m32r_insert_watchpoint,
m32r_remove_watchpoint): Update.
* sol-thread.c (info_cb): Update.
* symfile.c (load_progress): Update.
Update callers of paddress or paddr_nz to use hex_string instead
(changes output of internal/error/debug messages only):
* dwarf2read.c (dump_die_shallow): Update.
* frame.c (fprint_field, fprint_frame, frame_pc_unwind,
get_frame_func, create_new_frame): Update.
* hppa-tdep.c (find_unwind_entry, unwind_command): Update.
* ia64-tdep.c (get_kernel_table, ia64_find_proc_info_x,
ia64_get_dyn_info_list): Update.
* maint.c (maintenance_translate_address): Update.
* mi/mi-cmd-var.c (mi_cmd_var_create): Update.
* target.c (target_flash_erase): Update.
Update callers of paddr/paddr_nz to use phex/phex_nz instead,
using an appropriate address size. Remove use of strlen_paddr.
* exec.c (exec_files_info): Update.
* i386-nat.c (i386_show_dr): Update.
* remote.c (remote_flash_erase): Update.
* m32r-rom.c (m32r_load_section): Update.
* monitor.c (monitor_vsprintf, monitor_store_register): Update.
* remote.c (remote_check_symbols, remote_search_memory): Update.
* remote-mips.c (mips_request, mips_common_breakpoint): Update.
* scm-valprint.c (scm_ipruk, scm_scmval_print): Update.
* sh64-tdep.c (sh64_show_media_regs, sh64_show_compact_regs): Update.
* sh-tdep.c (sh_generic_show_regs, sh3_show_regs, sh2e_show_regs,
sh2a_show_regs, sh2a_nofpu_show_regs, sh3e_show_regs,
sh3_dsp_show_regs, sh4_show_regs, sh4_nofpu_show_regs,
sh_dsp_show_regs): Update.
* xcoffsolib.c (sharedlibrary_command): Update.
* maint.c (maint_print_section_info): Add ADDR_SIZE parameter.
Use hex_string_custom instead of paddr.
(print_bfd_section_info): Pass address size.
(print_objfile_section_info): Likewise.
* annotate.h (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* annotate.c (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* source.c (identify_source_line): Update call to annotate_source.
* stack.c (print_frame_info, print_frame): Update call to
annotate_frame_begin.
* breakpoint.c (describe_other_breakpoints): Add GDBARCH parameter.
(create_breakpoint, create_ada_exception_breakpoint): Update call.
* stack.c (print_block_frame_labels): Add GDBARCH parameter.
(print_frame_label_vars): Update call.
* symmisc.c (print_partial_symbols): Add GDBARCH parameter.
(dump_psymtab): Update call to print_partial_symbols.
(struct print_symbol_args): Add GDBARCH member.
(dump_symtab_1): Set print_symbol_args architecture member.
(print_symbol): Use it.
* windows-tdep.h (windows_xfer_shared_library): Add GDBARCH
parameter.
* windows-tdep.c (windows_xfer_shared_library): Likewise.
* i386-cygwin-tdep.c (struct cpms_data): Add GDBARCH member.
(core_process_module_section): Pass architecture from cpms_data to
windows_xfer_shared_library.
(windows_core_xfer_shared_libraries): Initialize cmps_data
architecture member.
* windows-nat.c (windows_xfer_shared_libraries): Pass architecture
to windows_xfer_shared_library.
* defs.h (print_address): Add GDBARCH parameter.
* printcmd.c (print_address): Add GDBARCH parameter.
(print_scalar_formatted, do_examine): Update call.
* findcmd.c (find_command): Update call.
* tracepoint.c: Include "arch-utils.h".
(trace_find_line_command): Update call.
* tui/tui-disasm.c (tui_disassemble): Update call.
* value.h (print_address_demangle): Add GDBARCH parameter.
* printcmd.c (print_address_demangle): Add GDBARCH parameter.
* c-valprint.c (print_function_pointer_address, c_val_print):
Update call.
* f-valprint.c (f_val_print): Update call.
* gnu-v3-abi.c (gnuv3_print_method_ptr): Update call.
* jv-valprint.c (java_val_print): Update call.
* m2-valprint.c (print_function_pointer_address, m2_val_print):
Update call.
* p-valprint.c (pascal_val_print): Update call.
* disasm.c (gdb_disassemble_info): Install architecture into
di.application_data field.
testsuite/ChangeLog:
* gdb.threads/tls-shared.exp: Update to locexpr_describe_location
change to prefix TLS offset in hex with 0x.
doc/ChangeLog:
* gdbint.texinfo (Item Output Functions): Update signature
for ui_out_field_core_addr.
2009-07-03 01:21:10 +08:00
|
|
|
paddress (target_gdbarch, addr), len);
|
2009-04-30 10:58:37 +08:00
|
|
|
|
2011-01-11 04:38:51 +08:00
|
|
|
if (!addr) /* FIXME: Why? Some arch must permit it... */
|
2009-04-30 10:58:37 +08:00
|
|
|
return 0;
|
|
|
|
|
2009-10-16 01:15:56 +08:00
|
|
|
rec = record_mem_alloc (addr, len);
|
2009-04-30 10:58:37 +08:00
|
|
|
|
2009-10-19 00:10:42 +08:00
|
|
|
if (target_read_memory (addr, record_get_loc (rec), len))
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: error reading memory at "
|
* defs.h (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter.
* utils.c (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter, use it instead of current_gdbarch.
* ui-out.h (ui_out_field_core_addr): Add GDBARCH parameter.
* ui-out.c (ui_out_field_core_addr): Add GDBARCH parameter,
use it instead of current_gdbarch.
Update calls to ui_out_field_core_addr to pass architecture:
* ada-lang.c (print_one_exception): Update.
* breakpoint.c (print_one_breakpoint_location,
print_one_exception_catchpoint): Update.
* disasm.c (dump_insns): Update.
* darwin-nat-info.c (darwin_debug_regions_recurse): Update.
* mi/mi-main.c (mi_cmd_data_read_memory): Update.
* mi/mi-symbol-cmds.c: Include "objfiles.h".
(mi_cmd_symbol_list_lines): Update.
* stack.c (print_frame_info, print_frame): Update.
Update callers of paddress to pass architecture:
* ada-tasks.c (info_task): Update.
* ada-valprint.c (ada_val_print_1): Update.
* annotate.c (annotate_source, annotate_frame_begin): Update.
* breakpoint.c (insert_bp_location, describe_other_breakpoints,
mention): Update.
* cli/cli-cmds.c (edit_command, list_command, print_disassembly):
Update.
* corefile.c (memory_error): Update.
* c-valprint.c (print_function_pointer_address, c_val_print): Update.
* disasm.c (dis_asm_print_address): Update.
* exec.c (print_section_info): Update.
* f-valprint.c (f_val_print): Update.
* infcmd.c: Include "arch-utils.h".
(jump_command, program_info): Update.
* linux-fork.c: Include "arch-utils.h".
(info_forks_command): Update.
* m2-valprint.c (print_function_pointer_address,
print_unpacked_pointer, print_variable_at_address,
m2_val_print): Update.
* m32r-rom.c (m32r_load_section, m32r_load, m32r_upload_command):
Update.
* printcmd.c (print_address, print_address_demangle, address_info):
Update.
* p-valprint.c (pascal_val_print): Update.
* source.c: Include "arch-utils.h".
(line_info): Update.
* stack.c (frame_info, print_block_frame_labels): Update.
* symfile.c (add_symbol_file_command, list_overlays_command): Update.
* symmisc.c (dump_msymbols, dump_psymtab, dump_symtab_1,
print_symbol, print_partial_symbols, maintenance_info_psymtabs,
maintenance_check_symtabs): Update.
* symtab.c (find_pc_sect_symtab): Update.
* target.c (deprecated_debug_xfer_memory): Update.
* tracepoint.c (scope_info): Update.
* tui/tui-stack.c (tui_make_status_line): Update.
* valprint.c (val_print_string): Update.
Update callers of paddr_nz to use paddress instead (keeping
user-visible output identical):
* alpha-tdep.c (alpha_heuristic_proc_start): Update.
* amd64-tdep.c (fixup_riprel, amd64_displaced_step_copy_insn,
amd64_displaced_step_fixup): Update.
* arch-utils.c (simple_displaced_step_copy_insn): Update.
* auxv.c (fprint_target_auxv): Update.
* breakpoint.c (insert_single_step_breakpoint): Update.
* buildsym.c (finish_block): Update.
* cli/cli-dump.c (restore_section_callback): Update.
* fbsd-nat.c (fbsd_find_memory_regions): Update.
* frame.c (frame_unwind_register_value): Update.
* gcore.c (gcore_create_callback): Update.
* hppa-tdep.c (hppa_frame_cache, hppa_skip_trampoline_code): Update.
* i386-tdep.c (i386_displaced_step_fixup, i386_record_modrm,
i386_record_lea_modrm_addr, i386_record_lea_modrm,
i386_process_record): Update.
* ia64-tdep.c (ia64_frame_this_id, ia64_sigtramp_frame_this_id,
ia64_libunwind_frame_this_id, ia64_libunwind_sigtramp_frame_this_id,
ia64_dummy_id, ia64_access_reg, ia64_access_rse_reg): Update.
* infrun.c (displaced_step_prepare, displaced_step_fixup,
handle_inferior_event, insert_step_resume_breakpoint_at_sal,
insert_longjmp_resume_breakpoint): Update.
* linux-nat.c (linux_nat_find_memory_regions): Update.
* linux-record.c (record_linux_system_call): Update.
* mips-tdep.c (heuristic_proc_start, mips_eabi_push_dummy_call,
mips_n32n64_push_dummy_call, mips_o32_push_dummy_call,
mips_o64_push_dummy_call): Update.
* monitor.c (monitor_error, monitor_remove_breakpoint): Update.
* record.c (record_arch_list_add_mem, record_wait,
record_xfer_partial): Update.
* remote-mips.c (mips_fetch_word, mips_check_lsi_error,
mips_common_breakpoint): Update.
* remote-sim.c (gdbsim_xfer_inferior_memory): Update.
* rs6000-tdep.c (ppc_displaced_step_fixup): Update.
* solib-som.c (som_current_sos): Update.
* symfile.c (load_progress, generic_load): Update.
* symfile-mem.c (add_vsyscall_page): Update.
* valops.c (value_fetch_lazy): Update.
* windows-tdep.c (windows_xfer_shared_library): Update.
Update callers of paddr_nz to use paddress instead (changing
user-visible output to make it more correct):
* dwarf2loc.c (locexpr_describe_location): Update.
* ia64-tdep.c (ia64_memory_insert_breakpoint,
ia64_memory_remove_breakpoint): Update.
* jv-valprint.c (java_value_print): Update.
* m32c-tdep.c (m32c_m16c_address_to_pointer): Update.
* monitor.c (monitor_read_memory): Update.
Update callers of paddr to use paddress instead (changing
user-visible output to make it more correct):
* arm-tdep.c (arm_push_dummy_call): Update.
* breakpoint.c (insert_bp_location, create_thread_event_breakpoint,
create_breakpoint): Update.
* darwin-nat-info.c (darwin_debug_regions): Update.
* dcache.c (dcache_info): Update.
* dsrec.c (load_srec, make_srec): Update.
* dwarf2-frame.c (dwarf2_restore_rule, execute_cfa_program,
dwarf2_frame_cache): Update.
* gcore.c (gcore_copy_callback): Update.
* gnu-nat.c (gnu_xfer_memory): Update.
* mips-linux-nat.c (mips_show_dr): Update.
* monitor.c (monitor_write_memory, monitor_insert_breakpoint,
monitor_remove_breakpoint): Update.
* remote.c (compare_sections_command): Update.
* remote-m32r-sdi.c (m32r_xfer_memory, m32r_insert_breakpoint,
m32r_remove_breakpoint, m32r_insert_watchpoint,
m32r_remove_watchpoint): Update.
* sol-thread.c (info_cb): Update.
* symfile.c (load_progress): Update.
Update callers of paddress or paddr_nz to use hex_string instead
(changes output of internal/error/debug messages only):
* dwarf2read.c (dump_die_shallow): Update.
* frame.c (fprint_field, fprint_frame, frame_pc_unwind,
get_frame_func, create_new_frame): Update.
* hppa-tdep.c (find_unwind_entry, unwind_command): Update.
* ia64-tdep.c (get_kernel_table, ia64_find_proc_info_x,
ia64_get_dyn_info_list): Update.
* maint.c (maintenance_translate_address): Update.
* mi/mi-cmd-var.c (mi_cmd_var_create): Update.
* target.c (target_flash_erase): Update.
Update callers of paddr/paddr_nz to use phex/phex_nz instead,
using an appropriate address size. Remove use of strlen_paddr.
* exec.c (exec_files_info): Update.
* i386-nat.c (i386_show_dr): Update.
* remote.c (remote_flash_erase): Update.
* m32r-rom.c (m32r_load_section): Update.
* monitor.c (monitor_vsprintf, monitor_store_register): Update.
* remote.c (remote_check_symbols, remote_search_memory): Update.
* remote-mips.c (mips_request, mips_common_breakpoint): Update.
* scm-valprint.c (scm_ipruk, scm_scmval_print): Update.
* sh64-tdep.c (sh64_show_media_regs, sh64_show_compact_regs): Update.
* sh-tdep.c (sh_generic_show_regs, sh3_show_regs, sh2e_show_regs,
sh2a_show_regs, sh2a_nofpu_show_regs, sh3e_show_regs,
sh3_dsp_show_regs, sh4_show_regs, sh4_nofpu_show_regs,
sh_dsp_show_regs): Update.
* xcoffsolib.c (sharedlibrary_command): Update.
* maint.c (maint_print_section_info): Add ADDR_SIZE parameter.
Use hex_string_custom instead of paddr.
(print_bfd_section_info): Pass address size.
(print_objfile_section_info): Likewise.
* annotate.h (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* annotate.c (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* source.c (identify_source_line): Update call to annotate_source.
* stack.c (print_frame_info, print_frame): Update call to
annotate_frame_begin.
* breakpoint.c (describe_other_breakpoints): Add GDBARCH parameter.
(create_breakpoint, create_ada_exception_breakpoint): Update call.
* stack.c (print_block_frame_labels): Add GDBARCH parameter.
(print_frame_label_vars): Update call.
* symmisc.c (print_partial_symbols): Add GDBARCH parameter.
(dump_psymtab): Update call to print_partial_symbols.
(struct print_symbol_args): Add GDBARCH member.
(dump_symtab_1): Set print_symbol_args architecture member.
(print_symbol): Use it.
* windows-tdep.h (windows_xfer_shared_library): Add GDBARCH
parameter.
* windows-tdep.c (windows_xfer_shared_library): Likewise.
* i386-cygwin-tdep.c (struct cpms_data): Add GDBARCH member.
(core_process_module_section): Pass architecture from cpms_data to
windows_xfer_shared_library.
(windows_core_xfer_shared_libraries): Initialize cmps_data
architecture member.
* windows-nat.c (windows_xfer_shared_libraries): Pass architecture
to windows_xfer_shared_library.
* defs.h (print_address): Add GDBARCH parameter.
* printcmd.c (print_address): Add GDBARCH parameter.
(print_scalar_formatted, do_examine): Update call.
* findcmd.c (find_command): Update call.
* tracepoint.c: Include "arch-utils.h".
(trace_find_line_command): Update call.
* tui/tui-disasm.c (tui_disassemble): Update call.
* value.h (print_address_demangle): Add GDBARCH parameter.
* printcmd.c (print_address_demangle): Add GDBARCH parameter.
* c-valprint.c (print_function_pointer_address, c_val_print):
Update call.
* f-valprint.c (f_val_print): Update call.
* gnu-v3-abi.c (gnuv3_print_method_ptr): Update call.
* jv-valprint.c (java_val_print): Update call.
* m2-valprint.c (print_function_pointer_address, m2_val_print):
Update call.
* p-valprint.c (pascal_val_print): Update call.
* disasm.c (gdb_disassemble_info): Install architecture into
di.application_data field.
testsuite/ChangeLog:
* gdb.threads/tls-shared.exp: Update to locexpr_describe_location
change to prefix TLS offset in hex with 0x.
doc/ChangeLog:
* gdbint.texinfo (Item Output Functions): Update signature
for ui_out_field_core_addr.
2009-07-03 01:21:10 +08:00
|
|
|
"addr = %s len = %d.\n",
|
|
|
|
paddress (target_gdbarch, addr), len);
|
2009-10-16 01:15:56 +08:00
|
|
|
record_mem_release (rec);
|
2009-04-30 10:58:37 +08:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
record_arch_list_add (rec);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Add a record_end type struct record_entry to record_arch_list. */
|
|
|
|
|
|
|
|
int
|
|
|
|
record_arch_list_add_end (void)
|
|
|
|
{
|
|
|
|
struct record_entry *rec;
|
|
|
|
|
|
|
|
if (record_debug > 1)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: add end to arch list.\n");
|
|
|
|
|
2009-10-16 01:15:56 +08:00
|
|
|
rec = record_end_alloc ();
|
2012-05-25 00:51:47 +08:00
|
|
|
rec->u.end.sigval = GDB_SIGNAL_0;
|
2009-10-21 23:21:16 +08:00
|
|
|
rec->u.end.insn_num = ++record_insn_count;
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
record_arch_list_add (rec);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_check_insn_num (int set_terminal)
|
|
|
|
{
|
|
|
|
if (record_insn_max_num)
|
|
|
|
{
|
|
|
|
gdb_assert (record_insn_num <= record_insn_max_num);
|
|
|
|
if (record_insn_num == record_insn_max_num)
|
|
|
|
{
|
|
|
|
/* Ask user what to do. */
|
|
|
|
if (record_stop_at_limit)
|
|
|
|
{
|
|
|
|
int q;
|
2010-05-17 05:11:14 +08:00
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
if (set_terminal)
|
|
|
|
target_terminal_ours ();
|
|
|
|
q = yquery (_("Do you want to auto delete previous execution "
|
|
|
|
"log entries when record/replay buffer becomes "
|
|
|
|
"full (record stop-at-limit)?"));
|
|
|
|
if (set_terminal)
|
|
|
|
target_terminal_inferior ();
|
|
|
|
if (q)
|
|
|
|
record_stop_at_limit = 0;
|
|
|
|
else
|
2009-10-23 03:36:06 +08:00
|
|
|
error (_("Process record: stopped by user."));
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-10-23 03:36:06 +08:00
|
|
|
static void
|
|
|
|
record_arch_list_cleanups (void *ignore)
|
|
|
|
{
|
|
|
|
record_list_release (record_arch_list_tail);
|
|
|
|
}
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
/* Before inferior step (when GDB record the running message, inferior
|
|
|
|
only can step), GDB will call this function to record the values to
|
|
|
|
record_list. This function will call gdbarch_process_record to
|
|
|
|
record the running message of inferior and set them to
|
|
|
|
record_arch_list, and add it to record_list. */
|
|
|
|
|
|
|
|
static int
|
2012-05-25 00:39:15 +08:00
|
|
|
record_message (struct regcache *regcache, enum gdb_signal signal)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
|
|
|
int ret;
|
2009-12-22 11:16:40 +08:00
|
|
|
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
2009-10-23 03:36:06 +08:00
|
|
|
struct cleanup *old_cleanups = make_cleanup (record_arch_list_cleanups, 0);
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
record_arch_list_head = NULL;
|
|
|
|
record_arch_list_tail = NULL;
|
|
|
|
|
|
|
|
/* Check record_insn_num. */
|
|
|
|
record_check_insn_num (1);
|
|
|
|
|
2009-09-21 13:54:09 +08:00
|
|
|
/* If gdb sends a signal value to target_resume,
|
|
|
|
save it in the 'end' field of the previous instruction.
|
|
|
|
|
|
|
|
Maybe process record should record what really happened,
|
|
|
|
rather than what gdb pretends has happened.
|
|
|
|
|
|
|
|
So if Linux delivered the signal to the child process during
|
|
|
|
the record mode, we will record it and deliver it again in
|
|
|
|
the replay mode.
|
|
|
|
|
|
|
|
If user says "ignore this signal" during the record mode, then
|
|
|
|
it will be ignored again during the replay mode (no matter if
|
|
|
|
the user says something different, like "deliver this signal"
|
|
|
|
during the replay mode).
|
|
|
|
|
|
|
|
User should understand that nothing he does during the replay
|
|
|
|
mode will change the behavior of the child. If he tries,
|
|
|
|
then that is a user error.
|
|
|
|
|
|
|
|
But we should still deliver the signal to gdb during the replay,
|
|
|
|
if we delivered it during the recording. Therefore we should
|
|
|
|
record the signal during record_wait, not record_resume. */
|
|
|
|
if (record_list != &record_first) /* FIXME better way to check */
|
|
|
|
{
|
|
|
|
gdb_assert (record_list->type == record_end);
|
2009-12-22 11:16:40 +08:00
|
|
|
record_list->u.end.sigval = signal;
|
2009-09-21 13:54:09 +08:00
|
|
|
}
|
|
|
|
|
2012-05-25 00:51:47 +08:00
|
|
|
if (signal == GDB_SIGNAL_0
|
2009-09-21 13:54:09 +08:00
|
|
|
|| !gdbarch_process_record_signal_p (gdbarch))
|
|
|
|
ret = gdbarch_process_record (gdbarch,
|
2009-12-22 11:16:40 +08:00
|
|
|
regcache,
|
|
|
|
regcache_read_pc (regcache));
|
2009-09-21 13:54:09 +08:00
|
|
|
else
|
|
|
|
ret = gdbarch_process_record_signal (gdbarch,
|
2009-12-22 11:16:40 +08:00
|
|
|
regcache,
|
|
|
|
signal);
|
2009-09-21 13:54:09 +08:00
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
if (ret > 0)
|
|
|
|
error (_("Process record: inferior program stopped."));
|
|
|
|
if (ret < 0)
|
|
|
|
error (_("Process record: failed to record execution log."));
|
|
|
|
|
|
|
|
discard_cleanups (old_cleanups);
|
|
|
|
|
|
|
|
record_list->next = record_arch_list_head;
|
|
|
|
record_arch_list_head->prev = record_list;
|
|
|
|
record_list = record_arch_list_tail;
|
|
|
|
|
|
|
|
if (record_insn_num == record_insn_max_num && record_insn_max_num)
|
|
|
|
record_list_release_first ();
|
|
|
|
else
|
|
|
|
record_insn_num++;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2009-12-22 11:16:40 +08:00
|
|
|
struct record_message_args {
|
|
|
|
struct regcache *regcache;
|
2012-05-25 00:39:15 +08:00
|
|
|
enum gdb_signal signal;
|
2009-12-22 11:16:40 +08:00
|
|
|
};
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static int
|
2009-12-22 11:16:40 +08:00
|
|
|
record_message_wrapper (void *args)
|
|
|
|
{
|
|
|
|
struct record_message_args *record_args = args;
|
|
|
|
|
|
|
|
return record_message (record_args->regcache, record_args->signal);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
record_message_wrapper_safe (struct regcache *regcache,
|
2012-05-25 00:39:15 +08:00
|
|
|
enum gdb_signal signal)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
2009-09-21 13:54:09 +08:00
|
|
|
struct record_message_args args;
|
|
|
|
|
|
|
|
args.regcache = regcache;
|
|
|
|
args.signal = signal;
|
2009-12-22 11:16:40 +08:00
|
|
|
|
|
|
|
return catch_errors (record_message_wrapper, &args, NULL, RETURN_MASK_ALL);
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Set to 1 if record_store_registers and record_xfer_partial
|
|
|
|
doesn't need record. */
|
|
|
|
|
|
|
|
static int record_gdb_operation_disable = 0;
|
|
|
|
|
|
|
|
struct cleanup *
|
|
|
|
record_gdb_operation_disable_set (void)
|
|
|
|
{
|
|
|
|
struct cleanup *old_cleanups = NULL;
|
|
|
|
|
|
|
|
old_cleanups =
|
|
|
|
make_cleanup_restore_integer (&record_gdb_operation_disable);
|
|
|
|
record_gdb_operation_disable = 1;
|
|
|
|
|
|
|
|
return old_cleanups;
|
|
|
|
}
|
|
|
|
|
2009-11-22 23:38:59 +08:00
|
|
|
/* Flag set to TRUE for target_stopped_by_watchpoint. */
|
|
|
|
static int record_hw_watchpoint = 0;
|
|
|
|
|
2009-10-21 06:56:04 +08:00
|
|
|
/* Execute one instruction from the record log. Each instruction in
|
|
|
|
the log will be represented by an arbitrary sequence of register
|
|
|
|
entries and memory entries, followed by an 'end' entry. */
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
record_exec_insn (struct regcache *regcache, struct gdbarch *gdbarch,
|
|
|
|
struct record_entry *entry)
|
|
|
|
{
|
|
|
|
switch (entry->type)
|
|
|
|
{
|
|
|
|
case record_reg: /* reg */
|
|
|
|
{
|
|
|
|
gdb_byte reg[MAX_REGISTER_SIZE];
|
|
|
|
|
|
|
|
if (record_debug > 1)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: record_reg %s to "
|
|
|
|
"inferior num = %d.\n",
|
|
|
|
host_address_to_string (entry),
|
|
|
|
entry->u.reg.num);
|
|
|
|
|
|
|
|
regcache_cooked_read (regcache, entry->u.reg.num, reg);
|
|
|
|
regcache_cooked_write (regcache, entry->u.reg.num,
|
|
|
|
record_get_loc (entry));
|
|
|
|
memcpy (record_get_loc (entry), reg, entry->u.reg.len);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case record_mem: /* mem */
|
|
|
|
{
|
|
|
|
/* Nothing to do if the entry is flagged not_accessible. */
|
|
|
|
if (!entry->u.mem.mem_entry_not_accessible)
|
|
|
|
{
|
|
|
|
gdb_byte *mem = alloca (entry->u.mem.len);
|
|
|
|
|
|
|
|
if (record_debug > 1)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: record_mem %s to "
|
|
|
|
"inferior addr = %s len = %d.\n",
|
|
|
|
host_address_to_string (entry),
|
|
|
|
paddress (gdbarch, entry->u.mem.addr),
|
|
|
|
entry->u.mem.len);
|
|
|
|
|
|
|
|
if (target_read_memory (entry->u.mem.addr, mem, entry->u.mem.len))
|
|
|
|
{
|
|
|
|
entry->u.mem.mem_entry_not_accessible = 1;
|
|
|
|
if (record_debug)
|
2011-03-18 22:22:35 +08:00
|
|
|
warning (_("Process record: error reading memory at "
|
|
|
|
"addr = %s len = %d."),
|
2009-10-21 06:56:04 +08:00
|
|
|
paddress (gdbarch, entry->u.mem.addr),
|
|
|
|
entry->u.mem.len);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (target_write_memory (entry->u.mem.addr,
|
|
|
|
record_get_loc (entry),
|
|
|
|
entry->u.mem.len))
|
|
|
|
{
|
|
|
|
entry->u.mem.mem_entry_not_accessible = 1;
|
|
|
|
if (record_debug)
|
2011-03-18 22:22:35 +08:00
|
|
|
warning (_("Process record: error writing memory at "
|
|
|
|
"addr = %s len = %d."),
|
2009-10-21 06:56:04 +08:00
|
|
|
paddress (gdbarch, entry->u.mem.addr),
|
|
|
|
entry->u.mem.len);
|
|
|
|
}
|
|
|
|
else
|
2009-11-22 23:38:59 +08:00
|
|
|
{
|
|
|
|
memcpy (record_get_loc (entry), mem, entry->u.mem.len);
|
|
|
|
|
|
|
|
/* We've changed memory --- check if a hardware
|
|
|
|
watchpoint should trap. Note that this
|
|
|
|
presently assumes the target beneath supports
|
|
|
|
continuable watchpoints. On non-continuable
|
|
|
|
watchpoints target, we'll want to check this
|
|
|
|
_before_ actually doing the memory change, and
|
|
|
|
not doing the change at all if the watchpoint
|
|
|
|
traps. */
|
|
|
|
if (hardware_watchpoint_inserted_in_range
|
|
|
|
(get_regcache_aspace (regcache),
|
|
|
|
entry->u.mem.addr, entry->u.mem.len))
|
|
|
|
record_hw_watchpoint = 1;
|
|
|
|
}
|
2009-10-21 06:56:04 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-10-23 03:32:11 +08:00
|
|
|
static struct target_ops *tmp_to_resume_ops;
|
|
|
|
static void (*tmp_to_resume) (struct target_ops *, ptid_t, int,
|
2012-05-25 00:39:15 +08:00
|
|
|
enum gdb_signal);
|
2009-10-23 03:32:11 +08:00
|
|
|
static struct target_ops *tmp_to_wait_ops;
|
|
|
|
static ptid_t (*tmp_to_wait) (struct target_ops *, ptid_t,
|
|
|
|
struct target_waitstatus *,
|
|
|
|
int);
|
|
|
|
static struct target_ops *tmp_to_store_registers_ops;
|
|
|
|
static void (*tmp_to_store_registers) (struct target_ops *,
|
|
|
|
struct regcache *,
|
|
|
|
int regno);
|
|
|
|
static struct target_ops *tmp_to_xfer_partial_ops;
|
|
|
|
static LONGEST (*tmp_to_xfer_partial) (struct target_ops *ops,
|
|
|
|
enum target_object object,
|
|
|
|
const char *annex,
|
|
|
|
gdb_byte *readbuf,
|
|
|
|
const gdb_byte *writebuf,
|
|
|
|
ULONGEST offset,
|
|
|
|
LONGEST len);
|
|
|
|
static int (*tmp_to_insert_breakpoint) (struct gdbarch *,
|
|
|
|
struct bp_target_info *);
|
|
|
|
static int (*tmp_to_remove_breakpoint) (struct gdbarch *,
|
|
|
|
struct bp_target_info *);
|
2009-11-22 23:38:59 +08:00
|
|
|
static int (*tmp_to_stopped_by_watchpoint) (void);
|
|
|
|
static int (*tmp_to_stopped_data_address) (struct target_ops *, CORE_ADDR *);
|
2011-05-27 02:11:33 +08:00
|
|
|
static int (*tmp_to_stopped_data_address) (struct target_ops *, CORE_ADDR *);
|
|
|
|
static void (*tmp_to_async) (void (*) (enum inferior_event_type, void *), void *);
|
2009-10-23 03:32:11 +08:00
|
|
|
|
2009-10-23 03:36:06 +08:00
|
|
|
static void record_restore (void);
|
|
|
|
|
2011-05-27 02:11:33 +08:00
|
|
|
/* Asynchronous signal handle registered as event loop source for when
|
|
|
|
we have pending events ready to be passed to the core. */
|
|
|
|
|
|
|
|
static struct async_event_handler *record_async_inferior_event_token;
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_async_inferior_event_handler (gdb_client_data data)
|
|
|
|
{
|
|
|
|
inferior_event_handler (INF_REG_EVENT, NULL);
|
|
|
|
}
|
|
|
|
|
2009-10-23 03:32:11 +08:00
|
|
|
/* Open the process record target. */
|
2009-10-21 07:06:13 +08:00
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
2009-10-23 03:32:11 +08:00
|
|
|
record_core_open_1 (char *name, int from_tty)
|
|
|
|
{
|
|
|
|
struct regcache *regcache = get_current_regcache ();
|
|
|
|
int regnum = gdbarch_num_regs (get_regcache_arch (regcache));
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* Get record_core_regbuf. */
|
|
|
|
target_fetch_registers (regcache, -1);
|
|
|
|
record_core_regbuf = xmalloc (MAX_REGISTER_SIZE * regnum);
|
|
|
|
for (i = 0; i < regnum; i ++)
|
|
|
|
regcache_raw_collect (regcache, i,
|
|
|
|
record_core_regbuf + MAX_REGISTER_SIZE * i);
|
|
|
|
|
|
|
|
/* Get record_core_start and record_core_end. */
|
|
|
|
if (build_section_table (core_bfd, &record_core_start, &record_core_end))
|
|
|
|
{
|
|
|
|
xfree (record_core_regbuf);
|
|
|
|
record_core_regbuf = NULL;
|
|
|
|
error (_("\"%s\": Can't find sections: %s"),
|
|
|
|
bfd_get_filename (core_bfd), bfd_errmsg (bfd_get_error ()));
|
|
|
|
}
|
|
|
|
|
|
|
|
push_target (&record_core_ops);
|
2009-10-23 03:36:06 +08:00
|
|
|
record_restore ();
|
2009-10-23 03:32:11 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* "to_open" target method for 'live' processes. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_open_1 (char *name, int from_tty)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog, "Process record: record_open\n");
|
|
|
|
|
|
|
|
/* check exec */
|
|
|
|
if (!target_has_execution)
|
|
|
|
error (_("Process record: the program is not being run."));
|
|
|
|
if (non_stop)
|
|
|
|
error (_("Process record target can't debug inferior in non-stop mode "
|
|
|
|
"(non-stop)."));
|
|
|
|
|
2009-06-18 02:44:23 +08:00
|
|
|
if (!gdbarch_process_record_p (target_gdbarch))
|
2009-04-30 10:58:37 +08:00
|
|
|
error (_("Process record: the current architecture doesn't support "
|
|
|
|
"record function."));
|
|
|
|
|
2009-10-23 03:32:11 +08:00
|
|
|
if (!tmp_to_resume)
|
|
|
|
error (_("Could not find 'to_resume' method on the target stack."));
|
|
|
|
if (!tmp_to_wait)
|
|
|
|
error (_("Could not find 'to_wait' method on the target stack."));
|
|
|
|
if (!tmp_to_store_registers)
|
2011-01-06 06:22:53 +08:00
|
|
|
error (_("Could not find 'to_store_registers' "
|
|
|
|
"method on the target stack."));
|
2009-10-23 03:32:11 +08:00
|
|
|
if (!tmp_to_insert_breakpoint)
|
2011-01-06 06:22:53 +08:00
|
|
|
error (_("Could not find 'to_insert_breakpoint' "
|
|
|
|
"method on the target stack."));
|
2009-10-23 03:32:11 +08:00
|
|
|
if (!tmp_to_remove_breakpoint)
|
2011-01-06 06:22:53 +08:00
|
|
|
error (_("Could not find 'to_remove_breakpoint' "
|
|
|
|
"method on the target stack."));
|
2010-03-08 21:34:38 +08:00
|
|
|
if (!tmp_to_stopped_by_watchpoint)
|
2011-01-06 06:22:53 +08:00
|
|
|
error (_("Could not find 'to_stopped_by_watchpoint' "
|
|
|
|
"method on the target stack."));
|
2010-03-08 21:34:38 +08:00
|
|
|
if (!tmp_to_stopped_data_address)
|
2011-01-06 06:22:53 +08:00
|
|
|
error (_("Could not find 'to_stopped_data_address' "
|
|
|
|
"method on the target stack."));
|
2009-10-23 03:32:11 +08:00
|
|
|
|
|
|
|
push_target (&record_ops);
|
|
|
|
}
|
|
|
|
|
2012-04-24 22:33:12 +08:00
|
|
|
static void record_init_record_breakpoints (void);
|
|
|
|
|
2009-10-23 03:32:11 +08:00
|
|
|
/* "to_open" target method. Open the process record target. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_open (char *name, int from_tty)
|
|
|
|
{
|
|
|
|
struct target_ops *t;
|
|
|
|
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog, "Process record: record_open\n");
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
/* Check if record target is already running. */
|
|
|
|
if (current_target.to_stratum == record_stratum)
|
2009-09-27 10:49:34 +08:00
|
|
|
error (_("Process record target already running. Use \"record stop\" to "
|
|
|
|
"stop record target first."));
|
2009-04-30 10:58:37 +08:00
|
|
|
|
2009-10-23 03:32:11 +08:00
|
|
|
/* Reset the tmp beneath pointers. */
|
|
|
|
tmp_to_resume_ops = NULL;
|
|
|
|
tmp_to_resume = NULL;
|
|
|
|
tmp_to_wait_ops = NULL;
|
|
|
|
tmp_to_wait = NULL;
|
|
|
|
tmp_to_store_registers_ops = NULL;
|
|
|
|
tmp_to_store_registers = NULL;
|
|
|
|
tmp_to_xfer_partial_ops = NULL;
|
|
|
|
tmp_to_xfer_partial = NULL;
|
|
|
|
tmp_to_insert_breakpoint = NULL;
|
|
|
|
tmp_to_remove_breakpoint = NULL;
|
2010-03-08 21:34:38 +08:00
|
|
|
tmp_to_stopped_by_watchpoint = NULL;
|
|
|
|
tmp_to_stopped_data_address = NULL;
|
2011-05-27 02:11:33 +08:00
|
|
|
tmp_to_async = NULL;
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
/* Set the beneath function pointers. */
|
|
|
|
for (t = current_target.beneath; t != NULL; t = t->beneath)
|
|
|
|
{
|
2009-10-23 03:32:11 +08:00
|
|
|
if (!tmp_to_resume)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
2009-10-23 03:32:11 +08:00
|
|
|
tmp_to_resume = t->to_resume;
|
|
|
|
tmp_to_resume_ops = t;
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
2009-10-23 03:32:11 +08:00
|
|
|
if (!tmp_to_wait)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
2009-10-23 03:32:11 +08:00
|
|
|
tmp_to_wait = t->to_wait;
|
|
|
|
tmp_to_wait_ops = t;
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
2009-10-23 03:32:11 +08:00
|
|
|
if (!tmp_to_store_registers)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
2009-10-23 03:32:11 +08:00
|
|
|
tmp_to_store_registers = t->to_store_registers;
|
|
|
|
tmp_to_store_registers_ops = t;
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
2009-10-23 03:32:11 +08:00
|
|
|
if (!tmp_to_xfer_partial)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
2009-10-23 03:32:11 +08:00
|
|
|
tmp_to_xfer_partial = t->to_xfer_partial;
|
|
|
|
tmp_to_xfer_partial_ops = t;
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
2009-10-23 03:32:11 +08:00
|
|
|
if (!tmp_to_insert_breakpoint)
|
|
|
|
tmp_to_insert_breakpoint = t->to_insert_breakpoint;
|
|
|
|
if (!tmp_to_remove_breakpoint)
|
|
|
|
tmp_to_remove_breakpoint = t->to_remove_breakpoint;
|
2009-11-22 23:38:59 +08:00
|
|
|
if (!tmp_to_stopped_by_watchpoint)
|
|
|
|
tmp_to_stopped_by_watchpoint = t->to_stopped_by_watchpoint;
|
|
|
|
if (!tmp_to_stopped_data_address)
|
|
|
|
tmp_to_stopped_data_address = t->to_stopped_data_address;
|
2011-05-27 02:11:33 +08:00
|
|
|
if (!tmp_to_async)
|
|
|
|
tmp_to_async = t->to_async;
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
2009-10-23 03:32:11 +08:00
|
|
|
if (!tmp_to_xfer_partial)
|
|
|
|
error (_("Could not find 'to_xfer_partial' method on the target stack."));
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
/* Reset */
|
|
|
|
record_insn_num = 0;
|
2009-10-21 23:21:16 +08:00
|
|
|
record_insn_count = 0;
|
2009-04-30 10:58:37 +08:00
|
|
|
record_list = &record_first;
|
|
|
|
record_list->next = NULL;
|
2009-10-23 03:32:11 +08:00
|
|
|
|
|
|
|
/* Set the tmp beneath pointers to beneath pointers. */
|
|
|
|
record_beneath_to_resume_ops = tmp_to_resume_ops;
|
|
|
|
record_beneath_to_resume = tmp_to_resume;
|
|
|
|
record_beneath_to_wait_ops = tmp_to_wait_ops;
|
|
|
|
record_beneath_to_wait = tmp_to_wait;
|
|
|
|
record_beneath_to_store_registers_ops = tmp_to_store_registers_ops;
|
|
|
|
record_beneath_to_store_registers = tmp_to_store_registers;
|
|
|
|
record_beneath_to_xfer_partial_ops = tmp_to_xfer_partial_ops;
|
|
|
|
record_beneath_to_xfer_partial = tmp_to_xfer_partial;
|
|
|
|
record_beneath_to_insert_breakpoint = tmp_to_insert_breakpoint;
|
|
|
|
record_beneath_to_remove_breakpoint = tmp_to_remove_breakpoint;
|
2009-11-22 23:38:59 +08:00
|
|
|
record_beneath_to_stopped_by_watchpoint = tmp_to_stopped_by_watchpoint;
|
|
|
|
record_beneath_to_stopped_data_address = tmp_to_stopped_data_address;
|
2011-05-27 02:11:33 +08:00
|
|
|
record_beneath_to_async = tmp_to_async;
|
2009-10-23 03:32:11 +08:00
|
|
|
|
2010-07-20 01:51:25 +08:00
|
|
|
if (core_bfd)
|
2009-10-23 03:32:11 +08:00
|
|
|
record_core_open_1 (name, from_tty);
|
|
|
|
else
|
|
|
|
record_open_1 (name, from_tty);
|
2011-05-27 02:11:33 +08:00
|
|
|
|
|
|
|
/* Register extra event sources in the event loop. */
|
|
|
|
record_async_inferior_event_token
|
|
|
|
= create_async_event_handler (record_async_inferior_event_handler,
|
|
|
|
NULL);
|
2012-04-24 22:33:12 +08:00
|
|
|
|
|
|
|
record_init_record_breakpoints ();
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* "to_close" target method. Close the process record target. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
|
|
|
record_close (int quitting)
|
|
|
|
{
|
2009-10-23 03:32:11 +08:00
|
|
|
struct record_core_buf_entry *entry;
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog, "Process record: record_close\n");
|
|
|
|
|
|
|
|
record_list_release (record_list);
|
2009-10-23 03:32:11 +08:00
|
|
|
|
|
|
|
/* Release record_core_regbuf. */
|
|
|
|
if (record_core_regbuf)
|
|
|
|
{
|
|
|
|
xfree (record_core_regbuf);
|
|
|
|
record_core_regbuf = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Release record_core_buf_list. */
|
|
|
|
if (record_core_buf_list)
|
|
|
|
{
|
|
|
|
for (entry = record_core_buf_list->prev; entry; entry = entry->prev)
|
|
|
|
{
|
|
|
|
xfree (record_core_buf_list);
|
|
|
|
record_core_buf_list = entry;
|
|
|
|
}
|
|
|
|
record_core_buf_list = NULL;
|
|
|
|
}
|
2011-05-27 02:11:33 +08:00
|
|
|
|
|
|
|
if (record_async_inferior_event_token)
|
|
|
|
delete_async_event_handler (&record_async_inferior_event_token);
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int record_resume_step = 0;
|
|
|
|
|
2011-05-27 02:11:33 +08:00
|
|
|
/* True if we've been resumed, and so each record_wait call should
|
|
|
|
advance execution. If this is false, record_wait will return a
|
|
|
|
TARGET_WAITKIND_IGNORE. */
|
|
|
|
static int record_resumed = 0;
|
|
|
|
|
|
|
|
/* The execution direction of the last resume we got. This is
|
|
|
|
necessary for async mode. Vis (order is not strictly accurate):
|
|
|
|
|
|
|
|
1. user has the global execution direction set to forward
|
|
|
|
2. user does a reverse-step command
|
|
|
|
3. record_resume is called with global execution direction
|
|
|
|
temporarily switched to reverse
|
|
|
|
4. GDB's execution direction is reverted back to forward
|
|
|
|
5. target record notifies event loop there's an event to handle
|
|
|
|
6. infrun asks the target which direction was it going, and switches
|
|
|
|
the global execution direction accordingly (to reverse)
|
|
|
|
7. infrun polls an event out of the record target, and handles it
|
|
|
|
8. GDB goes back to the event loop, and goto #4.
|
|
|
|
*/
|
|
|
|
static enum exec_direction_kind record_execution_dir = EXEC_FORWARD;
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* "to_resume" target method. Resume the process record target. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
|
|
|
record_resume (struct target_ops *ops, ptid_t ptid, int step,
|
2012-05-25 00:39:15 +08:00
|
|
|
enum gdb_signal signal)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
|
|
|
record_resume_step = step;
|
2011-05-27 02:11:33 +08:00
|
|
|
record_resumed = 1;
|
|
|
|
record_execution_dir = execution_direction;
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
if (!RECORD_IS_REPLAY)
|
|
|
|
{
|
2010-07-19 15:55:43 +08:00
|
|
|
struct gdbarch *gdbarch = target_thread_architecture (ptid);
|
|
|
|
|
2009-12-22 11:16:40 +08:00
|
|
|
record_message (get_current_regcache (), signal);
|
2010-07-19 15:55:43 +08:00
|
|
|
|
|
|
|
if (!step)
|
|
|
|
{
|
|
|
|
/* This is not hard single step. */
|
|
|
|
if (!gdbarch_software_single_step_p (gdbarch))
|
|
|
|
{
|
|
|
|
/* This is a normal continue. */
|
|
|
|
step = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* This arch support soft sigle step. */
|
|
|
|
if (single_step_breakpoints_inserted ())
|
|
|
|
{
|
|
|
|
/* This is a soft single step. */
|
|
|
|
record_resume_step = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* This is a continue.
|
|
|
|
Try to insert a soft single step breakpoint. */
|
|
|
|
if (!gdbarch_software_single_step (gdbarch,
|
|
|
|
get_current_frame ()))
|
|
|
|
{
|
|
|
|
/* This system don't want use soft single step.
|
|
|
|
Use hard sigle step. */
|
|
|
|
step = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
record_beneath_to_resume (record_beneath_to_resume_ops,
|
|
|
|
ptid, step, signal);
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
2011-05-27 02:11:33 +08:00
|
|
|
|
|
|
|
/* We are about to start executing the inferior (or simulate it),
|
|
|
|
let's register it with the event loop. */
|
|
|
|
if (target_can_async_p ())
|
|
|
|
{
|
|
|
|
target_async (inferior_event_handler, 0);
|
|
|
|
/* Notify the event loop there's an event to wait for. We do
|
|
|
|
most of the work in record_wait. */
|
|
|
|
mark_async_event_handler (record_async_inferior_event_token);
|
|
|
|
}
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int record_get_sig = 0;
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* SIGINT signal handler, registered by "to_wait" method. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
|
|
|
record_sig_handler (int signo)
|
|
|
|
{
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog, "Process record: get a signal\n");
|
|
|
|
|
|
|
|
/* It will break the running inferior in replay mode. */
|
|
|
|
record_resume_step = 1;
|
|
|
|
|
|
|
|
/* It will let record_wait set inferior status to get the signal
|
|
|
|
SIGINT. */
|
|
|
|
record_get_sig = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_wait_cleanups (void *ignore)
|
|
|
|
{
|
|
|
|
if (execution_direction == EXEC_REVERSE)
|
|
|
|
{
|
|
|
|
if (record_list->next)
|
|
|
|
record_list = record_list->next;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
record_list = record_list->prev;
|
|
|
|
}
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* "to_wait" target method for process record target.
|
|
|
|
|
|
|
|
In record mode, the target is always run in singlestep mode
|
|
|
|
(even when gdb says to continue). The to_wait method intercepts
|
|
|
|
the stop events and determines which ones are to be passed on to
|
|
|
|
gdb. Most stop events are just singlestep events that gdb is not
|
|
|
|
to know about, so the to_wait method just records them and keeps
|
|
|
|
singlestepping.
|
|
|
|
|
|
|
|
In replay mode, this function emulates the recorded execution log,
|
|
|
|
one instruction at a time (forward or backward), and determines
|
|
|
|
where to stop. */
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
static ptid_t
|
2011-05-27 02:11:33 +08:00
|
|
|
record_wait_1 (struct target_ops *ops,
|
|
|
|
ptid_t ptid, struct target_waitstatus *status,
|
|
|
|
int options)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
|
|
|
struct cleanup *set_cleanups = record_gdb_operation_disable_set ();
|
|
|
|
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: record_wait "
|
2011-05-27 02:11:33 +08:00
|
|
|
"record_resume_step = %d, record_resumed = %d, direction=%s\n",
|
|
|
|
record_resume_step, record_resumed,
|
|
|
|
record_execution_dir == EXEC_FORWARD ? "forward" : "reverse");
|
|
|
|
|
|
|
|
if (!record_resumed)
|
|
|
|
{
|
|
|
|
gdb_assert ((options & TARGET_WNOHANG) != 0);
|
|
|
|
|
|
|
|
/* No interesting event. */
|
|
|
|
status->kind = TARGET_WAITKIND_IGNORE;
|
|
|
|
return minus_one_ptid;
|
|
|
|
}
|
2009-04-30 10:58:37 +08:00
|
|
|
|
2010-06-08 10:25:31 +08:00
|
|
|
record_get_sig = 0;
|
|
|
|
signal (SIGINT, record_sig_handler);
|
|
|
|
|
2009-10-23 03:32:11 +08:00
|
|
|
if (!RECORD_IS_REPLAY && ops != &record_core_ops)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
|
|
|
if (record_resume_step)
|
|
|
|
{
|
|
|
|
/* This is a single step. */
|
|
|
|
return record_beneath_to_wait (record_beneath_to_wait_ops,
|
2009-08-21 14:16:51 +08:00
|
|
|
ptid, status, options);
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* This is not a single step. */
|
|
|
|
ptid_t ret;
|
|
|
|
CORE_ADDR tmp_pc;
|
2010-07-19 15:55:43 +08:00
|
|
|
struct gdbarch *gdbarch = target_thread_architecture (inferior_ptid);
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
ret = record_beneath_to_wait (record_beneath_to_wait_ops,
|
2009-08-21 14:16:51 +08:00
|
|
|
ptid, status, options);
|
2011-05-27 02:11:33 +08:00
|
|
|
if (status->kind == TARGET_WAITKIND_IGNORE)
|
|
|
|
{
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: record_wait "
|
|
|
|
"target beneath not done yet\n");
|
|
|
|
return ret;
|
|
|
|
}
|
2009-04-30 10:58:37 +08:00
|
|
|
|
2010-07-19 15:55:43 +08:00
|
|
|
if (single_step_breakpoints_inserted ())
|
|
|
|
remove_single_step_breakpoints ();
|
|
|
|
|
2010-06-08 10:25:31 +08:00
|
|
|
if (record_resume_step)
|
2011-05-27 02:11:33 +08:00
|
|
|
return ret;
|
2010-06-08 10:25:31 +08:00
|
|
|
|
2009-09-21 13:54:09 +08:00
|
|
|
/* Is this a SIGTRAP? */
|
2009-04-30 10:58:37 +08:00
|
|
|
if (status->kind == TARGET_WAITKIND_STOPPED
|
2012-05-25 00:51:47 +08:00
|
|
|
&& status->value.sig == GDB_SIGNAL_TRAP)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
Add base multi-executable/process support to GDB.
gdb/
* Makefile.in (SFILES): Add progspace.c.
(COMMON_OBS): Add progspace.o.
* progspace.h: New.
* progspace.c: New.
* breakpoint.h (struct bp_target_info) <placed_address_space>: New
field.
(struct bp_location) <pspace>: New field.
(struct breakpoint) <pspace>: New field.
(bpstat_stop_status, breakpoint_here_p)
(moribund_breakpoint_here_p, breakpoint_inserted_here_p)
(regular_breakpoint_inserted_here_p)
(software_breakpoint_inserted_here_p, breakpoint_thread_match)
(set_default_breakpoint): Adjust prototypes.
(remove_breakpoints_pid, breakpoint_program_space_exit): Declare.
(insert_single_step_breakpoint, deprecated_insert_raw_breakpoint):
Adjust prototypes.
* breakpoint.c (executing_startup): Delete.
(default_breakpoint_sspace): New.
(breakpoint_restore_shadows): Skip if the address space doesn't
match.
(update_watchpoint): Record the frame's program space in the
breakpoint location.
(insert_bp_location): Record the address space in target_info.
Adjust to pass the symbol space to solib_name_from_address.
(breakpoint_program_space_exit): New.
(insert_breakpoint_locations): Switch the symbol space and thread
when inserting breakpoints. Don't insert breakpoints in a vfork
parent waiting for vfork done if we're not attached to the vfork
child.
(remove_breakpoints_pid): New.
(reattach_breakpoints): Switch to a thread of PID. Ignore
breakpoints of other symbol spaces.
(create_internal_breakpoint): Store the symbol space in the sal.
(create_longjmp_master_breakpoint): Iterate over all symbol
spaces.
(update_breakpoints_after_exec): Ignore breakpoints for other
symbol spaces.
(remove_breakpoint): Rename to ...
(remove_breakpoint_1): ... this. Pass the breakpoints symbol
space to solib_name_from_address.
(remove_breakpoint): New.
(mark_breakpoints_out): Ignore breakpoints from other symbol
spaces.
(breakpoint_init_inferior): Ditto.
(breakpoint_here_p): Add an address space argument and adjust to
use breakpoint_address_match.
(moribund_breakpoint_here_p): Ditto.
(regular_breakpoint_inserted_here_p): Ditto.
(breakpoint_inserted_here_p): Ditto.
(software_breakpoint_inserted_here_p): Ditto.
(breakpoint_thread_match): Ditto.
(bpstat_check_location): Ditto.
(bpstat_stop_status): Ditto.
(print_breakpoint_location): If there's a location to print,
switch the current symbol space.
(print_one_breakpoint_location): Add `allflag' argument.
(print_one_breakpoint): Ditto. Adjust.
(do_captured_breakpoint_query): Adjust.
(breakpoint_1): Adjust.
(breakpoint_has_pc): Also match the symbol space.
(describe_other_breakpoints): Add a symbol space argument and
adjust.
(set_default_breakpoint): Add a symbol space argument. Set
default_breakpoint_sspace.
(breakpoint_address_match): New.
(check_duplicates_for): Add an address space argument, and adjust.
(set_raw_breakpoint): Record the symbol space in the location and
in the breakpoint.
(set_longjmp_breakpoint): Skip longjmp master breakpoints from
other symbol spaces.
(remove_thread_event_breakpoints, remove_solib_event_breakpoints)
(disable_breakpoints_in_shlibs): Skip breakpoints from other
symbol spaces.
(disable_breakpoints_in_unloaded_shlib): Match symbol spaces.
(create_catchpoint): Set the symbol space in the sal.
(disable_breakpoints_before_startup): Skip breakpoints from other
symbol spaces. Set executing_startup in the current symbol space.
(enable_breakpoints_after_startup): Clear executing_startup in the
current symbol space. Skip breakpoints from other symbol spaces.
(clone_momentary_breakpoint): Also copy the symbol space.
(add_location_to_breakpoint): Set the location's symbol space.
(bp_loc_is_permanent): Switch thread and symbol space.
(create_breakpoint): Adjust.
(expand_line_sal_maybe): Expand comment to mention symbol spaces.
Switch thread and symbol space when reading memory.
(parse_breakpoint_sals): Set the symbol space in the sal.
(break_command_really): Ditto.
(skip_prologue_sal): Switch and space.
(resolve_sal_pc): Ditto.
(watch_command_1): Record the symbol space in the sal.
(create_ada_exception_breakpoint): Adjust.
(clear_command): Adjust. Match symbol spaces.
(update_global_location_list): Use breakpoint_address_match.
(breakpoint_re_set_one): Switch thread and space.
(breakpoint_re_set): Save symbol space.
(breakpoint_re_set_thread): Also reset the symbol space.
(deprecated_insert_raw_breakpoint): Add an address space argument.
Adjust.
(insert_single_step_breakpoint): Ditto.
(single_step_breakpoint_inserted_here_p): Ditto.
(clear_syscall_counts): New.
(_initialize_breakpoint): Install it as inferior_exit observer.
* exec.h: Include "progspace.h".
(exec_bfd, exec_bfd_mtime): New defines.
(exec_close): Declare.
* exec.c: Include "gdbthread.h" and "progspace.h".
(exec_bfd, exec_bfd_mtime, current_target_sections_1): Delete.
(using_exec_ops): New.
(exec_close_1): Rename to exec_close, and make public.
(exec_close): Rename to exec_close_1, and adjust all callers. Add
description. Remove target sections and close executables from
all program spaces.
(exec_file_attach): Add comment.
(add_target_sections): Check on `using_exec_ops' to check if the
target should be pushed.
(remove_target_sections): Only unpush the target if there are no
more target sections in any symbol space.
* gdbcore.h: Include "exec.h".
(exec_bfd, exec_bfd_mtime): Remove declarations.
* frame.h (get_frame_program_space, get_frame_address_space)
(frame_unwind_program_space): Declare.
* frame.c (struct frame_info) <pspace, aspace>: New fields.
(create_sentinel_frame): Add program space argument. Set the
pspace and aspace fields of the frame object.
(get_current_frame, create_new_frame): Adjust.
(get_frame_program_space): New.
(frame_unwind_program_space): New.
(get_frame_address_space): New.
* stack.c (print_frame_info): Adjust.
(print_frame): Use the frame's program space.
* gdbthread.h (any_live_thread_of_process): Declare.
* thread.c (any_live_thread_of_process): New.
(switch_to_thread): Switch the program space as well.
(restore_selected_frame): Don't warn if trying to restore frame
level 0.
* inferior.h: Include "progspace.h".
(detach_fork): Declare.
(struct inferior) <removable, aspace, pspace>
<vfork_parent, vfork_child, pending_detach>
<waiting_for_vfork_done>: New fields.
<terminal_info>: Remove field.
<data, num_data>: New fields.
(register_inferior_data, register_inferior_data_with_cleanup)
(clear_inferior_data, set_inferior_data, inferior_data): Declare.
(exit_inferior, exit_inferior_silent, exit_inferior_num_silent)
(inferior_appeared): Declare.
(find_inferior_pid): Typo.
(find_inferior_id, find_inferior_for_program_space): Declare.
(set_current_inferior, save_current_inferior, prune_inferiors)
(number_of_inferiors): Declare.
(inferior_list): Declare.
* inferior.c: Include "gdbcore.h" and "symfile.h".
(inferior_list): Make public.
(delete_inferior_1): Always delete thread silently.
(find_inferior_id): Make public.
(current_inferior_): New.
(current_inferior): Use it.
(set_current_inferior): New.
(restore_inferior): New.
(save_current_inferior): New.
(free_inferior): Free the per-inferior data.
(add_inferior_silent): Allocate per-inferior data.
Call inferior_appeared.
(delete_threads_of_inferior): New.
(delete_inferior_1): Adjust interface to take an inferior pointer.
(delete_inferior): Adjust.
(delete_inferior_silent): Adjust.
(exit_inferior_1): New.
(exit_inferior): New.
(exit_inferior_silent): New.
(exit_inferior_num_silent): New.
(detach_inferior): Adjust.
(inferior_appeared): New.
(discard_all_inferiors): Adjust.
(find_inferior_id): Make public. Assert pid is not zero.
(find_inferior_for_program_space): New.
(have_inferiors): Check if we have any inferior with pid not zero.
(have_live_inferiors): Go over all pushed targets looking for
process_stratum.
(prune_inferiors): New.
(number_of_inferiors): New.
(print_inferior): Add executable column. Print vfork parent/child
relationships.
(inferior_command): Adjust to cope with not running inferiors.
(remove_inferior_command): New.
(add_inferior_command): New.
(clone_inferior_command): New.
(struct inferior_data): New.
(struct inferior_data_registration): New.
(struct inferior_data_registry): New.
(inferior_data_registry): New.
(register_inferior_data_with_cleanup): New.
(register_inferior_data): New.
(inferior_alloc_data): New.
(inferior_free_data): New.
(clear_inferior_data): New.
(set_inferior_data): New.
(inferior_data): New.
(initialize_inferiors): New.
(_initialize_inferiors): Register "add-inferior",
"remove-inferior" and "clone-inferior" commands.
* objfiles.h: Include "progspace.h".
(struct objfile) <pspace>: New field.
(symfile_objfile, object_files): Don't declare.
(ALL_PSPACE_OBJFILES): New.
(ALL_PSPACE_OBJFILES_SAFE): New.
(ALL_OBJFILES, ALL_OBJFILES_SAFE): Adjust.
(ALL_PSPACE_SYMTABS): New.
(ALL_PRIMARY_SYMTABS): Adjust.
(ALL_PSPACE_PRIMARY_SYMTABS): New.
(ALL_PSYMTABS): Adjust.
(ALL_PSPACE_PSYMTABS): New.
* objfiles.c (object_files, symfile_objfile): Delete.
(struct objfile_sspace_info): New.
(objfiles_pspace_data): New.
(objfiles_pspace_data_cleanup): New.
(get_objfile_pspace_data): New.
(objfiles_changed_p): Delete.
(allocate_objfile): Set the objfile's program space. Adjust to
reference objfiles_changed_p in pspace data.
(free_objfile): Adjust to reference objfiles_changed_p in pspace
data.
(objfile_relocate): Ditto.
(update_section_map): Add pspace argument. Adjust to iterate over
objfiles in the passed in pspace.
(find_pc_section): Delete sections and num_sections statics.
Adjust to refer to program space's objfiles_changed_p. Adjust to
refer to sections and num_sections store in the objfile's pspace
data.
(objfiles_changed): Adjust to reference objfiles_changed_p in
pspace data.
(_initialize_objfiles): New.
* linespec.c (decode_all_digits, decode_dollar): Set the sal's
program space.
* source.c (current_source_pspace): New.
(get_current_source_symtab_and_line): Set the sal's program space.
(set_current_source_symtab_and_line): Set current_source_pspace.
(select_source_symtab): Ditto. Use ALL_OBJFILES.
(forget_cached_source_info): Iterate over all program spaces.
* symfile.c (clear_symtab_users): Adjust.
* symmisc.c (print_symbol_bcache_statistics): Iterate over all
program spaces.
(print_objfile_statistics): Ditto.
(maintenance_print_msymbols): Ditto.
(maintenance_print_objfiles): Ditto.
(maintenance_info_symtabs): Ditto.
(maintenance_info_psymtabs): Ditto.
* symtab.h (SYMTAB_PSPACE): New.
(struct symtab_and_line) <pspace>: New field.
* symtab.c (init_sal): Clear the sal's program space.
(find_pc_sect_symtab): Set the sal's program space. Switch thread
and space.
(append_expanded_sal): Add program space argument. Iterate over
all program spaces.
(expand_line_sal): Iterate over all program spaces. Switch
program space.
* target.h (enum target_waitkind) <TARGET_WAITKIND_VFORK_DONE>: New.
(struct target_ops) <to_thread_address_space>: New field.
(target_thread_address_space): Define.
* target.c (target_detach): Only remove breakpoints from the
inferior we're detaching.
(target_thread_address_space): New.
* defs.h (initialize_progspace): Declare.
* top.c (gdb_init): Call it.
* solist.h (struct so_list) <sspace>: New field.
* solib.h (struct program_space): Forward declare.
(solib_name_from_address): Adjust prototype.
* solib.c (so_list_head): Replace with a macro referencing the
program space.
(update_solib_list): Set the so's program space.
(solib_name_from_address): Add a program space argument and adjust.
* solib-svr4.c (struct svr4_info) <pid>: Delete field.
<interp_text_sect_low, interp_text_sect_high, interp_plt_sect_low>
<interp_plt_sect_high>: New fields.
(svr4_info_p, svr4_info): Delete.
(solib_svr4_sspace_data): New.
(get_svr4_info): Rewrite.
(svr4_sspace_data_cleanup): New.
(open_symbol_file_object): Adjust.
(svr4_default_sos): Adjust.
(svr4_fetch_objfile_link_map): Adjust.
(interp_text_sect_low, interp_text_sect_high, interp_plt_sect_low)
(interp_plt_sect_high): Delete.
(svr4_in_dynsym_resolve_code): Adjust.
(enable_break): Adjust.
(svr4_clear_solib): Revert bit that removed the svr4_info here,
and reinstate clearing debug_base, debug_loader_offset_p,
debug_loader_offset and debug_loader_name.
(_initialize_svr4_solib): Register solib_svr4_pspace_data. Don't
install an inferior_exit observer anymore.
* printcmd.c (struct display) <pspace>: New field.
(display_command): Set the display's sspace.
(do_one_display): Match the display's sspace.
(display_uses_solib_p): Ditto.
* linux-fork.c (detach_fork): Moved to infrun.c.
(_initialize_linux_fork): Moved "detach-on-fork" command to
infrun.c.
* infrun.c (detach_fork): Moved from linux-fork.c.
(proceed_after_vfork_done): New.
(handle_vfork_child_exec_or_exit): New.
(follow_exec_mode_replace, follow_exec_mode_keep)
(follow_exec_mode_names, follow_exec_mode_string)
(show_follow_exec_mode_string): New.
(follow_exec): New. Reinstate the mark_breakpoints_out call.
Remove shared libraries before attaching new executable. If user
wants to keep the inferior, keep it.
(displaced_step_fixup): Adjust to pass an address space to the
breakpoints module.
(resume): Ditto.
(clear_proceed_status): In all-stop mode, always clear the proceed
status of all threads.
(prepare_to_proceed): Adjust to pass an address space to the
breakpoints module.
(proceed): Ditto.
(adjust_pc_after_break): Ditto.
(handle_inferior_event): When handling a process exit, switch the
program space to the inferior's that had exited. Call
handle_vfork_child_exec_or_exit. Adjust to pass an address space
to the breakpoints module. In non-stop mode, when following a
fork and detach-fork is off, also resume the other branch. Handle
TARGET_WAITKIND_VFORK_DONE. Set the program space in sals.
(normal_stop): Prune inferiors.
(_initialize_infrun): Install the new "follow-exec-mode" command.
"detach-on-fork" moved here.
* regcache.h (get_regcache_aspace): Declare.
* regcache.c (struct regcache) <aspace>: New field.
(regcache_xmalloc): Clear the aspace.
(get_regcache_aspace): New.
(regcache_cpy): Copy the aspace field.
(regcache_cpy_no_passthrough): Ditto.
(get_thread_regcache): Fetch the thread's address space from the
target, and store it in the regcache.
* infcall.c (call_function_by_hand): Set the sal's pspace.
* arch-utils.c (default_has_shared_address_space): New.
* arch-utils.h (default_has_shared_address_space): Declare.
* gdbarch.sh (has_shared_address_space): New.
* gdbarch.h, gdbarch.c: Regenerate.
* linux-tdep.c: Include auxv.h, target.h, elf/common.h.
(linux_has_shared_address_space): New.
(_initialize_linux_tdep): Declare.
* arm-tdep.c (arm_software_single_step): Pass the frame's address
space to insert_single_step_breakpoint.
* arm-linux-tdep.c (arm_linux_software_single_step): Pass the
frame's pspace to breakpoint functions.
* cris-tdep.c (crisv32_single_step_through_delay): Ditto.
(cris_software_single_step): Ditto.
* mips-tdep.c (deal_with_atomic_sequence): Add frame argument.
Pass the frame's pspace to breakpoint functions.
(mips_software_single_step): Adjust.
(mips_single_step_through_delay): Adjust.
* rs6000-aix-tdep.c (rs6000_software_single_step): Adjust.
* rs6000-tdep.c (ppc_deal_with_atomic_sequence): Adjust.
* solib-irix.c (enable_break): Adjust to pass the current frame's
address space to breakpoint functions.
* sparc-tdep.c (sparc_software_single_step): Ditto.
* spu-tdep.c (spu_software_single_step): Ditto.
* alpha-tdep.c (alpha_software_single_step): Ditto.
* record.c (record_wait): Adjust to pass an address space to the
breakpoints module.
* fork-child.c (fork_inferior): Set the new inferior's program and
address spaces.
* inf-ptrace.c (inf_ptrace_follow_fork): Copy the parent's program
and address spaces.
(inf_ptrace_attach): Set the inferior's program and address spaces.
* linux-nat.c: Include "solib.h".
(linux_child_follow_fork): Manage parent and child's program and
address spaces. Clone the parent's program space if necessary.
Don't wait for the vfork to be done here. Refuse to resume if
following the vfork parent while leaving the child stopped.
(resume_callback): Don't resume a vfork parent.
(linux_nat_resume): Also check for pending events in the
lp->waitstatus field.
(linux_handle_extended_wait): Report TARGET_WAITKIND_VFORK_DONE
events to the core.
(stop_wait_callback): Don't wait for SIGSTOP on vfork parents.
(cancel_breakpoint): Adjust.
* linux-thread-db.c (thread_db_wait): Don't remove thread event
breakpoints here.
(thread_db_mourn_inferior): Don't mark breakpoints out here.
Remove thread event breakpoints after mourning.
* corelow.c: Include progspace.h.
(core_open): Set the inferior's program and address spaces.
* remote.c (remote_add_inferior): Set the new inferior's program
and address spaces.
(remote_start_remote): Update address spaces.
(extended_remote_create_inferior_1): Don't init the thread list if
we already debugging other inferiors.
* darwin-nat.c (darwin_attach): Set the new inferior's program and
address spaces.
* gnu-nat.c (gnu_attach): Ditto.
* go32-nat.c (go32_create_inferior): Ditto.
* inf-ttrace.c (inf_ttrace_follow_fork, inf_ttrace_attach): Ditto.
* monitor.c (monitor_open): Ditto.
* nto-procfs.c (procfs_attach, procfs_create_inferior): Ditto.
* procfs.c (do_attach): Ditto.
* windows-nat.c (do_initial_windows_stuff): Ditto.
* inflow.c (inferior_process_group)
(terminal_init_inferior_with_pgrp, terminal_inferior,
(terminal_ours_1, inflow_inferior_exit, copy_terminal_info)
(child_terminal_info, new_tty_postfork, set_sigint_trap): Adjust
to use per-inferior data instead of inferior->terminal_info.
(inflow_inferior_data): New.
(inflow_new_inferior): Delete.
(inflow_inferior_data_cleanup): New.
(get_inflow_inferior_data): New.
* mi/mi-interp.c (mi_new_inferior): Rename to...
(mi_inferior_appeared): ... this.
(mi_interpreter_init): Adjust.
* tui/tui-disasm.c: Include "progspace.h".
(tui_set_disassem_content): Pass an address space to
breakpoint_here_p.
* NEWS: Mention multi-program debugging support. Mention new
commands "add-inferior", "clone-inferior", "remove-inferior",
"maint info program-spaces", and new option "set
follow-exec-mode".
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
gdb/doc/
* observer.texi (new_inferior): Rename to...
(inferior_appeared): ... this.
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
gdb/testsuite/
* gdb.base/foll-vfork.exp: Adjust to spell out "follow-fork".
* gdb.base/foll-exec.exp: Adjust to expect a process id before
"Executing new program".
* gdb.base/foll-fork.exp: Adjust to spell out "follow-fork".
* gdb.base/multi-forks.exp: Ditto. Adjust to the inferior being
left listed after having been killed.
* gdb.base/attach.exp: Adjust to spell out "symbol-file".
* gdb.base/maint.exp: Adjust test.
* Makefile.in (ALL_SUBDIRS): Add gdb.multi.
* gdb.multi/Makefile.in: New.
* gdb.multi/base.exp: New.
* gdb.multi/goodbye.c: New.
* gdb.multi/hangout.c: New.
* gdb.multi/hello.c: New.
* gdb.multi/bkpt-multi-exec.c: New.
* gdb.multi/bkpt-multi-exec.exp: New.
* gdb.multi/crashme.c: New.
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
gdb/doc/
* gdb.texinfo (Inferiors): Rename node to ...
(Inferiors and Programs): ... this. Mention running multiple
programs in the same debug session.
<info inferiors>: Mention the new 'Executable' column if "info
inferiors". Update examples. Document the "add-inferior",
"clone-inferior", "remove-inferior" and "maint info
program-spaces" commands.
(Process): Rename node to...
(Forks): ... this. Document "set|show follow-exec-mode".
2009-10-19 17:51:43 +08:00
|
|
|
struct regcache *regcache;
|
2009-11-22 23:47:31 +08:00
|
|
|
struct address_space *aspace;
|
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
Add base multi-executable/process support to GDB.
gdb/
* Makefile.in (SFILES): Add progspace.c.
(COMMON_OBS): Add progspace.o.
* progspace.h: New.
* progspace.c: New.
* breakpoint.h (struct bp_target_info) <placed_address_space>: New
field.
(struct bp_location) <pspace>: New field.
(struct breakpoint) <pspace>: New field.
(bpstat_stop_status, breakpoint_here_p)
(moribund_breakpoint_here_p, breakpoint_inserted_here_p)
(regular_breakpoint_inserted_here_p)
(software_breakpoint_inserted_here_p, breakpoint_thread_match)
(set_default_breakpoint): Adjust prototypes.
(remove_breakpoints_pid, breakpoint_program_space_exit): Declare.
(insert_single_step_breakpoint, deprecated_insert_raw_breakpoint):
Adjust prototypes.
* breakpoint.c (executing_startup): Delete.
(default_breakpoint_sspace): New.
(breakpoint_restore_shadows): Skip if the address space doesn't
match.
(update_watchpoint): Record the frame's program space in the
breakpoint location.
(insert_bp_location): Record the address space in target_info.
Adjust to pass the symbol space to solib_name_from_address.
(breakpoint_program_space_exit): New.
(insert_breakpoint_locations): Switch the symbol space and thread
when inserting breakpoints. Don't insert breakpoints in a vfork
parent waiting for vfork done if we're not attached to the vfork
child.
(remove_breakpoints_pid): New.
(reattach_breakpoints): Switch to a thread of PID. Ignore
breakpoints of other symbol spaces.
(create_internal_breakpoint): Store the symbol space in the sal.
(create_longjmp_master_breakpoint): Iterate over all symbol
spaces.
(update_breakpoints_after_exec): Ignore breakpoints for other
symbol spaces.
(remove_breakpoint): Rename to ...
(remove_breakpoint_1): ... this. Pass the breakpoints symbol
space to solib_name_from_address.
(remove_breakpoint): New.
(mark_breakpoints_out): Ignore breakpoints from other symbol
spaces.
(breakpoint_init_inferior): Ditto.
(breakpoint_here_p): Add an address space argument and adjust to
use breakpoint_address_match.
(moribund_breakpoint_here_p): Ditto.
(regular_breakpoint_inserted_here_p): Ditto.
(breakpoint_inserted_here_p): Ditto.
(software_breakpoint_inserted_here_p): Ditto.
(breakpoint_thread_match): Ditto.
(bpstat_check_location): Ditto.
(bpstat_stop_status): Ditto.
(print_breakpoint_location): If there's a location to print,
switch the current symbol space.
(print_one_breakpoint_location): Add `allflag' argument.
(print_one_breakpoint): Ditto. Adjust.
(do_captured_breakpoint_query): Adjust.
(breakpoint_1): Adjust.
(breakpoint_has_pc): Also match the symbol space.
(describe_other_breakpoints): Add a symbol space argument and
adjust.
(set_default_breakpoint): Add a symbol space argument. Set
default_breakpoint_sspace.
(breakpoint_address_match): New.
(check_duplicates_for): Add an address space argument, and adjust.
(set_raw_breakpoint): Record the symbol space in the location and
in the breakpoint.
(set_longjmp_breakpoint): Skip longjmp master breakpoints from
other symbol spaces.
(remove_thread_event_breakpoints, remove_solib_event_breakpoints)
(disable_breakpoints_in_shlibs): Skip breakpoints from other
symbol spaces.
(disable_breakpoints_in_unloaded_shlib): Match symbol spaces.
(create_catchpoint): Set the symbol space in the sal.
(disable_breakpoints_before_startup): Skip breakpoints from other
symbol spaces. Set executing_startup in the current symbol space.
(enable_breakpoints_after_startup): Clear executing_startup in the
current symbol space. Skip breakpoints from other symbol spaces.
(clone_momentary_breakpoint): Also copy the symbol space.
(add_location_to_breakpoint): Set the location's symbol space.
(bp_loc_is_permanent): Switch thread and symbol space.
(create_breakpoint): Adjust.
(expand_line_sal_maybe): Expand comment to mention symbol spaces.
Switch thread and symbol space when reading memory.
(parse_breakpoint_sals): Set the symbol space in the sal.
(break_command_really): Ditto.
(skip_prologue_sal): Switch and space.
(resolve_sal_pc): Ditto.
(watch_command_1): Record the symbol space in the sal.
(create_ada_exception_breakpoint): Adjust.
(clear_command): Adjust. Match symbol spaces.
(update_global_location_list): Use breakpoint_address_match.
(breakpoint_re_set_one): Switch thread and space.
(breakpoint_re_set): Save symbol space.
(breakpoint_re_set_thread): Also reset the symbol space.
(deprecated_insert_raw_breakpoint): Add an address space argument.
Adjust.
(insert_single_step_breakpoint): Ditto.
(single_step_breakpoint_inserted_here_p): Ditto.
(clear_syscall_counts): New.
(_initialize_breakpoint): Install it as inferior_exit observer.
* exec.h: Include "progspace.h".
(exec_bfd, exec_bfd_mtime): New defines.
(exec_close): Declare.
* exec.c: Include "gdbthread.h" and "progspace.h".
(exec_bfd, exec_bfd_mtime, current_target_sections_1): Delete.
(using_exec_ops): New.
(exec_close_1): Rename to exec_close, and make public.
(exec_close): Rename to exec_close_1, and adjust all callers. Add
description. Remove target sections and close executables from
all program spaces.
(exec_file_attach): Add comment.
(add_target_sections): Check on `using_exec_ops' to check if the
target should be pushed.
(remove_target_sections): Only unpush the target if there are no
more target sections in any symbol space.
* gdbcore.h: Include "exec.h".
(exec_bfd, exec_bfd_mtime): Remove declarations.
* frame.h (get_frame_program_space, get_frame_address_space)
(frame_unwind_program_space): Declare.
* frame.c (struct frame_info) <pspace, aspace>: New fields.
(create_sentinel_frame): Add program space argument. Set the
pspace and aspace fields of the frame object.
(get_current_frame, create_new_frame): Adjust.
(get_frame_program_space): New.
(frame_unwind_program_space): New.
(get_frame_address_space): New.
* stack.c (print_frame_info): Adjust.
(print_frame): Use the frame's program space.
* gdbthread.h (any_live_thread_of_process): Declare.
* thread.c (any_live_thread_of_process): New.
(switch_to_thread): Switch the program space as well.
(restore_selected_frame): Don't warn if trying to restore frame
level 0.
* inferior.h: Include "progspace.h".
(detach_fork): Declare.
(struct inferior) <removable, aspace, pspace>
<vfork_parent, vfork_child, pending_detach>
<waiting_for_vfork_done>: New fields.
<terminal_info>: Remove field.
<data, num_data>: New fields.
(register_inferior_data, register_inferior_data_with_cleanup)
(clear_inferior_data, set_inferior_data, inferior_data): Declare.
(exit_inferior, exit_inferior_silent, exit_inferior_num_silent)
(inferior_appeared): Declare.
(find_inferior_pid): Typo.
(find_inferior_id, find_inferior_for_program_space): Declare.
(set_current_inferior, save_current_inferior, prune_inferiors)
(number_of_inferiors): Declare.
(inferior_list): Declare.
* inferior.c: Include "gdbcore.h" and "symfile.h".
(inferior_list): Make public.
(delete_inferior_1): Always delete thread silently.
(find_inferior_id): Make public.
(current_inferior_): New.
(current_inferior): Use it.
(set_current_inferior): New.
(restore_inferior): New.
(save_current_inferior): New.
(free_inferior): Free the per-inferior data.
(add_inferior_silent): Allocate per-inferior data.
Call inferior_appeared.
(delete_threads_of_inferior): New.
(delete_inferior_1): Adjust interface to take an inferior pointer.
(delete_inferior): Adjust.
(delete_inferior_silent): Adjust.
(exit_inferior_1): New.
(exit_inferior): New.
(exit_inferior_silent): New.
(exit_inferior_num_silent): New.
(detach_inferior): Adjust.
(inferior_appeared): New.
(discard_all_inferiors): Adjust.
(find_inferior_id): Make public. Assert pid is not zero.
(find_inferior_for_program_space): New.
(have_inferiors): Check if we have any inferior with pid not zero.
(have_live_inferiors): Go over all pushed targets looking for
process_stratum.
(prune_inferiors): New.
(number_of_inferiors): New.
(print_inferior): Add executable column. Print vfork parent/child
relationships.
(inferior_command): Adjust to cope with not running inferiors.
(remove_inferior_command): New.
(add_inferior_command): New.
(clone_inferior_command): New.
(struct inferior_data): New.
(struct inferior_data_registration): New.
(struct inferior_data_registry): New.
(inferior_data_registry): New.
(register_inferior_data_with_cleanup): New.
(register_inferior_data): New.
(inferior_alloc_data): New.
(inferior_free_data): New.
(clear_inferior_data): New.
(set_inferior_data): New.
(inferior_data): New.
(initialize_inferiors): New.
(_initialize_inferiors): Register "add-inferior",
"remove-inferior" and "clone-inferior" commands.
* objfiles.h: Include "progspace.h".
(struct objfile) <pspace>: New field.
(symfile_objfile, object_files): Don't declare.
(ALL_PSPACE_OBJFILES): New.
(ALL_PSPACE_OBJFILES_SAFE): New.
(ALL_OBJFILES, ALL_OBJFILES_SAFE): Adjust.
(ALL_PSPACE_SYMTABS): New.
(ALL_PRIMARY_SYMTABS): Adjust.
(ALL_PSPACE_PRIMARY_SYMTABS): New.
(ALL_PSYMTABS): Adjust.
(ALL_PSPACE_PSYMTABS): New.
* objfiles.c (object_files, symfile_objfile): Delete.
(struct objfile_sspace_info): New.
(objfiles_pspace_data): New.
(objfiles_pspace_data_cleanup): New.
(get_objfile_pspace_data): New.
(objfiles_changed_p): Delete.
(allocate_objfile): Set the objfile's program space. Adjust to
reference objfiles_changed_p in pspace data.
(free_objfile): Adjust to reference objfiles_changed_p in pspace
data.
(objfile_relocate): Ditto.
(update_section_map): Add pspace argument. Adjust to iterate over
objfiles in the passed in pspace.
(find_pc_section): Delete sections and num_sections statics.
Adjust to refer to program space's objfiles_changed_p. Adjust to
refer to sections and num_sections store in the objfile's pspace
data.
(objfiles_changed): Adjust to reference objfiles_changed_p in
pspace data.
(_initialize_objfiles): New.
* linespec.c (decode_all_digits, decode_dollar): Set the sal's
program space.
* source.c (current_source_pspace): New.
(get_current_source_symtab_and_line): Set the sal's program space.
(set_current_source_symtab_and_line): Set current_source_pspace.
(select_source_symtab): Ditto. Use ALL_OBJFILES.
(forget_cached_source_info): Iterate over all program spaces.
* symfile.c (clear_symtab_users): Adjust.
* symmisc.c (print_symbol_bcache_statistics): Iterate over all
program spaces.
(print_objfile_statistics): Ditto.
(maintenance_print_msymbols): Ditto.
(maintenance_print_objfiles): Ditto.
(maintenance_info_symtabs): Ditto.
(maintenance_info_psymtabs): Ditto.
* symtab.h (SYMTAB_PSPACE): New.
(struct symtab_and_line) <pspace>: New field.
* symtab.c (init_sal): Clear the sal's program space.
(find_pc_sect_symtab): Set the sal's program space. Switch thread
and space.
(append_expanded_sal): Add program space argument. Iterate over
all program spaces.
(expand_line_sal): Iterate over all program spaces. Switch
program space.
* target.h (enum target_waitkind) <TARGET_WAITKIND_VFORK_DONE>: New.
(struct target_ops) <to_thread_address_space>: New field.
(target_thread_address_space): Define.
* target.c (target_detach): Only remove breakpoints from the
inferior we're detaching.
(target_thread_address_space): New.
* defs.h (initialize_progspace): Declare.
* top.c (gdb_init): Call it.
* solist.h (struct so_list) <sspace>: New field.
* solib.h (struct program_space): Forward declare.
(solib_name_from_address): Adjust prototype.
* solib.c (so_list_head): Replace with a macro referencing the
program space.
(update_solib_list): Set the so's program space.
(solib_name_from_address): Add a program space argument and adjust.
* solib-svr4.c (struct svr4_info) <pid>: Delete field.
<interp_text_sect_low, interp_text_sect_high, interp_plt_sect_low>
<interp_plt_sect_high>: New fields.
(svr4_info_p, svr4_info): Delete.
(solib_svr4_sspace_data): New.
(get_svr4_info): Rewrite.
(svr4_sspace_data_cleanup): New.
(open_symbol_file_object): Adjust.
(svr4_default_sos): Adjust.
(svr4_fetch_objfile_link_map): Adjust.
(interp_text_sect_low, interp_text_sect_high, interp_plt_sect_low)
(interp_plt_sect_high): Delete.
(svr4_in_dynsym_resolve_code): Adjust.
(enable_break): Adjust.
(svr4_clear_solib): Revert bit that removed the svr4_info here,
and reinstate clearing debug_base, debug_loader_offset_p,
debug_loader_offset and debug_loader_name.
(_initialize_svr4_solib): Register solib_svr4_pspace_data. Don't
install an inferior_exit observer anymore.
* printcmd.c (struct display) <pspace>: New field.
(display_command): Set the display's sspace.
(do_one_display): Match the display's sspace.
(display_uses_solib_p): Ditto.
* linux-fork.c (detach_fork): Moved to infrun.c.
(_initialize_linux_fork): Moved "detach-on-fork" command to
infrun.c.
* infrun.c (detach_fork): Moved from linux-fork.c.
(proceed_after_vfork_done): New.
(handle_vfork_child_exec_or_exit): New.
(follow_exec_mode_replace, follow_exec_mode_keep)
(follow_exec_mode_names, follow_exec_mode_string)
(show_follow_exec_mode_string): New.
(follow_exec): New. Reinstate the mark_breakpoints_out call.
Remove shared libraries before attaching new executable. If user
wants to keep the inferior, keep it.
(displaced_step_fixup): Adjust to pass an address space to the
breakpoints module.
(resume): Ditto.
(clear_proceed_status): In all-stop mode, always clear the proceed
status of all threads.
(prepare_to_proceed): Adjust to pass an address space to the
breakpoints module.
(proceed): Ditto.
(adjust_pc_after_break): Ditto.
(handle_inferior_event): When handling a process exit, switch the
program space to the inferior's that had exited. Call
handle_vfork_child_exec_or_exit. Adjust to pass an address space
to the breakpoints module. In non-stop mode, when following a
fork and detach-fork is off, also resume the other branch. Handle
TARGET_WAITKIND_VFORK_DONE. Set the program space in sals.
(normal_stop): Prune inferiors.
(_initialize_infrun): Install the new "follow-exec-mode" command.
"detach-on-fork" moved here.
* regcache.h (get_regcache_aspace): Declare.
* regcache.c (struct regcache) <aspace>: New field.
(regcache_xmalloc): Clear the aspace.
(get_regcache_aspace): New.
(regcache_cpy): Copy the aspace field.
(regcache_cpy_no_passthrough): Ditto.
(get_thread_regcache): Fetch the thread's address space from the
target, and store it in the regcache.
* infcall.c (call_function_by_hand): Set the sal's pspace.
* arch-utils.c (default_has_shared_address_space): New.
* arch-utils.h (default_has_shared_address_space): Declare.
* gdbarch.sh (has_shared_address_space): New.
* gdbarch.h, gdbarch.c: Regenerate.
* linux-tdep.c: Include auxv.h, target.h, elf/common.h.
(linux_has_shared_address_space): New.
(_initialize_linux_tdep): Declare.
* arm-tdep.c (arm_software_single_step): Pass the frame's address
space to insert_single_step_breakpoint.
* arm-linux-tdep.c (arm_linux_software_single_step): Pass the
frame's pspace to breakpoint functions.
* cris-tdep.c (crisv32_single_step_through_delay): Ditto.
(cris_software_single_step): Ditto.
* mips-tdep.c (deal_with_atomic_sequence): Add frame argument.
Pass the frame's pspace to breakpoint functions.
(mips_software_single_step): Adjust.
(mips_single_step_through_delay): Adjust.
* rs6000-aix-tdep.c (rs6000_software_single_step): Adjust.
* rs6000-tdep.c (ppc_deal_with_atomic_sequence): Adjust.
* solib-irix.c (enable_break): Adjust to pass the current frame's
address space to breakpoint functions.
* sparc-tdep.c (sparc_software_single_step): Ditto.
* spu-tdep.c (spu_software_single_step): Ditto.
* alpha-tdep.c (alpha_software_single_step): Ditto.
* record.c (record_wait): Adjust to pass an address space to the
breakpoints module.
* fork-child.c (fork_inferior): Set the new inferior's program and
address spaces.
* inf-ptrace.c (inf_ptrace_follow_fork): Copy the parent's program
and address spaces.
(inf_ptrace_attach): Set the inferior's program and address spaces.
* linux-nat.c: Include "solib.h".
(linux_child_follow_fork): Manage parent and child's program and
address spaces. Clone the parent's program space if necessary.
Don't wait for the vfork to be done here. Refuse to resume if
following the vfork parent while leaving the child stopped.
(resume_callback): Don't resume a vfork parent.
(linux_nat_resume): Also check for pending events in the
lp->waitstatus field.
(linux_handle_extended_wait): Report TARGET_WAITKIND_VFORK_DONE
events to the core.
(stop_wait_callback): Don't wait for SIGSTOP on vfork parents.
(cancel_breakpoint): Adjust.
* linux-thread-db.c (thread_db_wait): Don't remove thread event
breakpoints here.
(thread_db_mourn_inferior): Don't mark breakpoints out here.
Remove thread event breakpoints after mourning.
* corelow.c: Include progspace.h.
(core_open): Set the inferior's program and address spaces.
* remote.c (remote_add_inferior): Set the new inferior's program
and address spaces.
(remote_start_remote): Update address spaces.
(extended_remote_create_inferior_1): Don't init the thread list if
we already debugging other inferiors.
* darwin-nat.c (darwin_attach): Set the new inferior's program and
address spaces.
* gnu-nat.c (gnu_attach): Ditto.
* go32-nat.c (go32_create_inferior): Ditto.
* inf-ttrace.c (inf_ttrace_follow_fork, inf_ttrace_attach): Ditto.
* monitor.c (monitor_open): Ditto.
* nto-procfs.c (procfs_attach, procfs_create_inferior): Ditto.
* procfs.c (do_attach): Ditto.
* windows-nat.c (do_initial_windows_stuff): Ditto.
* inflow.c (inferior_process_group)
(terminal_init_inferior_with_pgrp, terminal_inferior,
(terminal_ours_1, inflow_inferior_exit, copy_terminal_info)
(child_terminal_info, new_tty_postfork, set_sigint_trap): Adjust
to use per-inferior data instead of inferior->terminal_info.
(inflow_inferior_data): New.
(inflow_new_inferior): Delete.
(inflow_inferior_data_cleanup): New.
(get_inflow_inferior_data): New.
* mi/mi-interp.c (mi_new_inferior): Rename to...
(mi_inferior_appeared): ... this.
(mi_interpreter_init): Adjust.
* tui/tui-disasm.c: Include "progspace.h".
(tui_set_disassem_content): Pass an address space to
breakpoint_here_p.
* NEWS: Mention multi-program debugging support. Mention new
commands "add-inferior", "clone-inferior", "remove-inferior",
"maint info program-spaces", and new option "set
follow-exec-mode".
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
gdb/doc/
* observer.texi (new_inferior): Rename to...
(inferior_appeared): ... this.
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
gdb/testsuite/
* gdb.base/foll-vfork.exp: Adjust to spell out "follow-fork".
* gdb.base/foll-exec.exp: Adjust to expect a process id before
"Executing new program".
* gdb.base/foll-fork.exp: Adjust to spell out "follow-fork".
* gdb.base/multi-forks.exp: Ditto. Adjust to the inferior being
left listed after having been killed.
* gdb.base/attach.exp: Adjust to spell out "symbol-file".
* gdb.base/maint.exp: Adjust test.
* Makefile.in (ALL_SUBDIRS): Add gdb.multi.
* gdb.multi/Makefile.in: New.
* gdb.multi/base.exp: New.
* gdb.multi/goodbye.c: New.
* gdb.multi/hangout.c: New.
* gdb.multi/hello.c: New.
* gdb.multi/bkpt-multi-exec.c: New.
* gdb.multi/bkpt-multi-exec.exp: New.
* gdb.multi/crashme.c: New.
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
gdb/doc/
* gdb.texinfo (Inferiors): Rename node to ...
(Inferiors and Programs): ... this. Mention running multiple
programs in the same debug session.
<info inferiors>: Mention the new 'Executable' column if "info
inferiors". Update examples. Document the "add-inferior",
"clone-inferior", "remove-inferior" and "maint info
program-spaces" commands.
(Process): Rename node to...
(Forks): ... this. Document "set|show follow-exec-mode".
2009-10-19 17:51:43 +08:00
|
|
|
|
2009-11-22 23:38:59 +08:00
|
|
|
/* Yes -- this is likely our single-step finishing,
|
|
|
|
but check if there's any reason the core would be
|
|
|
|
interested in the event. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
registers_changed ();
|
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
Add base multi-executable/process support to GDB.
gdb/
* Makefile.in (SFILES): Add progspace.c.
(COMMON_OBS): Add progspace.o.
* progspace.h: New.
* progspace.c: New.
* breakpoint.h (struct bp_target_info) <placed_address_space>: New
field.
(struct bp_location) <pspace>: New field.
(struct breakpoint) <pspace>: New field.
(bpstat_stop_status, breakpoint_here_p)
(moribund_breakpoint_here_p, breakpoint_inserted_here_p)
(regular_breakpoint_inserted_here_p)
(software_breakpoint_inserted_here_p, breakpoint_thread_match)
(set_default_breakpoint): Adjust prototypes.
(remove_breakpoints_pid, breakpoint_program_space_exit): Declare.
(insert_single_step_breakpoint, deprecated_insert_raw_breakpoint):
Adjust prototypes.
* breakpoint.c (executing_startup): Delete.
(default_breakpoint_sspace): New.
(breakpoint_restore_shadows): Skip if the address space doesn't
match.
(update_watchpoint): Record the frame's program space in the
breakpoint location.
(insert_bp_location): Record the address space in target_info.
Adjust to pass the symbol space to solib_name_from_address.
(breakpoint_program_space_exit): New.
(insert_breakpoint_locations): Switch the symbol space and thread
when inserting breakpoints. Don't insert breakpoints in a vfork
parent waiting for vfork done if we're not attached to the vfork
child.
(remove_breakpoints_pid): New.
(reattach_breakpoints): Switch to a thread of PID. Ignore
breakpoints of other symbol spaces.
(create_internal_breakpoint): Store the symbol space in the sal.
(create_longjmp_master_breakpoint): Iterate over all symbol
spaces.
(update_breakpoints_after_exec): Ignore breakpoints for other
symbol spaces.
(remove_breakpoint): Rename to ...
(remove_breakpoint_1): ... this. Pass the breakpoints symbol
space to solib_name_from_address.
(remove_breakpoint): New.
(mark_breakpoints_out): Ignore breakpoints from other symbol
spaces.
(breakpoint_init_inferior): Ditto.
(breakpoint_here_p): Add an address space argument and adjust to
use breakpoint_address_match.
(moribund_breakpoint_here_p): Ditto.
(regular_breakpoint_inserted_here_p): Ditto.
(breakpoint_inserted_here_p): Ditto.
(software_breakpoint_inserted_here_p): Ditto.
(breakpoint_thread_match): Ditto.
(bpstat_check_location): Ditto.
(bpstat_stop_status): Ditto.
(print_breakpoint_location): If there's a location to print,
switch the current symbol space.
(print_one_breakpoint_location): Add `allflag' argument.
(print_one_breakpoint): Ditto. Adjust.
(do_captured_breakpoint_query): Adjust.
(breakpoint_1): Adjust.
(breakpoint_has_pc): Also match the symbol space.
(describe_other_breakpoints): Add a symbol space argument and
adjust.
(set_default_breakpoint): Add a symbol space argument. Set
default_breakpoint_sspace.
(breakpoint_address_match): New.
(check_duplicates_for): Add an address space argument, and adjust.
(set_raw_breakpoint): Record the symbol space in the location and
in the breakpoint.
(set_longjmp_breakpoint): Skip longjmp master breakpoints from
other symbol spaces.
(remove_thread_event_breakpoints, remove_solib_event_breakpoints)
(disable_breakpoints_in_shlibs): Skip breakpoints from other
symbol spaces.
(disable_breakpoints_in_unloaded_shlib): Match symbol spaces.
(create_catchpoint): Set the symbol space in the sal.
(disable_breakpoints_before_startup): Skip breakpoints from other
symbol spaces. Set executing_startup in the current symbol space.
(enable_breakpoints_after_startup): Clear executing_startup in the
current symbol space. Skip breakpoints from other symbol spaces.
(clone_momentary_breakpoint): Also copy the symbol space.
(add_location_to_breakpoint): Set the location's symbol space.
(bp_loc_is_permanent): Switch thread and symbol space.
(create_breakpoint): Adjust.
(expand_line_sal_maybe): Expand comment to mention symbol spaces.
Switch thread and symbol space when reading memory.
(parse_breakpoint_sals): Set the symbol space in the sal.
(break_command_really): Ditto.
(skip_prologue_sal): Switch and space.
(resolve_sal_pc): Ditto.
(watch_command_1): Record the symbol space in the sal.
(create_ada_exception_breakpoint): Adjust.
(clear_command): Adjust. Match symbol spaces.
(update_global_location_list): Use breakpoint_address_match.
(breakpoint_re_set_one): Switch thread and space.
(breakpoint_re_set): Save symbol space.
(breakpoint_re_set_thread): Also reset the symbol space.
(deprecated_insert_raw_breakpoint): Add an address space argument.
Adjust.
(insert_single_step_breakpoint): Ditto.
(single_step_breakpoint_inserted_here_p): Ditto.
(clear_syscall_counts): New.
(_initialize_breakpoint): Install it as inferior_exit observer.
* exec.h: Include "progspace.h".
(exec_bfd, exec_bfd_mtime): New defines.
(exec_close): Declare.
* exec.c: Include "gdbthread.h" and "progspace.h".
(exec_bfd, exec_bfd_mtime, current_target_sections_1): Delete.
(using_exec_ops): New.
(exec_close_1): Rename to exec_close, and make public.
(exec_close): Rename to exec_close_1, and adjust all callers. Add
description. Remove target sections and close executables from
all program spaces.
(exec_file_attach): Add comment.
(add_target_sections): Check on `using_exec_ops' to check if the
target should be pushed.
(remove_target_sections): Only unpush the target if there are no
more target sections in any symbol space.
* gdbcore.h: Include "exec.h".
(exec_bfd, exec_bfd_mtime): Remove declarations.
* frame.h (get_frame_program_space, get_frame_address_space)
(frame_unwind_program_space): Declare.
* frame.c (struct frame_info) <pspace, aspace>: New fields.
(create_sentinel_frame): Add program space argument. Set the
pspace and aspace fields of the frame object.
(get_current_frame, create_new_frame): Adjust.
(get_frame_program_space): New.
(frame_unwind_program_space): New.
(get_frame_address_space): New.
* stack.c (print_frame_info): Adjust.
(print_frame): Use the frame's program space.
* gdbthread.h (any_live_thread_of_process): Declare.
* thread.c (any_live_thread_of_process): New.
(switch_to_thread): Switch the program space as well.
(restore_selected_frame): Don't warn if trying to restore frame
level 0.
* inferior.h: Include "progspace.h".
(detach_fork): Declare.
(struct inferior) <removable, aspace, pspace>
<vfork_parent, vfork_child, pending_detach>
<waiting_for_vfork_done>: New fields.
<terminal_info>: Remove field.
<data, num_data>: New fields.
(register_inferior_data, register_inferior_data_with_cleanup)
(clear_inferior_data, set_inferior_data, inferior_data): Declare.
(exit_inferior, exit_inferior_silent, exit_inferior_num_silent)
(inferior_appeared): Declare.
(find_inferior_pid): Typo.
(find_inferior_id, find_inferior_for_program_space): Declare.
(set_current_inferior, save_current_inferior, prune_inferiors)
(number_of_inferiors): Declare.
(inferior_list): Declare.
* inferior.c: Include "gdbcore.h" and "symfile.h".
(inferior_list): Make public.
(delete_inferior_1): Always delete thread silently.
(find_inferior_id): Make public.
(current_inferior_): New.
(current_inferior): Use it.
(set_current_inferior): New.
(restore_inferior): New.
(save_current_inferior): New.
(free_inferior): Free the per-inferior data.
(add_inferior_silent): Allocate per-inferior data.
Call inferior_appeared.
(delete_threads_of_inferior): New.
(delete_inferior_1): Adjust interface to take an inferior pointer.
(delete_inferior): Adjust.
(delete_inferior_silent): Adjust.
(exit_inferior_1): New.
(exit_inferior): New.
(exit_inferior_silent): New.
(exit_inferior_num_silent): New.
(detach_inferior): Adjust.
(inferior_appeared): New.
(discard_all_inferiors): Adjust.
(find_inferior_id): Make public. Assert pid is not zero.
(find_inferior_for_program_space): New.
(have_inferiors): Check if we have any inferior with pid not zero.
(have_live_inferiors): Go over all pushed targets looking for
process_stratum.
(prune_inferiors): New.
(number_of_inferiors): New.
(print_inferior): Add executable column. Print vfork parent/child
relationships.
(inferior_command): Adjust to cope with not running inferiors.
(remove_inferior_command): New.
(add_inferior_command): New.
(clone_inferior_command): New.
(struct inferior_data): New.
(struct inferior_data_registration): New.
(struct inferior_data_registry): New.
(inferior_data_registry): New.
(register_inferior_data_with_cleanup): New.
(register_inferior_data): New.
(inferior_alloc_data): New.
(inferior_free_data): New.
(clear_inferior_data): New.
(set_inferior_data): New.
(inferior_data): New.
(initialize_inferiors): New.
(_initialize_inferiors): Register "add-inferior",
"remove-inferior" and "clone-inferior" commands.
* objfiles.h: Include "progspace.h".
(struct objfile) <pspace>: New field.
(symfile_objfile, object_files): Don't declare.
(ALL_PSPACE_OBJFILES): New.
(ALL_PSPACE_OBJFILES_SAFE): New.
(ALL_OBJFILES, ALL_OBJFILES_SAFE): Adjust.
(ALL_PSPACE_SYMTABS): New.
(ALL_PRIMARY_SYMTABS): Adjust.
(ALL_PSPACE_PRIMARY_SYMTABS): New.
(ALL_PSYMTABS): Adjust.
(ALL_PSPACE_PSYMTABS): New.
* objfiles.c (object_files, symfile_objfile): Delete.
(struct objfile_sspace_info): New.
(objfiles_pspace_data): New.
(objfiles_pspace_data_cleanup): New.
(get_objfile_pspace_data): New.
(objfiles_changed_p): Delete.
(allocate_objfile): Set the objfile's program space. Adjust to
reference objfiles_changed_p in pspace data.
(free_objfile): Adjust to reference objfiles_changed_p in pspace
data.
(objfile_relocate): Ditto.
(update_section_map): Add pspace argument. Adjust to iterate over
objfiles in the passed in pspace.
(find_pc_section): Delete sections and num_sections statics.
Adjust to refer to program space's objfiles_changed_p. Adjust to
refer to sections and num_sections store in the objfile's pspace
data.
(objfiles_changed): Adjust to reference objfiles_changed_p in
pspace data.
(_initialize_objfiles): New.
* linespec.c (decode_all_digits, decode_dollar): Set the sal's
program space.
* source.c (current_source_pspace): New.
(get_current_source_symtab_and_line): Set the sal's program space.
(set_current_source_symtab_and_line): Set current_source_pspace.
(select_source_symtab): Ditto. Use ALL_OBJFILES.
(forget_cached_source_info): Iterate over all program spaces.
* symfile.c (clear_symtab_users): Adjust.
* symmisc.c (print_symbol_bcache_statistics): Iterate over all
program spaces.
(print_objfile_statistics): Ditto.
(maintenance_print_msymbols): Ditto.
(maintenance_print_objfiles): Ditto.
(maintenance_info_symtabs): Ditto.
(maintenance_info_psymtabs): Ditto.
* symtab.h (SYMTAB_PSPACE): New.
(struct symtab_and_line) <pspace>: New field.
* symtab.c (init_sal): Clear the sal's program space.
(find_pc_sect_symtab): Set the sal's program space. Switch thread
and space.
(append_expanded_sal): Add program space argument. Iterate over
all program spaces.
(expand_line_sal): Iterate over all program spaces. Switch
program space.
* target.h (enum target_waitkind) <TARGET_WAITKIND_VFORK_DONE>: New.
(struct target_ops) <to_thread_address_space>: New field.
(target_thread_address_space): Define.
* target.c (target_detach): Only remove breakpoints from the
inferior we're detaching.
(target_thread_address_space): New.
* defs.h (initialize_progspace): Declare.
* top.c (gdb_init): Call it.
* solist.h (struct so_list) <sspace>: New field.
* solib.h (struct program_space): Forward declare.
(solib_name_from_address): Adjust prototype.
* solib.c (so_list_head): Replace with a macro referencing the
program space.
(update_solib_list): Set the so's program space.
(solib_name_from_address): Add a program space argument and adjust.
* solib-svr4.c (struct svr4_info) <pid>: Delete field.
<interp_text_sect_low, interp_text_sect_high, interp_plt_sect_low>
<interp_plt_sect_high>: New fields.
(svr4_info_p, svr4_info): Delete.
(solib_svr4_sspace_data): New.
(get_svr4_info): Rewrite.
(svr4_sspace_data_cleanup): New.
(open_symbol_file_object): Adjust.
(svr4_default_sos): Adjust.
(svr4_fetch_objfile_link_map): Adjust.
(interp_text_sect_low, interp_text_sect_high, interp_plt_sect_low)
(interp_plt_sect_high): Delete.
(svr4_in_dynsym_resolve_code): Adjust.
(enable_break): Adjust.
(svr4_clear_solib): Revert bit that removed the svr4_info here,
and reinstate clearing debug_base, debug_loader_offset_p,
debug_loader_offset and debug_loader_name.
(_initialize_svr4_solib): Register solib_svr4_pspace_data. Don't
install an inferior_exit observer anymore.
* printcmd.c (struct display) <pspace>: New field.
(display_command): Set the display's sspace.
(do_one_display): Match the display's sspace.
(display_uses_solib_p): Ditto.
* linux-fork.c (detach_fork): Moved to infrun.c.
(_initialize_linux_fork): Moved "detach-on-fork" command to
infrun.c.
* infrun.c (detach_fork): Moved from linux-fork.c.
(proceed_after_vfork_done): New.
(handle_vfork_child_exec_or_exit): New.
(follow_exec_mode_replace, follow_exec_mode_keep)
(follow_exec_mode_names, follow_exec_mode_string)
(show_follow_exec_mode_string): New.
(follow_exec): New. Reinstate the mark_breakpoints_out call.
Remove shared libraries before attaching new executable. If user
wants to keep the inferior, keep it.
(displaced_step_fixup): Adjust to pass an address space to the
breakpoints module.
(resume): Ditto.
(clear_proceed_status): In all-stop mode, always clear the proceed
status of all threads.
(prepare_to_proceed): Adjust to pass an address space to the
breakpoints module.
(proceed): Ditto.
(adjust_pc_after_break): Ditto.
(handle_inferior_event): When handling a process exit, switch the
program space to the inferior's that had exited. Call
handle_vfork_child_exec_or_exit. Adjust to pass an address space
to the breakpoints module. In non-stop mode, when following a
fork and detach-fork is off, also resume the other branch. Handle
TARGET_WAITKIND_VFORK_DONE. Set the program space in sals.
(normal_stop): Prune inferiors.
(_initialize_infrun): Install the new "follow-exec-mode" command.
"detach-on-fork" moved here.
* regcache.h (get_regcache_aspace): Declare.
* regcache.c (struct regcache) <aspace>: New field.
(regcache_xmalloc): Clear the aspace.
(get_regcache_aspace): New.
(regcache_cpy): Copy the aspace field.
(regcache_cpy_no_passthrough): Ditto.
(get_thread_regcache): Fetch the thread's address space from the
target, and store it in the regcache.
* infcall.c (call_function_by_hand): Set the sal's pspace.
* arch-utils.c (default_has_shared_address_space): New.
* arch-utils.h (default_has_shared_address_space): Declare.
* gdbarch.sh (has_shared_address_space): New.
* gdbarch.h, gdbarch.c: Regenerate.
* linux-tdep.c: Include auxv.h, target.h, elf/common.h.
(linux_has_shared_address_space): New.
(_initialize_linux_tdep): Declare.
* arm-tdep.c (arm_software_single_step): Pass the frame's address
space to insert_single_step_breakpoint.
* arm-linux-tdep.c (arm_linux_software_single_step): Pass the
frame's pspace to breakpoint functions.
* cris-tdep.c (crisv32_single_step_through_delay): Ditto.
(cris_software_single_step): Ditto.
* mips-tdep.c (deal_with_atomic_sequence): Add frame argument.
Pass the frame's pspace to breakpoint functions.
(mips_software_single_step): Adjust.
(mips_single_step_through_delay): Adjust.
* rs6000-aix-tdep.c (rs6000_software_single_step): Adjust.
* rs6000-tdep.c (ppc_deal_with_atomic_sequence): Adjust.
* solib-irix.c (enable_break): Adjust to pass the current frame's
address space to breakpoint functions.
* sparc-tdep.c (sparc_software_single_step): Ditto.
* spu-tdep.c (spu_software_single_step): Ditto.
* alpha-tdep.c (alpha_software_single_step): Ditto.
* record.c (record_wait): Adjust to pass an address space to the
breakpoints module.
* fork-child.c (fork_inferior): Set the new inferior's program and
address spaces.
* inf-ptrace.c (inf_ptrace_follow_fork): Copy the parent's program
and address spaces.
(inf_ptrace_attach): Set the inferior's program and address spaces.
* linux-nat.c: Include "solib.h".
(linux_child_follow_fork): Manage parent and child's program and
address spaces. Clone the parent's program space if necessary.
Don't wait for the vfork to be done here. Refuse to resume if
following the vfork parent while leaving the child stopped.
(resume_callback): Don't resume a vfork parent.
(linux_nat_resume): Also check for pending events in the
lp->waitstatus field.
(linux_handle_extended_wait): Report TARGET_WAITKIND_VFORK_DONE
events to the core.
(stop_wait_callback): Don't wait for SIGSTOP on vfork parents.
(cancel_breakpoint): Adjust.
* linux-thread-db.c (thread_db_wait): Don't remove thread event
breakpoints here.
(thread_db_mourn_inferior): Don't mark breakpoints out here.
Remove thread event breakpoints after mourning.
* corelow.c: Include progspace.h.
(core_open): Set the inferior's program and address spaces.
* remote.c (remote_add_inferior): Set the new inferior's program
and address spaces.
(remote_start_remote): Update address spaces.
(extended_remote_create_inferior_1): Don't init the thread list if
we already debugging other inferiors.
* darwin-nat.c (darwin_attach): Set the new inferior's program and
address spaces.
* gnu-nat.c (gnu_attach): Ditto.
* go32-nat.c (go32_create_inferior): Ditto.
* inf-ttrace.c (inf_ttrace_follow_fork, inf_ttrace_attach): Ditto.
* monitor.c (monitor_open): Ditto.
* nto-procfs.c (procfs_attach, procfs_create_inferior): Ditto.
* procfs.c (do_attach): Ditto.
* windows-nat.c (do_initial_windows_stuff): Ditto.
* inflow.c (inferior_process_group)
(terminal_init_inferior_with_pgrp, terminal_inferior,
(terminal_ours_1, inflow_inferior_exit, copy_terminal_info)
(child_terminal_info, new_tty_postfork, set_sigint_trap): Adjust
to use per-inferior data instead of inferior->terminal_info.
(inflow_inferior_data): New.
(inflow_new_inferior): Delete.
(inflow_inferior_data_cleanup): New.
(get_inflow_inferior_data): New.
* mi/mi-interp.c (mi_new_inferior): Rename to...
(mi_inferior_appeared): ... this.
(mi_interpreter_init): Adjust.
* tui/tui-disasm.c: Include "progspace.h".
(tui_set_disassem_content): Pass an address space to
breakpoint_here_p.
* NEWS: Mention multi-program debugging support. Mention new
commands "add-inferior", "clone-inferior", "remove-inferior",
"maint info program-spaces", and new option "set
follow-exec-mode".
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
gdb/doc/
* observer.texi (new_inferior): Rename to...
(inferior_appeared): ... this.
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
gdb/testsuite/
* gdb.base/foll-vfork.exp: Adjust to spell out "follow-fork".
* gdb.base/foll-exec.exp: Adjust to expect a process id before
"Executing new program".
* gdb.base/foll-fork.exp: Adjust to spell out "follow-fork".
* gdb.base/multi-forks.exp: Ditto. Adjust to the inferior being
left listed after having been killed.
* gdb.base/attach.exp: Adjust to spell out "symbol-file".
* gdb.base/maint.exp: Adjust test.
* Makefile.in (ALL_SUBDIRS): Add gdb.multi.
* gdb.multi/Makefile.in: New.
* gdb.multi/base.exp: New.
* gdb.multi/goodbye.c: New.
* gdb.multi/hangout.c: New.
* gdb.multi/hello.c: New.
* gdb.multi/bkpt-multi-exec.c: New.
* gdb.multi/bkpt-multi-exec.exp: New.
* gdb.multi/crashme.c: New.
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
gdb/doc/
* gdb.texinfo (Inferiors): Rename node to ...
(Inferiors and Programs): ... this. Mention running multiple
programs in the same debug session.
<info inferiors>: Mention the new 'Executable' column if "info
inferiors". Update examples. Document the "add-inferior",
"clone-inferior", "remove-inferior" and "maint info
program-spaces" commands.
(Process): Rename node to...
(Forks): ... this. Document "set|show follow-exec-mode".
2009-10-19 17:51:43 +08:00
|
|
|
regcache = get_current_regcache ();
|
|
|
|
tmp_pc = regcache_read_pc (regcache);
|
2009-11-22 23:47:31 +08:00
|
|
|
aspace = get_regcache_aspace (regcache);
|
2009-11-22 23:38:59 +08:00
|
|
|
|
|
|
|
if (target_stopped_by_watchpoint ())
|
|
|
|
{
|
|
|
|
/* Always interested in watchpoints. */
|
|
|
|
}
|
2009-11-22 23:47:31 +08:00
|
|
|
else if (breakpoint_inserted_here_p (aspace, tmp_pc))
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
2009-11-22 23:38:59 +08:00
|
|
|
/* There is a breakpoint here. Let the core
|
|
|
|
handle it. */
|
2009-11-22 23:47:31 +08:00
|
|
|
if (software_breakpoint_inserted_here_p (aspace, tmp_pc))
|
|
|
|
{
|
2011-01-06 06:22:53 +08:00
|
|
|
struct gdbarch *gdbarch
|
|
|
|
= get_regcache_arch (regcache);
|
2009-11-22 23:47:31 +08:00
|
|
|
CORE_ADDR decr_pc_after_break
|
|
|
|
= gdbarch_decr_pc_after_break (gdbarch);
|
|
|
|
if (decr_pc_after_break)
|
|
|
|
regcache_write_pc (regcache,
|
|
|
|
tmp_pc + decr_pc_after_break);
|
|
|
|
}
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-07-19 15:55:43 +08:00
|
|
|
/* This is a single-step trap. Record the
|
|
|
|
insn and issue another step.
|
|
|
|
FIXME: this part can be a random SIGTRAP too.
|
|
|
|
But GDB cannot handle it. */
|
|
|
|
int step = 1;
|
|
|
|
|
2009-12-22 11:16:40 +08:00
|
|
|
if (!record_message_wrapper_safe (regcache,
|
2012-05-25 00:51:47 +08:00
|
|
|
GDB_SIGNAL_0))
|
2009-12-22 11:16:40 +08:00
|
|
|
{
|
|
|
|
status->kind = TARGET_WAITKIND_STOPPED;
|
2012-05-25 00:51:47 +08:00
|
|
|
status->value.sig = GDB_SIGNAL_0;
|
2009-12-22 11:16:40 +08:00
|
|
|
break;
|
|
|
|
}
|
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
Add base multi-executable/process support to GDB.
gdb/
* Makefile.in (SFILES): Add progspace.c.
(COMMON_OBS): Add progspace.o.
* progspace.h: New.
* progspace.c: New.
* breakpoint.h (struct bp_target_info) <placed_address_space>: New
field.
(struct bp_location) <pspace>: New field.
(struct breakpoint) <pspace>: New field.
(bpstat_stop_status, breakpoint_here_p)
(moribund_breakpoint_here_p, breakpoint_inserted_here_p)
(regular_breakpoint_inserted_here_p)
(software_breakpoint_inserted_here_p, breakpoint_thread_match)
(set_default_breakpoint): Adjust prototypes.
(remove_breakpoints_pid, breakpoint_program_space_exit): Declare.
(insert_single_step_breakpoint, deprecated_insert_raw_breakpoint):
Adjust prototypes.
* breakpoint.c (executing_startup): Delete.
(default_breakpoint_sspace): New.
(breakpoint_restore_shadows): Skip if the address space doesn't
match.
(update_watchpoint): Record the frame's program space in the
breakpoint location.
(insert_bp_location): Record the address space in target_info.
Adjust to pass the symbol space to solib_name_from_address.
(breakpoint_program_space_exit): New.
(insert_breakpoint_locations): Switch the symbol space and thread
when inserting breakpoints. Don't insert breakpoints in a vfork
parent waiting for vfork done if we're not attached to the vfork
child.
(remove_breakpoints_pid): New.
(reattach_breakpoints): Switch to a thread of PID. Ignore
breakpoints of other symbol spaces.
(create_internal_breakpoint): Store the symbol space in the sal.
(create_longjmp_master_breakpoint): Iterate over all symbol
spaces.
(update_breakpoints_after_exec): Ignore breakpoints for other
symbol spaces.
(remove_breakpoint): Rename to ...
(remove_breakpoint_1): ... this. Pass the breakpoints symbol
space to solib_name_from_address.
(remove_breakpoint): New.
(mark_breakpoints_out): Ignore breakpoints from other symbol
spaces.
(breakpoint_init_inferior): Ditto.
(breakpoint_here_p): Add an address space argument and adjust to
use breakpoint_address_match.
(moribund_breakpoint_here_p): Ditto.
(regular_breakpoint_inserted_here_p): Ditto.
(breakpoint_inserted_here_p): Ditto.
(software_breakpoint_inserted_here_p): Ditto.
(breakpoint_thread_match): Ditto.
(bpstat_check_location): Ditto.
(bpstat_stop_status): Ditto.
(print_breakpoint_location): If there's a location to print,
switch the current symbol space.
(print_one_breakpoint_location): Add `allflag' argument.
(print_one_breakpoint): Ditto. Adjust.
(do_captured_breakpoint_query): Adjust.
(breakpoint_1): Adjust.
(breakpoint_has_pc): Also match the symbol space.
(describe_other_breakpoints): Add a symbol space argument and
adjust.
(set_default_breakpoint): Add a symbol space argument. Set
default_breakpoint_sspace.
(breakpoint_address_match): New.
(check_duplicates_for): Add an address space argument, and adjust.
(set_raw_breakpoint): Record the symbol space in the location and
in the breakpoint.
(set_longjmp_breakpoint): Skip longjmp master breakpoints from
other symbol spaces.
(remove_thread_event_breakpoints, remove_solib_event_breakpoints)
(disable_breakpoints_in_shlibs): Skip breakpoints from other
symbol spaces.
(disable_breakpoints_in_unloaded_shlib): Match symbol spaces.
(create_catchpoint): Set the symbol space in the sal.
(disable_breakpoints_before_startup): Skip breakpoints from other
symbol spaces. Set executing_startup in the current symbol space.
(enable_breakpoints_after_startup): Clear executing_startup in the
current symbol space. Skip breakpoints from other symbol spaces.
(clone_momentary_breakpoint): Also copy the symbol space.
(add_location_to_breakpoint): Set the location's symbol space.
(bp_loc_is_permanent): Switch thread and symbol space.
(create_breakpoint): Adjust.
(expand_line_sal_maybe): Expand comment to mention symbol spaces.
Switch thread and symbol space when reading memory.
(parse_breakpoint_sals): Set the symbol space in the sal.
(break_command_really): Ditto.
(skip_prologue_sal): Switch and space.
(resolve_sal_pc): Ditto.
(watch_command_1): Record the symbol space in the sal.
(create_ada_exception_breakpoint): Adjust.
(clear_command): Adjust. Match symbol spaces.
(update_global_location_list): Use breakpoint_address_match.
(breakpoint_re_set_one): Switch thread and space.
(breakpoint_re_set): Save symbol space.
(breakpoint_re_set_thread): Also reset the symbol space.
(deprecated_insert_raw_breakpoint): Add an address space argument.
Adjust.
(insert_single_step_breakpoint): Ditto.
(single_step_breakpoint_inserted_here_p): Ditto.
(clear_syscall_counts): New.
(_initialize_breakpoint): Install it as inferior_exit observer.
* exec.h: Include "progspace.h".
(exec_bfd, exec_bfd_mtime): New defines.
(exec_close): Declare.
* exec.c: Include "gdbthread.h" and "progspace.h".
(exec_bfd, exec_bfd_mtime, current_target_sections_1): Delete.
(using_exec_ops): New.
(exec_close_1): Rename to exec_close, and make public.
(exec_close): Rename to exec_close_1, and adjust all callers. Add
description. Remove target sections and close executables from
all program spaces.
(exec_file_attach): Add comment.
(add_target_sections): Check on `using_exec_ops' to check if the
target should be pushed.
(remove_target_sections): Only unpush the target if there are no
more target sections in any symbol space.
* gdbcore.h: Include "exec.h".
(exec_bfd, exec_bfd_mtime): Remove declarations.
* frame.h (get_frame_program_space, get_frame_address_space)
(frame_unwind_program_space): Declare.
* frame.c (struct frame_info) <pspace, aspace>: New fields.
(create_sentinel_frame): Add program space argument. Set the
pspace and aspace fields of the frame object.
(get_current_frame, create_new_frame): Adjust.
(get_frame_program_space): New.
(frame_unwind_program_space): New.
(get_frame_address_space): New.
* stack.c (print_frame_info): Adjust.
(print_frame): Use the frame's program space.
* gdbthread.h (any_live_thread_of_process): Declare.
* thread.c (any_live_thread_of_process): New.
(switch_to_thread): Switch the program space as well.
(restore_selected_frame): Don't warn if trying to restore frame
level 0.
* inferior.h: Include "progspace.h".
(detach_fork): Declare.
(struct inferior) <removable, aspace, pspace>
<vfork_parent, vfork_child, pending_detach>
<waiting_for_vfork_done>: New fields.
<terminal_info>: Remove field.
<data, num_data>: New fields.
(register_inferior_data, register_inferior_data_with_cleanup)
(clear_inferior_data, set_inferior_data, inferior_data): Declare.
(exit_inferior, exit_inferior_silent, exit_inferior_num_silent)
(inferior_appeared): Declare.
(find_inferior_pid): Typo.
(find_inferior_id, find_inferior_for_program_space): Declare.
(set_current_inferior, save_current_inferior, prune_inferiors)
(number_of_inferiors): Declare.
(inferior_list): Declare.
* inferior.c: Include "gdbcore.h" and "symfile.h".
(inferior_list): Make public.
(delete_inferior_1): Always delete thread silently.
(find_inferior_id): Make public.
(current_inferior_): New.
(current_inferior): Use it.
(set_current_inferior): New.
(restore_inferior): New.
(save_current_inferior): New.
(free_inferior): Free the per-inferior data.
(add_inferior_silent): Allocate per-inferior data.
Call inferior_appeared.
(delete_threads_of_inferior): New.
(delete_inferior_1): Adjust interface to take an inferior pointer.
(delete_inferior): Adjust.
(delete_inferior_silent): Adjust.
(exit_inferior_1): New.
(exit_inferior): New.
(exit_inferior_silent): New.
(exit_inferior_num_silent): New.
(detach_inferior): Adjust.
(inferior_appeared): New.
(discard_all_inferiors): Adjust.
(find_inferior_id): Make public. Assert pid is not zero.
(find_inferior_for_program_space): New.
(have_inferiors): Check if we have any inferior with pid not zero.
(have_live_inferiors): Go over all pushed targets looking for
process_stratum.
(prune_inferiors): New.
(number_of_inferiors): New.
(print_inferior): Add executable column. Print vfork parent/child
relationships.
(inferior_command): Adjust to cope with not running inferiors.
(remove_inferior_command): New.
(add_inferior_command): New.
(clone_inferior_command): New.
(struct inferior_data): New.
(struct inferior_data_registration): New.
(struct inferior_data_registry): New.
(inferior_data_registry): New.
(register_inferior_data_with_cleanup): New.
(register_inferior_data): New.
(inferior_alloc_data): New.
(inferior_free_data): New.
(clear_inferior_data): New.
(set_inferior_data): New.
(inferior_data): New.
(initialize_inferiors): New.
(_initialize_inferiors): Register "add-inferior",
"remove-inferior" and "clone-inferior" commands.
* objfiles.h: Include "progspace.h".
(struct objfile) <pspace>: New field.
(symfile_objfile, object_files): Don't declare.
(ALL_PSPACE_OBJFILES): New.
(ALL_PSPACE_OBJFILES_SAFE): New.
(ALL_OBJFILES, ALL_OBJFILES_SAFE): Adjust.
(ALL_PSPACE_SYMTABS): New.
(ALL_PRIMARY_SYMTABS): Adjust.
(ALL_PSPACE_PRIMARY_SYMTABS): New.
(ALL_PSYMTABS): Adjust.
(ALL_PSPACE_PSYMTABS): New.
* objfiles.c (object_files, symfile_objfile): Delete.
(struct objfile_sspace_info): New.
(objfiles_pspace_data): New.
(objfiles_pspace_data_cleanup): New.
(get_objfile_pspace_data): New.
(objfiles_changed_p): Delete.
(allocate_objfile): Set the objfile's program space. Adjust to
reference objfiles_changed_p in pspace data.
(free_objfile): Adjust to reference objfiles_changed_p in pspace
data.
(objfile_relocate): Ditto.
(update_section_map): Add pspace argument. Adjust to iterate over
objfiles in the passed in pspace.
(find_pc_section): Delete sections and num_sections statics.
Adjust to refer to program space's objfiles_changed_p. Adjust to
refer to sections and num_sections store in the objfile's pspace
data.
(objfiles_changed): Adjust to reference objfiles_changed_p in
pspace data.
(_initialize_objfiles): New.
* linespec.c (decode_all_digits, decode_dollar): Set the sal's
program space.
* source.c (current_source_pspace): New.
(get_current_source_symtab_and_line): Set the sal's program space.
(set_current_source_symtab_and_line): Set current_source_pspace.
(select_source_symtab): Ditto. Use ALL_OBJFILES.
(forget_cached_source_info): Iterate over all program spaces.
* symfile.c (clear_symtab_users): Adjust.
* symmisc.c (print_symbol_bcache_statistics): Iterate over all
program spaces.
(print_objfile_statistics): Ditto.
(maintenance_print_msymbols): Ditto.
(maintenance_print_objfiles): Ditto.
(maintenance_info_symtabs): Ditto.
(maintenance_info_psymtabs): Ditto.
* symtab.h (SYMTAB_PSPACE): New.
(struct symtab_and_line) <pspace>: New field.
* symtab.c (init_sal): Clear the sal's program space.
(find_pc_sect_symtab): Set the sal's program space. Switch thread
and space.
(append_expanded_sal): Add program space argument. Iterate over
all program spaces.
(expand_line_sal): Iterate over all program spaces. Switch
program space.
* target.h (enum target_waitkind) <TARGET_WAITKIND_VFORK_DONE>: New.
(struct target_ops) <to_thread_address_space>: New field.
(target_thread_address_space): Define.
* target.c (target_detach): Only remove breakpoints from the
inferior we're detaching.
(target_thread_address_space): New.
* defs.h (initialize_progspace): Declare.
* top.c (gdb_init): Call it.
* solist.h (struct so_list) <sspace>: New field.
* solib.h (struct program_space): Forward declare.
(solib_name_from_address): Adjust prototype.
* solib.c (so_list_head): Replace with a macro referencing the
program space.
(update_solib_list): Set the so's program space.
(solib_name_from_address): Add a program space argument and adjust.
* solib-svr4.c (struct svr4_info) <pid>: Delete field.
<interp_text_sect_low, interp_text_sect_high, interp_plt_sect_low>
<interp_plt_sect_high>: New fields.
(svr4_info_p, svr4_info): Delete.
(solib_svr4_sspace_data): New.
(get_svr4_info): Rewrite.
(svr4_sspace_data_cleanup): New.
(open_symbol_file_object): Adjust.
(svr4_default_sos): Adjust.
(svr4_fetch_objfile_link_map): Adjust.
(interp_text_sect_low, interp_text_sect_high, interp_plt_sect_low)
(interp_plt_sect_high): Delete.
(svr4_in_dynsym_resolve_code): Adjust.
(enable_break): Adjust.
(svr4_clear_solib): Revert bit that removed the svr4_info here,
and reinstate clearing debug_base, debug_loader_offset_p,
debug_loader_offset and debug_loader_name.
(_initialize_svr4_solib): Register solib_svr4_pspace_data. Don't
install an inferior_exit observer anymore.
* printcmd.c (struct display) <pspace>: New field.
(display_command): Set the display's sspace.
(do_one_display): Match the display's sspace.
(display_uses_solib_p): Ditto.
* linux-fork.c (detach_fork): Moved to infrun.c.
(_initialize_linux_fork): Moved "detach-on-fork" command to
infrun.c.
* infrun.c (detach_fork): Moved from linux-fork.c.
(proceed_after_vfork_done): New.
(handle_vfork_child_exec_or_exit): New.
(follow_exec_mode_replace, follow_exec_mode_keep)
(follow_exec_mode_names, follow_exec_mode_string)
(show_follow_exec_mode_string): New.
(follow_exec): New. Reinstate the mark_breakpoints_out call.
Remove shared libraries before attaching new executable. If user
wants to keep the inferior, keep it.
(displaced_step_fixup): Adjust to pass an address space to the
breakpoints module.
(resume): Ditto.
(clear_proceed_status): In all-stop mode, always clear the proceed
status of all threads.
(prepare_to_proceed): Adjust to pass an address space to the
breakpoints module.
(proceed): Ditto.
(adjust_pc_after_break): Ditto.
(handle_inferior_event): When handling a process exit, switch the
program space to the inferior's that had exited. Call
handle_vfork_child_exec_or_exit. Adjust to pass an address space
to the breakpoints module. In non-stop mode, when following a
fork and detach-fork is off, also resume the other branch. Handle
TARGET_WAITKIND_VFORK_DONE. Set the program space in sals.
(normal_stop): Prune inferiors.
(_initialize_infrun): Install the new "follow-exec-mode" command.
"detach-on-fork" moved here.
* regcache.h (get_regcache_aspace): Declare.
* regcache.c (struct regcache) <aspace>: New field.
(regcache_xmalloc): Clear the aspace.
(get_regcache_aspace): New.
(regcache_cpy): Copy the aspace field.
(regcache_cpy_no_passthrough): Ditto.
(get_thread_regcache): Fetch the thread's address space from the
target, and store it in the regcache.
* infcall.c (call_function_by_hand): Set the sal's pspace.
* arch-utils.c (default_has_shared_address_space): New.
* arch-utils.h (default_has_shared_address_space): Declare.
* gdbarch.sh (has_shared_address_space): New.
* gdbarch.h, gdbarch.c: Regenerate.
* linux-tdep.c: Include auxv.h, target.h, elf/common.h.
(linux_has_shared_address_space): New.
(_initialize_linux_tdep): Declare.
* arm-tdep.c (arm_software_single_step): Pass the frame's address
space to insert_single_step_breakpoint.
* arm-linux-tdep.c (arm_linux_software_single_step): Pass the
frame's pspace to breakpoint functions.
* cris-tdep.c (crisv32_single_step_through_delay): Ditto.
(cris_software_single_step): Ditto.
* mips-tdep.c (deal_with_atomic_sequence): Add frame argument.
Pass the frame's pspace to breakpoint functions.
(mips_software_single_step): Adjust.
(mips_single_step_through_delay): Adjust.
* rs6000-aix-tdep.c (rs6000_software_single_step): Adjust.
* rs6000-tdep.c (ppc_deal_with_atomic_sequence): Adjust.
* solib-irix.c (enable_break): Adjust to pass the current frame's
address space to breakpoint functions.
* sparc-tdep.c (sparc_software_single_step): Ditto.
* spu-tdep.c (spu_software_single_step): Ditto.
* alpha-tdep.c (alpha_software_single_step): Ditto.
* record.c (record_wait): Adjust to pass an address space to the
breakpoints module.
* fork-child.c (fork_inferior): Set the new inferior's program and
address spaces.
* inf-ptrace.c (inf_ptrace_follow_fork): Copy the parent's program
and address spaces.
(inf_ptrace_attach): Set the inferior's program and address spaces.
* linux-nat.c: Include "solib.h".
(linux_child_follow_fork): Manage parent and child's program and
address spaces. Clone the parent's program space if necessary.
Don't wait for the vfork to be done here. Refuse to resume if
following the vfork parent while leaving the child stopped.
(resume_callback): Don't resume a vfork parent.
(linux_nat_resume): Also check for pending events in the
lp->waitstatus field.
(linux_handle_extended_wait): Report TARGET_WAITKIND_VFORK_DONE
events to the core.
(stop_wait_callback): Don't wait for SIGSTOP on vfork parents.
(cancel_breakpoint): Adjust.
* linux-thread-db.c (thread_db_wait): Don't remove thread event
breakpoints here.
(thread_db_mourn_inferior): Don't mark breakpoints out here.
Remove thread event breakpoints after mourning.
* corelow.c: Include progspace.h.
(core_open): Set the inferior's program and address spaces.
* remote.c (remote_add_inferior): Set the new inferior's program
and address spaces.
(remote_start_remote): Update address spaces.
(extended_remote_create_inferior_1): Don't init the thread list if
we already debugging other inferiors.
* darwin-nat.c (darwin_attach): Set the new inferior's program and
address spaces.
* gnu-nat.c (gnu_attach): Ditto.
* go32-nat.c (go32_create_inferior): Ditto.
* inf-ttrace.c (inf_ttrace_follow_fork, inf_ttrace_attach): Ditto.
* monitor.c (monitor_open): Ditto.
* nto-procfs.c (procfs_attach, procfs_create_inferior): Ditto.
* procfs.c (do_attach): Ditto.
* windows-nat.c (do_initial_windows_stuff): Ditto.
* inflow.c (inferior_process_group)
(terminal_init_inferior_with_pgrp, terminal_inferior,
(terminal_ours_1, inflow_inferior_exit, copy_terminal_info)
(child_terminal_info, new_tty_postfork, set_sigint_trap): Adjust
to use per-inferior data instead of inferior->terminal_info.
(inflow_inferior_data): New.
(inflow_new_inferior): Delete.
(inflow_inferior_data_cleanup): New.
(get_inflow_inferior_data): New.
* mi/mi-interp.c (mi_new_inferior): Rename to...
(mi_inferior_appeared): ... this.
(mi_interpreter_init): Adjust.
* tui/tui-disasm.c: Include "progspace.h".
(tui_set_disassem_content): Pass an address space to
breakpoint_here_p.
* NEWS: Mention multi-program debugging support. Mention new
commands "add-inferior", "clone-inferior", "remove-inferior",
"maint info program-spaces", and new option "set
follow-exec-mode".
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
gdb/doc/
* observer.texi (new_inferior): Rename to...
(inferior_appeared): ... this.
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
gdb/testsuite/
* gdb.base/foll-vfork.exp: Adjust to spell out "follow-fork".
* gdb.base/foll-exec.exp: Adjust to expect a process id before
"Executing new program".
* gdb.base/foll-fork.exp: Adjust to spell out "follow-fork".
* gdb.base/multi-forks.exp: Ditto. Adjust to the inferior being
left listed after having been killed.
* gdb.base/attach.exp: Adjust to spell out "symbol-file".
* gdb.base/maint.exp: Adjust test.
* Makefile.in (ALL_SUBDIRS): Add gdb.multi.
* gdb.multi/Makefile.in: New.
* gdb.multi/base.exp: New.
* gdb.multi/goodbye.c: New.
* gdb.multi/hangout.c: New.
* gdb.multi/hello.c: New.
* gdb.multi/bkpt-multi-exec.c: New.
* gdb.multi/bkpt-multi-exec.exp: New.
* gdb.multi/crashme.c: New.
2009-10-19 Pedro Alves <pedro@codesourcery.com>
Stan Shebs <stan@codesourcery.com>
gdb/doc/
* gdb.texinfo (Inferiors): Rename node to ...
(Inferiors and Programs): ... this. Mention running multiple
programs in the same debug session.
<info inferiors>: Mention the new 'Executable' column if "info
inferiors". Update examples. Document the "add-inferior",
"clone-inferior", "remove-inferior" and "maint info
program-spaces" commands.
(Process): Rename node to...
(Forks): ... this. Document "set|show follow-exec-mode".
2009-10-19 17:51:43 +08:00
|
|
|
|
2010-07-19 15:55:43 +08:00
|
|
|
if (gdbarch_software_single_step_p (gdbarch))
|
|
|
|
{
|
|
|
|
/* Try to insert the software single step breakpoint.
|
|
|
|
If insert success, set step to 0. */
|
|
|
|
set_executing (inferior_ptid, 0);
|
|
|
|
reinit_frame_cache ();
|
|
|
|
if (gdbarch_software_single_step (gdbarch,
|
|
|
|
get_current_frame ()))
|
|
|
|
step = 0;
|
|
|
|
set_executing (inferior_ptid, 1);
|
|
|
|
}
|
|
|
|
|
2011-05-27 02:11:33 +08:00
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: record_wait "
|
|
|
|
"issuing one more step in the target beneath\n");
|
2009-04-30 10:58:37 +08:00
|
|
|
record_beneath_to_resume (record_beneath_to_resume_ops,
|
2010-07-19 15:55:43 +08:00
|
|
|
ptid, step,
|
2012-05-25 00:51:47 +08:00
|
|
|
GDB_SIGNAL_0);
|
2009-04-30 10:58:37 +08:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The inferior is broken by a breakpoint or a signal. */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
struct regcache *regcache = get_current_regcache ();
|
* defs.h (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter.
* utils.c (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter, use it instead of current_gdbarch.
* ui-out.h (ui_out_field_core_addr): Add GDBARCH parameter.
* ui-out.c (ui_out_field_core_addr): Add GDBARCH parameter,
use it instead of current_gdbarch.
Update calls to ui_out_field_core_addr to pass architecture:
* ada-lang.c (print_one_exception): Update.
* breakpoint.c (print_one_breakpoint_location,
print_one_exception_catchpoint): Update.
* disasm.c (dump_insns): Update.
* darwin-nat-info.c (darwin_debug_regions_recurse): Update.
* mi/mi-main.c (mi_cmd_data_read_memory): Update.
* mi/mi-symbol-cmds.c: Include "objfiles.h".
(mi_cmd_symbol_list_lines): Update.
* stack.c (print_frame_info, print_frame): Update.
Update callers of paddress to pass architecture:
* ada-tasks.c (info_task): Update.
* ada-valprint.c (ada_val_print_1): Update.
* annotate.c (annotate_source, annotate_frame_begin): Update.
* breakpoint.c (insert_bp_location, describe_other_breakpoints,
mention): Update.
* cli/cli-cmds.c (edit_command, list_command, print_disassembly):
Update.
* corefile.c (memory_error): Update.
* c-valprint.c (print_function_pointer_address, c_val_print): Update.
* disasm.c (dis_asm_print_address): Update.
* exec.c (print_section_info): Update.
* f-valprint.c (f_val_print): Update.
* infcmd.c: Include "arch-utils.h".
(jump_command, program_info): Update.
* linux-fork.c: Include "arch-utils.h".
(info_forks_command): Update.
* m2-valprint.c (print_function_pointer_address,
print_unpacked_pointer, print_variable_at_address,
m2_val_print): Update.
* m32r-rom.c (m32r_load_section, m32r_load, m32r_upload_command):
Update.
* printcmd.c (print_address, print_address_demangle, address_info):
Update.
* p-valprint.c (pascal_val_print): Update.
* source.c: Include "arch-utils.h".
(line_info): Update.
* stack.c (frame_info, print_block_frame_labels): Update.
* symfile.c (add_symbol_file_command, list_overlays_command): Update.
* symmisc.c (dump_msymbols, dump_psymtab, dump_symtab_1,
print_symbol, print_partial_symbols, maintenance_info_psymtabs,
maintenance_check_symtabs): Update.
* symtab.c (find_pc_sect_symtab): Update.
* target.c (deprecated_debug_xfer_memory): Update.
* tracepoint.c (scope_info): Update.
* tui/tui-stack.c (tui_make_status_line): Update.
* valprint.c (val_print_string): Update.
Update callers of paddr_nz to use paddress instead (keeping
user-visible output identical):
* alpha-tdep.c (alpha_heuristic_proc_start): Update.
* amd64-tdep.c (fixup_riprel, amd64_displaced_step_copy_insn,
amd64_displaced_step_fixup): Update.
* arch-utils.c (simple_displaced_step_copy_insn): Update.
* auxv.c (fprint_target_auxv): Update.
* breakpoint.c (insert_single_step_breakpoint): Update.
* buildsym.c (finish_block): Update.
* cli/cli-dump.c (restore_section_callback): Update.
* fbsd-nat.c (fbsd_find_memory_regions): Update.
* frame.c (frame_unwind_register_value): Update.
* gcore.c (gcore_create_callback): Update.
* hppa-tdep.c (hppa_frame_cache, hppa_skip_trampoline_code): Update.
* i386-tdep.c (i386_displaced_step_fixup, i386_record_modrm,
i386_record_lea_modrm_addr, i386_record_lea_modrm,
i386_process_record): Update.
* ia64-tdep.c (ia64_frame_this_id, ia64_sigtramp_frame_this_id,
ia64_libunwind_frame_this_id, ia64_libunwind_sigtramp_frame_this_id,
ia64_dummy_id, ia64_access_reg, ia64_access_rse_reg): Update.
* infrun.c (displaced_step_prepare, displaced_step_fixup,
handle_inferior_event, insert_step_resume_breakpoint_at_sal,
insert_longjmp_resume_breakpoint): Update.
* linux-nat.c (linux_nat_find_memory_regions): Update.
* linux-record.c (record_linux_system_call): Update.
* mips-tdep.c (heuristic_proc_start, mips_eabi_push_dummy_call,
mips_n32n64_push_dummy_call, mips_o32_push_dummy_call,
mips_o64_push_dummy_call): Update.
* monitor.c (monitor_error, monitor_remove_breakpoint): Update.
* record.c (record_arch_list_add_mem, record_wait,
record_xfer_partial): Update.
* remote-mips.c (mips_fetch_word, mips_check_lsi_error,
mips_common_breakpoint): Update.
* remote-sim.c (gdbsim_xfer_inferior_memory): Update.
* rs6000-tdep.c (ppc_displaced_step_fixup): Update.
* solib-som.c (som_current_sos): Update.
* symfile.c (load_progress, generic_load): Update.
* symfile-mem.c (add_vsyscall_page): Update.
* valops.c (value_fetch_lazy): Update.
* windows-tdep.c (windows_xfer_shared_library): Update.
Update callers of paddr_nz to use paddress instead (changing
user-visible output to make it more correct):
* dwarf2loc.c (locexpr_describe_location): Update.
* ia64-tdep.c (ia64_memory_insert_breakpoint,
ia64_memory_remove_breakpoint): Update.
* jv-valprint.c (java_value_print): Update.
* m32c-tdep.c (m32c_m16c_address_to_pointer): Update.
* monitor.c (monitor_read_memory): Update.
Update callers of paddr to use paddress instead (changing
user-visible output to make it more correct):
* arm-tdep.c (arm_push_dummy_call): Update.
* breakpoint.c (insert_bp_location, create_thread_event_breakpoint,
create_breakpoint): Update.
* darwin-nat-info.c (darwin_debug_regions): Update.
* dcache.c (dcache_info): Update.
* dsrec.c (load_srec, make_srec): Update.
* dwarf2-frame.c (dwarf2_restore_rule, execute_cfa_program,
dwarf2_frame_cache): Update.
* gcore.c (gcore_copy_callback): Update.
* gnu-nat.c (gnu_xfer_memory): Update.
* mips-linux-nat.c (mips_show_dr): Update.
* monitor.c (monitor_write_memory, monitor_insert_breakpoint,
monitor_remove_breakpoint): Update.
* remote.c (compare_sections_command): Update.
* remote-m32r-sdi.c (m32r_xfer_memory, m32r_insert_breakpoint,
m32r_remove_breakpoint, m32r_insert_watchpoint,
m32r_remove_watchpoint): Update.
* sol-thread.c (info_cb): Update.
* symfile.c (load_progress): Update.
Update callers of paddress or paddr_nz to use hex_string instead
(changes output of internal/error/debug messages only):
* dwarf2read.c (dump_die_shallow): Update.
* frame.c (fprint_field, fprint_frame, frame_pc_unwind,
get_frame_func, create_new_frame): Update.
* hppa-tdep.c (find_unwind_entry, unwind_command): Update.
* ia64-tdep.c (get_kernel_table, ia64_find_proc_info_x,
ia64_get_dyn_info_list): Update.
* maint.c (maintenance_translate_address): Update.
* mi/mi-cmd-var.c (mi_cmd_var_create): Update.
* target.c (target_flash_erase): Update.
Update callers of paddr/paddr_nz to use phex/phex_nz instead,
using an appropriate address size. Remove use of strlen_paddr.
* exec.c (exec_files_info): Update.
* i386-nat.c (i386_show_dr): Update.
* remote.c (remote_flash_erase): Update.
* m32r-rom.c (m32r_load_section): Update.
* monitor.c (monitor_vsprintf, monitor_store_register): Update.
* remote.c (remote_check_symbols, remote_search_memory): Update.
* remote-mips.c (mips_request, mips_common_breakpoint): Update.
* scm-valprint.c (scm_ipruk, scm_scmval_print): Update.
* sh64-tdep.c (sh64_show_media_regs, sh64_show_compact_regs): Update.
* sh-tdep.c (sh_generic_show_regs, sh3_show_regs, sh2e_show_regs,
sh2a_show_regs, sh2a_nofpu_show_regs, sh3e_show_regs,
sh3_dsp_show_regs, sh4_show_regs, sh4_nofpu_show_regs,
sh_dsp_show_regs): Update.
* xcoffsolib.c (sharedlibrary_command): Update.
* maint.c (maint_print_section_info): Add ADDR_SIZE parameter.
Use hex_string_custom instead of paddr.
(print_bfd_section_info): Pass address size.
(print_objfile_section_info): Likewise.
* annotate.h (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* annotate.c (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* source.c (identify_source_line): Update call to annotate_source.
* stack.c (print_frame_info, print_frame): Update call to
annotate_frame_begin.
* breakpoint.c (describe_other_breakpoints): Add GDBARCH parameter.
(create_breakpoint, create_ada_exception_breakpoint): Update call.
* stack.c (print_block_frame_labels): Add GDBARCH parameter.
(print_frame_label_vars): Update call.
* symmisc.c (print_partial_symbols): Add GDBARCH parameter.
(dump_psymtab): Update call to print_partial_symbols.
(struct print_symbol_args): Add GDBARCH member.
(dump_symtab_1): Set print_symbol_args architecture member.
(print_symbol): Use it.
* windows-tdep.h (windows_xfer_shared_library): Add GDBARCH
parameter.
* windows-tdep.c (windows_xfer_shared_library): Likewise.
* i386-cygwin-tdep.c (struct cpms_data): Add GDBARCH member.
(core_process_module_section): Pass architecture from cpms_data to
windows_xfer_shared_library.
(windows_core_xfer_shared_libraries): Initialize cmps_data
architecture member.
* windows-nat.c (windows_xfer_shared_libraries): Pass architecture
to windows_xfer_shared_library.
* defs.h (print_address): Add GDBARCH parameter.
* printcmd.c (print_address): Add GDBARCH parameter.
(print_scalar_formatted, do_examine): Update call.
* findcmd.c (find_command): Update call.
* tracepoint.c: Include "arch-utils.h".
(trace_find_line_command): Update call.
* tui/tui-disasm.c (tui_disassemble): Update call.
* value.h (print_address_demangle): Add GDBARCH parameter.
* printcmd.c (print_address_demangle): Add GDBARCH parameter.
* c-valprint.c (print_function_pointer_address, c_val_print):
Update call.
* f-valprint.c (f_val_print): Update call.
* gnu-v3-abi.c (gnuv3_print_method_ptr): Update call.
* jv-valprint.c (java_val_print): Update call.
* m2-valprint.c (print_function_pointer_address, m2_val_print):
Update call.
* p-valprint.c (pascal_val_print): Update call.
* disasm.c (gdb_disassemble_info): Install architecture into
di.application_data field.
testsuite/ChangeLog:
* gdb.threads/tls-shared.exp: Update to locexpr_describe_location
change to prefix TLS offset in hex with 0x.
doc/ChangeLog:
* gdbint.texinfo (Item Output Functions): Update signature
for ui_out_field_core_addr.
2009-07-03 01:21:10 +08:00
|
|
|
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
2009-11-22 23:47:31 +08:00
|
|
|
struct address_space *aspace = get_regcache_aspace (regcache);
|
2009-04-30 10:58:37 +08:00
|
|
|
int continue_flag = 1;
|
|
|
|
int first_record_end = 1;
|
|
|
|
struct cleanup *old_cleanups = make_cleanup (record_wait_cleanups, 0);
|
|
|
|
CORE_ADDR tmp_pc;
|
|
|
|
|
2009-11-22 23:38:59 +08:00
|
|
|
record_hw_watchpoint = 0;
|
2009-04-30 10:58:37 +08:00
|
|
|
status->kind = TARGET_WAITKIND_STOPPED;
|
|
|
|
|
|
|
|
/* Check breakpoint when forward execute. */
|
|
|
|
if (execution_direction == EXEC_FORWARD)
|
|
|
|
{
|
|
|
|
tmp_pc = regcache_read_pc (regcache);
|
2009-11-22 23:47:31 +08:00
|
|
|
if (breakpoint_inserted_here_p (aspace, tmp_pc))
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
2009-11-22 23:47:31 +08:00
|
|
|
int decr_pc_after_break = gdbarch_decr_pc_after_break (gdbarch);
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
* defs.h (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter.
* utils.c (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter, use it instead of current_gdbarch.
* ui-out.h (ui_out_field_core_addr): Add GDBARCH parameter.
* ui-out.c (ui_out_field_core_addr): Add GDBARCH parameter,
use it instead of current_gdbarch.
Update calls to ui_out_field_core_addr to pass architecture:
* ada-lang.c (print_one_exception): Update.
* breakpoint.c (print_one_breakpoint_location,
print_one_exception_catchpoint): Update.
* disasm.c (dump_insns): Update.
* darwin-nat-info.c (darwin_debug_regions_recurse): Update.
* mi/mi-main.c (mi_cmd_data_read_memory): Update.
* mi/mi-symbol-cmds.c: Include "objfiles.h".
(mi_cmd_symbol_list_lines): Update.
* stack.c (print_frame_info, print_frame): Update.
Update callers of paddress to pass architecture:
* ada-tasks.c (info_task): Update.
* ada-valprint.c (ada_val_print_1): Update.
* annotate.c (annotate_source, annotate_frame_begin): Update.
* breakpoint.c (insert_bp_location, describe_other_breakpoints,
mention): Update.
* cli/cli-cmds.c (edit_command, list_command, print_disassembly):
Update.
* corefile.c (memory_error): Update.
* c-valprint.c (print_function_pointer_address, c_val_print): Update.
* disasm.c (dis_asm_print_address): Update.
* exec.c (print_section_info): Update.
* f-valprint.c (f_val_print): Update.
* infcmd.c: Include "arch-utils.h".
(jump_command, program_info): Update.
* linux-fork.c: Include "arch-utils.h".
(info_forks_command): Update.
* m2-valprint.c (print_function_pointer_address,
print_unpacked_pointer, print_variable_at_address,
m2_val_print): Update.
* m32r-rom.c (m32r_load_section, m32r_load, m32r_upload_command):
Update.
* printcmd.c (print_address, print_address_demangle, address_info):
Update.
* p-valprint.c (pascal_val_print): Update.
* source.c: Include "arch-utils.h".
(line_info): Update.
* stack.c (frame_info, print_block_frame_labels): Update.
* symfile.c (add_symbol_file_command, list_overlays_command): Update.
* symmisc.c (dump_msymbols, dump_psymtab, dump_symtab_1,
print_symbol, print_partial_symbols, maintenance_info_psymtabs,
maintenance_check_symtabs): Update.
* symtab.c (find_pc_sect_symtab): Update.
* target.c (deprecated_debug_xfer_memory): Update.
* tracepoint.c (scope_info): Update.
* tui/tui-stack.c (tui_make_status_line): Update.
* valprint.c (val_print_string): Update.
Update callers of paddr_nz to use paddress instead (keeping
user-visible output identical):
* alpha-tdep.c (alpha_heuristic_proc_start): Update.
* amd64-tdep.c (fixup_riprel, amd64_displaced_step_copy_insn,
amd64_displaced_step_fixup): Update.
* arch-utils.c (simple_displaced_step_copy_insn): Update.
* auxv.c (fprint_target_auxv): Update.
* breakpoint.c (insert_single_step_breakpoint): Update.
* buildsym.c (finish_block): Update.
* cli/cli-dump.c (restore_section_callback): Update.
* fbsd-nat.c (fbsd_find_memory_regions): Update.
* frame.c (frame_unwind_register_value): Update.
* gcore.c (gcore_create_callback): Update.
* hppa-tdep.c (hppa_frame_cache, hppa_skip_trampoline_code): Update.
* i386-tdep.c (i386_displaced_step_fixup, i386_record_modrm,
i386_record_lea_modrm_addr, i386_record_lea_modrm,
i386_process_record): Update.
* ia64-tdep.c (ia64_frame_this_id, ia64_sigtramp_frame_this_id,
ia64_libunwind_frame_this_id, ia64_libunwind_sigtramp_frame_this_id,
ia64_dummy_id, ia64_access_reg, ia64_access_rse_reg): Update.
* infrun.c (displaced_step_prepare, displaced_step_fixup,
handle_inferior_event, insert_step_resume_breakpoint_at_sal,
insert_longjmp_resume_breakpoint): Update.
* linux-nat.c (linux_nat_find_memory_regions): Update.
* linux-record.c (record_linux_system_call): Update.
* mips-tdep.c (heuristic_proc_start, mips_eabi_push_dummy_call,
mips_n32n64_push_dummy_call, mips_o32_push_dummy_call,
mips_o64_push_dummy_call): Update.
* monitor.c (monitor_error, monitor_remove_breakpoint): Update.
* record.c (record_arch_list_add_mem, record_wait,
record_xfer_partial): Update.
* remote-mips.c (mips_fetch_word, mips_check_lsi_error,
mips_common_breakpoint): Update.
* remote-sim.c (gdbsim_xfer_inferior_memory): Update.
* rs6000-tdep.c (ppc_displaced_step_fixup): Update.
* solib-som.c (som_current_sos): Update.
* symfile.c (load_progress, generic_load): Update.
* symfile-mem.c (add_vsyscall_page): Update.
* valops.c (value_fetch_lazy): Update.
* windows-tdep.c (windows_xfer_shared_library): Update.
Update callers of paddr_nz to use paddress instead (changing
user-visible output to make it more correct):
* dwarf2loc.c (locexpr_describe_location): Update.
* ia64-tdep.c (ia64_memory_insert_breakpoint,
ia64_memory_remove_breakpoint): Update.
* jv-valprint.c (java_value_print): Update.
* m32c-tdep.c (m32c_m16c_address_to_pointer): Update.
* monitor.c (monitor_read_memory): Update.
Update callers of paddr to use paddress instead (changing
user-visible output to make it more correct):
* arm-tdep.c (arm_push_dummy_call): Update.
* breakpoint.c (insert_bp_location, create_thread_event_breakpoint,
create_breakpoint): Update.
* darwin-nat-info.c (darwin_debug_regions): Update.
* dcache.c (dcache_info): Update.
* dsrec.c (load_srec, make_srec): Update.
* dwarf2-frame.c (dwarf2_restore_rule, execute_cfa_program,
dwarf2_frame_cache): Update.
* gcore.c (gcore_copy_callback): Update.
* gnu-nat.c (gnu_xfer_memory): Update.
* mips-linux-nat.c (mips_show_dr): Update.
* monitor.c (monitor_write_memory, monitor_insert_breakpoint,
monitor_remove_breakpoint): Update.
* remote.c (compare_sections_command): Update.
* remote-m32r-sdi.c (m32r_xfer_memory, m32r_insert_breakpoint,
m32r_remove_breakpoint, m32r_insert_watchpoint,
m32r_remove_watchpoint): Update.
* sol-thread.c (info_cb): Update.
* symfile.c (load_progress): Update.
Update callers of paddress or paddr_nz to use hex_string instead
(changes output of internal/error/debug messages only):
* dwarf2read.c (dump_die_shallow): Update.
* frame.c (fprint_field, fprint_frame, frame_pc_unwind,
get_frame_func, create_new_frame): Update.
* hppa-tdep.c (find_unwind_entry, unwind_command): Update.
* ia64-tdep.c (get_kernel_table, ia64_find_proc_info_x,
ia64_get_dyn_info_list): Update.
* maint.c (maintenance_translate_address): Update.
* mi/mi-cmd-var.c (mi_cmd_var_create): Update.
* target.c (target_flash_erase): Update.
Update callers of paddr/paddr_nz to use phex/phex_nz instead,
using an appropriate address size. Remove use of strlen_paddr.
* exec.c (exec_files_info): Update.
* i386-nat.c (i386_show_dr): Update.
* remote.c (remote_flash_erase): Update.
* m32r-rom.c (m32r_load_section): Update.
* monitor.c (monitor_vsprintf, monitor_store_register): Update.
* remote.c (remote_check_symbols, remote_search_memory): Update.
* remote-mips.c (mips_request, mips_common_breakpoint): Update.
* scm-valprint.c (scm_ipruk, scm_scmval_print): Update.
* sh64-tdep.c (sh64_show_media_regs, sh64_show_compact_regs): Update.
* sh-tdep.c (sh_generic_show_regs, sh3_show_regs, sh2e_show_regs,
sh2a_show_regs, sh2a_nofpu_show_regs, sh3e_show_regs,
sh3_dsp_show_regs, sh4_show_regs, sh4_nofpu_show_regs,
sh_dsp_show_regs): Update.
* xcoffsolib.c (sharedlibrary_command): Update.
* maint.c (maint_print_section_info): Add ADDR_SIZE parameter.
Use hex_string_custom instead of paddr.
(print_bfd_section_info): Pass address size.
(print_objfile_section_info): Likewise.
* annotate.h (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* annotate.c (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* source.c (identify_source_line): Update call to annotate_source.
* stack.c (print_frame_info, print_frame): Update call to
annotate_frame_begin.
* breakpoint.c (describe_other_breakpoints): Add GDBARCH parameter.
(create_breakpoint, create_ada_exception_breakpoint): Update call.
* stack.c (print_block_frame_labels): Add GDBARCH parameter.
(print_frame_label_vars): Update call.
* symmisc.c (print_partial_symbols): Add GDBARCH parameter.
(dump_psymtab): Update call to print_partial_symbols.
(struct print_symbol_args): Add GDBARCH member.
(dump_symtab_1): Set print_symbol_args architecture member.
(print_symbol): Use it.
* windows-tdep.h (windows_xfer_shared_library): Add GDBARCH
parameter.
* windows-tdep.c (windows_xfer_shared_library): Likewise.
* i386-cygwin-tdep.c (struct cpms_data): Add GDBARCH member.
(core_process_module_section): Pass architecture from cpms_data to
windows_xfer_shared_library.
(windows_core_xfer_shared_libraries): Initialize cmps_data
architecture member.
* windows-nat.c (windows_xfer_shared_libraries): Pass architecture
to windows_xfer_shared_library.
* defs.h (print_address): Add GDBARCH parameter.
* printcmd.c (print_address): Add GDBARCH parameter.
(print_scalar_formatted, do_examine): Update call.
* findcmd.c (find_command): Update call.
* tracepoint.c: Include "arch-utils.h".
(trace_find_line_command): Update call.
* tui/tui-disasm.c (tui_disassemble): Update call.
* value.h (print_address_demangle): Add GDBARCH parameter.
* printcmd.c (print_address_demangle): Add GDBARCH parameter.
* c-valprint.c (print_function_pointer_address, c_val_print):
Update call.
* f-valprint.c (f_val_print): Update call.
* gnu-v3-abi.c (gnuv3_print_method_ptr): Update call.
* jv-valprint.c (java_val_print): Update call.
* m2-valprint.c (print_function_pointer_address, m2_val_print):
Update call.
* p-valprint.c (pascal_val_print): Update call.
* disasm.c (gdb_disassemble_info): Install architecture into
di.application_data field.
testsuite/ChangeLog:
* gdb.threads/tls-shared.exp: Update to locexpr_describe_location
change to prefix TLS offset in hex with 0x.
doc/ChangeLog:
* gdbint.texinfo (Item Output Functions): Update signature
for ui_out_field_core_addr.
2009-07-03 01:21:10 +08:00
|
|
|
"Process record: break at %s.\n",
|
|
|
|
paddress (gdbarch, tmp_pc));
|
2009-11-22 23:47:31 +08:00
|
|
|
|
|
|
|
if (decr_pc_after_break
|
|
|
|
&& !record_resume_step
|
|
|
|
&& software_breakpoint_inserted_here_p (aspace, tmp_pc))
|
2009-04-30 10:58:37 +08:00
|
|
|
regcache_write_pc (regcache,
|
2009-11-22 23:47:31 +08:00
|
|
|
tmp_pc + decr_pc_after_break);
|
2009-04-30 10:58:37 +08:00
|
|
|
goto replay_out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If GDB is in terminal_inferior mode, it will not get the signal.
|
|
|
|
And in GDB replay mode, GDB doesn't need to be in terminal_inferior
|
|
|
|
mode, because inferior will not executed.
|
|
|
|
Then set it to terminal_ours to make GDB get the signal. */
|
|
|
|
target_terminal_ours ();
|
|
|
|
|
|
|
|
/* In EXEC_FORWARD mode, record_list points to the tail of prev
|
|
|
|
instruction. */
|
|
|
|
if (execution_direction == EXEC_FORWARD && record_list->next)
|
|
|
|
record_list = record_list->next;
|
|
|
|
|
|
|
|
/* Loop over the record_list, looking for the next place to
|
|
|
|
stop. */
|
|
|
|
do
|
|
|
|
{
|
|
|
|
/* Check for beginning and end of log. */
|
|
|
|
if (execution_direction == EXEC_REVERSE
|
|
|
|
&& record_list == &record_first)
|
|
|
|
{
|
|
|
|
/* Hit beginning of record log in reverse. */
|
|
|
|
status->kind = TARGET_WAITKIND_NO_HISTORY;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (execution_direction != EXEC_REVERSE && !record_list->next)
|
|
|
|
{
|
|
|
|
/* Hit end of record log going forward. */
|
|
|
|
status->kind = TARGET_WAITKIND_NO_HISTORY;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2009-10-21 06:56:04 +08:00
|
|
|
record_exec_insn (regcache, gdbarch, record_list);
|
|
|
|
|
|
|
|
if (record_list->type == record_end)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
|
|
|
if (record_debug > 1)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: record_end %s to "
|
|
|
|
"inferior.\n",
|
|
|
|
host_address_to_string (record_list));
|
|
|
|
|
|
|
|
if (first_record_end && execution_direction == EXEC_REVERSE)
|
|
|
|
{
|
|
|
|
/* When reverse excute, the first record_end is the part of
|
|
|
|
current instruction. */
|
|
|
|
first_record_end = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* In EXEC_REVERSE mode, this is the record_end of prev
|
|
|
|
instruction.
|
|
|
|
In EXEC_FORWARD mode, this is the record_end of current
|
|
|
|
instruction. */
|
|
|
|
/* step */
|
|
|
|
if (record_resume_step)
|
|
|
|
{
|
|
|
|
if (record_debug > 1)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: step.\n");
|
|
|
|
continue_flag = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* check breakpoint */
|
|
|
|
tmp_pc = regcache_read_pc (regcache);
|
2009-11-22 23:47:31 +08:00
|
|
|
if (breakpoint_inserted_here_p (aspace, tmp_pc))
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
2009-11-22 23:47:31 +08:00
|
|
|
int decr_pc_after_break
|
|
|
|
= gdbarch_decr_pc_after_break (gdbarch);
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: break "
|
* defs.h (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter.
* utils.c (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter, use it instead of current_gdbarch.
* ui-out.h (ui_out_field_core_addr): Add GDBARCH parameter.
* ui-out.c (ui_out_field_core_addr): Add GDBARCH parameter,
use it instead of current_gdbarch.
Update calls to ui_out_field_core_addr to pass architecture:
* ada-lang.c (print_one_exception): Update.
* breakpoint.c (print_one_breakpoint_location,
print_one_exception_catchpoint): Update.
* disasm.c (dump_insns): Update.
* darwin-nat-info.c (darwin_debug_regions_recurse): Update.
* mi/mi-main.c (mi_cmd_data_read_memory): Update.
* mi/mi-symbol-cmds.c: Include "objfiles.h".
(mi_cmd_symbol_list_lines): Update.
* stack.c (print_frame_info, print_frame): Update.
Update callers of paddress to pass architecture:
* ada-tasks.c (info_task): Update.
* ada-valprint.c (ada_val_print_1): Update.
* annotate.c (annotate_source, annotate_frame_begin): Update.
* breakpoint.c (insert_bp_location, describe_other_breakpoints,
mention): Update.
* cli/cli-cmds.c (edit_command, list_command, print_disassembly):
Update.
* corefile.c (memory_error): Update.
* c-valprint.c (print_function_pointer_address, c_val_print): Update.
* disasm.c (dis_asm_print_address): Update.
* exec.c (print_section_info): Update.
* f-valprint.c (f_val_print): Update.
* infcmd.c: Include "arch-utils.h".
(jump_command, program_info): Update.
* linux-fork.c: Include "arch-utils.h".
(info_forks_command): Update.
* m2-valprint.c (print_function_pointer_address,
print_unpacked_pointer, print_variable_at_address,
m2_val_print): Update.
* m32r-rom.c (m32r_load_section, m32r_load, m32r_upload_command):
Update.
* printcmd.c (print_address, print_address_demangle, address_info):
Update.
* p-valprint.c (pascal_val_print): Update.
* source.c: Include "arch-utils.h".
(line_info): Update.
* stack.c (frame_info, print_block_frame_labels): Update.
* symfile.c (add_symbol_file_command, list_overlays_command): Update.
* symmisc.c (dump_msymbols, dump_psymtab, dump_symtab_1,
print_symbol, print_partial_symbols, maintenance_info_psymtabs,
maintenance_check_symtabs): Update.
* symtab.c (find_pc_sect_symtab): Update.
* target.c (deprecated_debug_xfer_memory): Update.
* tracepoint.c (scope_info): Update.
* tui/tui-stack.c (tui_make_status_line): Update.
* valprint.c (val_print_string): Update.
Update callers of paddr_nz to use paddress instead (keeping
user-visible output identical):
* alpha-tdep.c (alpha_heuristic_proc_start): Update.
* amd64-tdep.c (fixup_riprel, amd64_displaced_step_copy_insn,
amd64_displaced_step_fixup): Update.
* arch-utils.c (simple_displaced_step_copy_insn): Update.
* auxv.c (fprint_target_auxv): Update.
* breakpoint.c (insert_single_step_breakpoint): Update.
* buildsym.c (finish_block): Update.
* cli/cli-dump.c (restore_section_callback): Update.
* fbsd-nat.c (fbsd_find_memory_regions): Update.
* frame.c (frame_unwind_register_value): Update.
* gcore.c (gcore_create_callback): Update.
* hppa-tdep.c (hppa_frame_cache, hppa_skip_trampoline_code): Update.
* i386-tdep.c (i386_displaced_step_fixup, i386_record_modrm,
i386_record_lea_modrm_addr, i386_record_lea_modrm,
i386_process_record): Update.
* ia64-tdep.c (ia64_frame_this_id, ia64_sigtramp_frame_this_id,
ia64_libunwind_frame_this_id, ia64_libunwind_sigtramp_frame_this_id,
ia64_dummy_id, ia64_access_reg, ia64_access_rse_reg): Update.
* infrun.c (displaced_step_prepare, displaced_step_fixup,
handle_inferior_event, insert_step_resume_breakpoint_at_sal,
insert_longjmp_resume_breakpoint): Update.
* linux-nat.c (linux_nat_find_memory_regions): Update.
* linux-record.c (record_linux_system_call): Update.
* mips-tdep.c (heuristic_proc_start, mips_eabi_push_dummy_call,
mips_n32n64_push_dummy_call, mips_o32_push_dummy_call,
mips_o64_push_dummy_call): Update.
* monitor.c (monitor_error, monitor_remove_breakpoint): Update.
* record.c (record_arch_list_add_mem, record_wait,
record_xfer_partial): Update.
* remote-mips.c (mips_fetch_word, mips_check_lsi_error,
mips_common_breakpoint): Update.
* remote-sim.c (gdbsim_xfer_inferior_memory): Update.
* rs6000-tdep.c (ppc_displaced_step_fixup): Update.
* solib-som.c (som_current_sos): Update.
* symfile.c (load_progress, generic_load): Update.
* symfile-mem.c (add_vsyscall_page): Update.
* valops.c (value_fetch_lazy): Update.
* windows-tdep.c (windows_xfer_shared_library): Update.
Update callers of paddr_nz to use paddress instead (changing
user-visible output to make it more correct):
* dwarf2loc.c (locexpr_describe_location): Update.
* ia64-tdep.c (ia64_memory_insert_breakpoint,
ia64_memory_remove_breakpoint): Update.
* jv-valprint.c (java_value_print): Update.
* m32c-tdep.c (m32c_m16c_address_to_pointer): Update.
* monitor.c (monitor_read_memory): Update.
Update callers of paddr to use paddress instead (changing
user-visible output to make it more correct):
* arm-tdep.c (arm_push_dummy_call): Update.
* breakpoint.c (insert_bp_location, create_thread_event_breakpoint,
create_breakpoint): Update.
* darwin-nat-info.c (darwin_debug_regions): Update.
* dcache.c (dcache_info): Update.
* dsrec.c (load_srec, make_srec): Update.
* dwarf2-frame.c (dwarf2_restore_rule, execute_cfa_program,
dwarf2_frame_cache): Update.
* gcore.c (gcore_copy_callback): Update.
* gnu-nat.c (gnu_xfer_memory): Update.
* mips-linux-nat.c (mips_show_dr): Update.
* monitor.c (monitor_write_memory, monitor_insert_breakpoint,
monitor_remove_breakpoint): Update.
* remote.c (compare_sections_command): Update.
* remote-m32r-sdi.c (m32r_xfer_memory, m32r_insert_breakpoint,
m32r_remove_breakpoint, m32r_insert_watchpoint,
m32r_remove_watchpoint): Update.
* sol-thread.c (info_cb): Update.
* symfile.c (load_progress): Update.
Update callers of paddress or paddr_nz to use hex_string instead
(changes output of internal/error/debug messages only):
* dwarf2read.c (dump_die_shallow): Update.
* frame.c (fprint_field, fprint_frame, frame_pc_unwind,
get_frame_func, create_new_frame): Update.
* hppa-tdep.c (find_unwind_entry, unwind_command): Update.
* ia64-tdep.c (get_kernel_table, ia64_find_proc_info_x,
ia64_get_dyn_info_list): Update.
* maint.c (maintenance_translate_address): Update.
* mi/mi-cmd-var.c (mi_cmd_var_create): Update.
* target.c (target_flash_erase): Update.
Update callers of paddr/paddr_nz to use phex/phex_nz instead,
using an appropriate address size. Remove use of strlen_paddr.
* exec.c (exec_files_info): Update.
* i386-nat.c (i386_show_dr): Update.
* remote.c (remote_flash_erase): Update.
* m32r-rom.c (m32r_load_section): Update.
* monitor.c (monitor_vsprintf, monitor_store_register): Update.
* remote.c (remote_check_symbols, remote_search_memory): Update.
* remote-mips.c (mips_request, mips_common_breakpoint): Update.
* scm-valprint.c (scm_ipruk, scm_scmval_print): Update.
* sh64-tdep.c (sh64_show_media_regs, sh64_show_compact_regs): Update.
* sh-tdep.c (sh_generic_show_regs, sh3_show_regs, sh2e_show_regs,
sh2a_show_regs, sh2a_nofpu_show_regs, sh3e_show_regs,
sh3_dsp_show_regs, sh4_show_regs, sh4_nofpu_show_regs,
sh_dsp_show_regs): Update.
* xcoffsolib.c (sharedlibrary_command): Update.
* maint.c (maint_print_section_info): Add ADDR_SIZE parameter.
Use hex_string_custom instead of paddr.
(print_bfd_section_info): Pass address size.
(print_objfile_section_info): Likewise.
* annotate.h (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* annotate.c (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* source.c (identify_source_line): Update call to annotate_source.
* stack.c (print_frame_info, print_frame): Update call to
annotate_frame_begin.
* breakpoint.c (describe_other_breakpoints): Add GDBARCH parameter.
(create_breakpoint, create_ada_exception_breakpoint): Update call.
* stack.c (print_block_frame_labels): Add GDBARCH parameter.
(print_frame_label_vars): Update call.
* symmisc.c (print_partial_symbols): Add GDBARCH parameter.
(dump_psymtab): Update call to print_partial_symbols.
(struct print_symbol_args): Add GDBARCH member.
(dump_symtab_1): Set print_symbol_args architecture member.
(print_symbol): Use it.
* windows-tdep.h (windows_xfer_shared_library): Add GDBARCH
parameter.
* windows-tdep.c (windows_xfer_shared_library): Likewise.
* i386-cygwin-tdep.c (struct cpms_data): Add GDBARCH member.
(core_process_module_section): Pass architecture from cpms_data to
windows_xfer_shared_library.
(windows_core_xfer_shared_libraries): Initialize cmps_data
architecture member.
* windows-nat.c (windows_xfer_shared_libraries): Pass architecture
to windows_xfer_shared_library.
* defs.h (print_address): Add GDBARCH parameter.
* printcmd.c (print_address): Add GDBARCH parameter.
(print_scalar_formatted, do_examine): Update call.
* findcmd.c (find_command): Update call.
* tracepoint.c: Include "arch-utils.h".
(trace_find_line_command): Update call.
* tui/tui-disasm.c (tui_disassemble): Update call.
* value.h (print_address_demangle): Add GDBARCH parameter.
* printcmd.c (print_address_demangle): Add GDBARCH parameter.
* c-valprint.c (print_function_pointer_address, c_val_print):
Update call.
* f-valprint.c (f_val_print): Update call.
* gnu-v3-abi.c (gnuv3_print_method_ptr): Update call.
* jv-valprint.c (java_val_print): Update call.
* m2-valprint.c (print_function_pointer_address, m2_val_print):
Update call.
* p-valprint.c (pascal_val_print): Update call.
* disasm.c (gdb_disassemble_info): Install architecture into
di.application_data field.
testsuite/ChangeLog:
* gdb.threads/tls-shared.exp: Update to locexpr_describe_location
change to prefix TLS offset in hex with 0x.
doc/ChangeLog:
* gdbint.texinfo (Item Output Functions): Update signature
for ui_out_field_core_addr.
2009-07-03 01:21:10 +08:00
|
|
|
"at %s.\n",
|
|
|
|
paddress (gdbarch, tmp_pc));
|
2009-11-22 23:47:31 +08:00
|
|
|
if (decr_pc_after_break
|
2009-04-30 10:58:37 +08:00
|
|
|
&& execution_direction == EXEC_FORWARD
|
2009-11-22 23:47:31 +08:00
|
|
|
&& !record_resume_step
|
|
|
|
&& software_breakpoint_inserted_here_p (aspace,
|
|
|
|
tmp_pc))
|
2009-04-30 10:58:37 +08:00
|
|
|
regcache_write_pc (regcache,
|
2009-11-22 23:47:31 +08:00
|
|
|
tmp_pc + decr_pc_after_break);
|
2009-04-30 10:58:37 +08:00
|
|
|
continue_flag = 0;
|
|
|
|
}
|
2009-11-22 23:38:59 +08:00
|
|
|
|
|
|
|
if (record_hw_watchpoint)
|
|
|
|
{
|
|
|
|
if (record_debug)
|
2011-01-06 06:22:53 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"Process record: hit hw "
|
|
|
|
"watchpoint.\n");
|
2009-11-22 23:38:59 +08:00
|
|
|
continue_flag = 0;
|
|
|
|
}
|
2009-09-21 13:54:09 +08:00
|
|
|
/* Check target signal */
|
2012-05-25 00:51:47 +08:00
|
|
|
if (record_list->u.end.sigval != GDB_SIGNAL_0)
|
2009-09-21 13:54:09 +08:00
|
|
|
/* FIXME: better way to check */
|
|
|
|
continue_flag = 0;
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (continue_flag)
|
|
|
|
{
|
|
|
|
if (execution_direction == EXEC_REVERSE)
|
|
|
|
{
|
|
|
|
if (record_list->prev)
|
|
|
|
record_list = record_list->prev;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (record_list->next)
|
|
|
|
record_list = record_list->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while (continue_flag);
|
|
|
|
|
|
|
|
replay_out:
|
|
|
|
if (record_get_sig)
|
2012-05-25 00:51:47 +08:00
|
|
|
status->value.sig = GDB_SIGNAL_INT;
|
|
|
|
else if (record_list->u.end.sigval != GDB_SIGNAL_0)
|
2009-09-21 13:54:09 +08:00
|
|
|
/* FIXME: better way to check */
|
|
|
|
status->value.sig = record_list->u.end.sigval;
|
2009-04-30 10:58:37 +08:00
|
|
|
else
|
2012-05-25 00:51:47 +08:00
|
|
|
status->value.sig = GDB_SIGNAL_TRAP;
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
discard_cleanups (old_cleanups);
|
|
|
|
}
|
|
|
|
|
2010-06-08 10:25:31 +08:00
|
|
|
signal (SIGINT, handle_sigint);
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
do_cleanups (set_cleanups);
|
|
|
|
return inferior_ptid;
|
|
|
|
}
|
|
|
|
|
2011-05-27 02:11:33 +08:00
|
|
|
static ptid_t
|
|
|
|
record_wait (struct target_ops *ops,
|
|
|
|
ptid_t ptid, struct target_waitstatus *status,
|
|
|
|
int options)
|
|
|
|
{
|
|
|
|
ptid_t return_ptid;
|
|
|
|
|
|
|
|
return_ptid = record_wait_1 (ops, ptid, status, options);
|
|
|
|
if (status->kind != TARGET_WAITKIND_IGNORE)
|
|
|
|
{
|
|
|
|
/* We're reporting a stop. Make sure any spurious
|
|
|
|
target_wait(WNOHANG) doesn't advance the target until the
|
|
|
|
core wants us resumed again. */
|
|
|
|
record_resumed = 0;
|
|
|
|
}
|
|
|
|
return return_ptid;
|
|
|
|
}
|
|
|
|
|
2009-11-22 23:38:59 +08:00
|
|
|
static int
|
|
|
|
record_stopped_by_watchpoint (void)
|
|
|
|
{
|
|
|
|
if (RECORD_IS_REPLAY)
|
|
|
|
return record_hw_watchpoint;
|
|
|
|
else
|
|
|
|
return record_beneath_to_stopped_by_watchpoint ();
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
record_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
|
|
|
|
{
|
|
|
|
if (RECORD_IS_REPLAY)
|
|
|
|
return 0;
|
|
|
|
else
|
|
|
|
return record_beneath_to_stopped_data_address (ops, addr_p);
|
|
|
|
}
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* "to_disconnect" method for process record target. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
|
|
|
record_disconnect (struct target_ops *target, char *args, int from_tty)
|
|
|
|
{
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog, "Process record: record_disconnect\n");
|
|
|
|
|
|
|
|
unpush_target (&record_ops);
|
|
|
|
target_disconnect (args, from_tty);
|
|
|
|
}
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* "to_detach" method for process record target. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
|
|
|
record_detach (struct target_ops *ops, char *args, int from_tty)
|
|
|
|
{
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog, "Process record: record_detach\n");
|
|
|
|
|
|
|
|
unpush_target (&record_ops);
|
|
|
|
target_detach (args, from_tty);
|
|
|
|
}
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* "to_mourn_inferior" method for process record target. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
|
|
|
record_mourn_inferior (struct target_ops *ops)
|
|
|
|
{
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog, "Process record: "
|
|
|
|
"record_mourn_inferior\n");
|
|
|
|
|
|
|
|
unpush_target (&record_ops);
|
|
|
|
target_mourn_inferior ();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Close process record target before killing the inferior process. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_kill (struct target_ops *ops)
|
|
|
|
{
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog, "Process record: record_kill\n");
|
|
|
|
|
|
|
|
unpush_target (&record_ops);
|
|
|
|
target_kill ();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Record registers change (by user or by GDB) to list as an instruction. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_registers_change (struct regcache *regcache, int regnum)
|
|
|
|
{
|
|
|
|
/* Check record_insn_num. */
|
|
|
|
record_check_insn_num (0);
|
|
|
|
|
|
|
|
record_arch_list_head = NULL;
|
|
|
|
record_arch_list_tail = NULL;
|
|
|
|
|
|
|
|
if (regnum < 0)
|
|
|
|
{
|
|
|
|
int i;
|
2010-05-17 05:11:14 +08:00
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
|
|
|
|
{
|
|
|
|
if (record_arch_list_add_reg (regcache, i))
|
|
|
|
{
|
|
|
|
record_list_release (record_arch_list_tail);
|
|
|
|
error (_("Process record: failed to record execution log."));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (record_arch_list_add_reg (regcache, regnum))
|
|
|
|
{
|
|
|
|
record_list_release (record_arch_list_tail);
|
|
|
|
error (_("Process record: failed to record execution log."));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (record_arch_list_add_end ())
|
|
|
|
{
|
|
|
|
record_list_release (record_arch_list_tail);
|
|
|
|
error (_("Process record: failed to record execution log."));
|
|
|
|
}
|
|
|
|
record_list->next = record_arch_list_head;
|
|
|
|
record_arch_list_head->prev = record_list;
|
|
|
|
record_list = record_arch_list_tail;
|
|
|
|
|
|
|
|
if (record_insn_num == record_insn_max_num && record_insn_max_num)
|
|
|
|
record_list_release_first ();
|
|
|
|
else
|
|
|
|
record_insn_num++;
|
|
|
|
}
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* "to_store_registers" method for process record target. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
|
|
|
record_store_registers (struct target_ops *ops, struct regcache *regcache,
|
|
|
|
int regno)
|
|
|
|
{
|
|
|
|
if (!record_gdb_operation_disable)
|
|
|
|
{
|
|
|
|
if (RECORD_IS_REPLAY)
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
|
|
|
|
/* Let user choose if he wants to write register or not. */
|
|
|
|
if (regno < 0)
|
|
|
|
n =
|
2009-09-25 01:58:04 +08:00
|
|
|
query (_("Because GDB is in replay mode, changing the "
|
|
|
|
"value of a register will make the execution "
|
|
|
|
"log unusable from this point onward. "
|
|
|
|
"Change all registers?"));
|
2009-04-30 10:58:37 +08:00
|
|
|
else
|
|
|
|
n =
|
2009-09-25 01:58:04 +08:00
|
|
|
query (_("Because GDB is in replay mode, changing the value "
|
|
|
|
"of a register will make the execution log unusable "
|
|
|
|
"from this point onward. Change register %s?"),
|
2009-04-30 10:58:37 +08:00
|
|
|
gdbarch_register_name (get_regcache_arch (regcache),
|
|
|
|
regno));
|
|
|
|
|
|
|
|
if (!n)
|
|
|
|
{
|
|
|
|
/* Invalidate the value of regcache that was set in function
|
|
|
|
"regcache_raw_write". */
|
|
|
|
if (regno < 0)
|
|
|
|
{
|
|
|
|
int i;
|
2010-05-17 05:11:14 +08:00
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
for (i = 0;
|
|
|
|
i < gdbarch_num_regs (get_regcache_arch (regcache));
|
|
|
|
i++)
|
|
|
|
regcache_invalidate (regcache, i);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
regcache_invalidate (regcache, regno);
|
|
|
|
|
|
|
|
error (_("Process record canceled the operation."));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Destroy the record from here forward. */
|
2009-10-16 01:15:56 +08:00
|
|
|
record_list_release_following (record_list);
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
record_registers_change (regcache, regno);
|
|
|
|
}
|
|
|
|
record_beneath_to_store_registers (record_beneath_to_store_registers_ops,
|
|
|
|
regcache, regno);
|
|
|
|
}
|
|
|
|
|
2009-10-23 03:32:11 +08:00
|
|
|
/* "to_xfer_partial" method. Behavior is conditional on RECORD_IS_REPLAY.
|
2009-04-30 10:58:37 +08:00
|
|
|
In replay mode, we cannot write memory unles we are willing to
|
|
|
|
invalidate the record/replay log from this point forward. */
|
|
|
|
|
|
|
|
static LONGEST
|
|
|
|
record_xfer_partial (struct target_ops *ops, enum target_object object,
|
|
|
|
const char *annex, gdb_byte *readbuf,
|
|
|
|
const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
|
|
|
|
{
|
|
|
|
if (!record_gdb_operation_disable
|
|
|
|
&& (object == TARGET_OBJECT_MEMORY
|
|
|
|
|| object == TARGET_OBJECT_RAW_MEMORY) && writebuf)
|
|
|
|
{
|
|
|
|
if (RECORD_IS_REPLAY)
|
|
|
|
{
|
|
|
|
/* Let user choose if he wants to write memory or not. */
|
2009-09-25 01:58:04 +08:00
|
|
|
if (!query (_("Because GDB is in replay mode, writing to memory "
|
|
|
|
"will make the execution log unusable from this "
|
|
|
|
"point onward. Write memory at address %s?"),
|
* defs.h (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter.
* utils.c (strlen_paddr, paddr, paddr_nz): Remove.
(paddress): Add GDBARCH parameter, use it instead of current_gdbarch.
* ui-out.h (ui_out_field_core_addr): Add GDBARCH parameter.
* ui-out.c (ui_out_field_core_addr): Add GDBARCH parameter,
use it instead of current_gdbarch.
Update calls to ui_out_field_core_addr to pass architecture:
* ada-lang.c (print_one_exception): Update.
* breakpoint.c (print_one_breakpoint_location,
print_one_exception_catchpoint): Update.
* disasm.c (dump_insns): Update.
* darwin-nat-info.c (darwin_debug_regions_recurse): Update.
* mi/mi-main.c (mi_cmd_data_read_memory): Update.
* mi/mi-symbol-cmds.c: Include "objfiles.h".
(mi_cmd_symbol_list_lines): Update.
* stack.c (print_frame_info, print_frame): Update.
Update callers of paddress to pass architecture:
* ada-tasks.c (info_task): Update.
* ada-valprint.c (ada_val_print_1): Update.
* annotate.c (annotate_source, annotate_frame_begin): Update.
* breakpoint.c (insert_bp_location, describe_other_breakpoints,
mention): Update.
* cli/cli-cmds.c (edit_command, list_command, print_disassembly):
Update.
* corefile.c (memory_error): Update.
* c-valprint.c (print_function_pointer_address, c_val_print): Update.
* disasm.c (dis_asm_print_address): Update.
* exec.c (print_section_info): Update.
* f-valprint.c (f_val_print): Update.
* infcmd.c: Include "arch-utils.h".
(jump_command, program_info): Update.
* linux-fork.c: Include "arch-utils.h".
(info_forks_command): Update.
* m2-valprint.c (print_function_pointer_address,
print_unpacked_pointer, print_variable_at_address,
m2_val_print): Update.
* m32r-rom.c (m32r_load_section, m32r_load, m32r_upload_command):
Update.
* printcmd.c (print_address, print_address_demangle, address_info):
Update.
* p-valprint.c (pascal_val_print): Update.
* source.c: Include "arch-utils.h".
(line_info): Update.
* stack.c (frame_info, print_block_frame_labels): Update.
* symfile.c (add_symbol_file_command, list_overlays_command): Update.
* symmisc.c (dump_msymbols, dump_psymtab, dump_symtab_1,
print_symbol, print_partial_symbols, maintenance_info_psymtabs,
maintenance_check_symtabs): Update.
* symtab.c (find_pc_sect_symtab): Update.
* target.c (deprecated_debug_xfer_memory): Update.
* tracepoint.c (scope_info): Update.
* tui/tui-stack.c (tui_make_status_line): Update.
* valprint.c (val_print_string): Update.
Update callers of paddr_nz to use paddress instead (keeping
user-visible output identical):
* alpha-tdep.c (alpha_heuristic_proc_start): Update.
* amd64-tdep.c (fixup_riprel, amd64_displaced_step_copy_insn,
amd64_displaced_step_fixup): Update.
* arch-utils.c (simple_displaced_step_copy_insn): Update.
* auxv.c (fprint_target_auxv): Update.
* breakpoint.c (insert_single_step_breakpoint): Update.
* buildsym.c (finish_block): Update.
* cli/cli-dump.c (restore_section_callback): Update.
* fbsd-nat.c (fbsd_find_memory_regions): Update.
* frame.c (frame_unwind_register_value): Update.
* gcore.c (gcore_create_callback): Update.
* hppa-tdep.c (hppa_frame_cache, hppa_skip_trampoline_code): Update.
* i386-tdep.c (i386_displaced_step_fixup, i386_record_modrm,
i386_record_lea_modrm_addr, i386_record_lea_modrm,
i386_process_record): Update.
* ia64-tdep.c (ia64_frame_this_id, ia64_sigtramp_frame_this_id,
ia64_libunwind_frame_this_id, ia64_libunwind_sigtramp_frame_this_id,
ia64_dummy_id, ia64_access_reg, ia64_access_rse_reg): Update.
* infrun.c (displaced_step_prepare, displaced_step_fixup,
handle_inferior_event, insert_step_resume_breakpoint_at_sal,
insert_longjmp_resume_breakpoint): Update.
* linux-nat.c (linux_nat_find_memory_regions): Update.
* linux-record.c (record_linux_system_call): Update.
* mips-tdep.c (heuristic_proc_start, mips_eabi_push_dummy_call,
mips_n32n64_push_dummy_call, mips_o32_push_dummy_call,
mips_o64_push_dummy_call): Update.
* monitor.c (monitor_error, monitor_remove_breakpoint): Update.
* record.c (record_arch_list_add_mem, record_wait,
record_xfer_partial): Update.
* remote-mips.c (mips_fetch_word, mips_check_lsi_error,
mips_common_breakpoint): Update.
* remote-sim.c (gdbsim_xfer_inferior_memory): Update.
* rs6000-tdep.c (ppc_displaced_step_fixup): Update.
* solib-som.c (som_current_sos): Update.
* symfile.c (load_progress, generic_load): Update.
* symfile-mem.c (add_vsyscall_page): Update.
* valops.c (value_fetch_lazy): Update.
* windows-tdep.c (windows_xfer_shared_library): Update.
Update callers of paddr_nz to use paddress instead (changing
user-visible output to make it more correct):
* dwarf2loc.c (locexpr_describe_location): Update.
* ia64-tdep.c (ia64_memory_insert_breakpoint,
ia64_memory_remove_breakpoint): Update.
* jv-valprint.c (java_value_print): Update.
* m32c-tdep.c (m32c_m16c_address_to_pointer): Update.
* monitor.c (monitor_read_memory): Update.
Update callers of paddr to use paddress instead (changing
user-visible output to make it more correct):
* arm-tdep.c (arm_push_dummy_call): Update.
* breakpoint.c (insert_bp_location, create_thread_event_breakpoint,
create_breakpoint): Update.
* darwin-nat-info.c (darwin_debug_regions): Update.
* dcache.c (dcache_info): Update.
* dsrec.c (load_srec, make_srec): Update.
* dwarf2-frame.c (dwarf2_restore_rule, execute_cfa_program,
dwarf2_frame_cache): Update.
* gcore.c (gcore_copy_callback): Update.
* gnu-nat.c (gnu_xfer_memory): Update.
* mips-linux-nat.c (mips_show_dr): Update.
* monitor.c (monitor_write_memory, monitor_insert_breakpoint,
monitor_remove_breakpoint): Update.
* remote.c (compare_sections_command): Update.
* remote-m32r-sdi.c (m32r_xfer_memory, m32r_insert_breakpoint,
m32r_remove_breakpoint, m32r_insert_watchpoint,
m32r_remove_watchpoint): Update.
* sol-thread.c (info_cb): Update.
* symfile.c (load_progress): Update.
Update callers of paddress or paddr_nz to use hex_string instead
(changes output of internal/error/debug messages only):
* dwarf2read.c (dump_die_shallow): Update.
* frame.c (fprint_field, fprint_frame, frame_pc_unwind,
get_frame_func, create_new_frame): Update.
* hppa-tdep.c (find_unwind_entry, unwind_command): Update.
* ia64-tdep.c (get_kernel_table, ia64_find_proc_info_x,
ia64_get_dyn_info_list): Update.
* maint.c (maintenance_translate_address): Update.
* mi/mi-cmd-var.c (mi_cmd_var_create): Update.
* target.c (target_flash_erase): Update.
Update callers of paddr/paddr_nz to use phex/phex_nz instead,
using an appropriate address size. Remove use of strlen_paddr.
* exec.c (exec_files_info): Update.
* i386-nat.c (i386_show_dr): Update.
* remote.c (remote_flash_erase): Update.
* m32r-rom.c (m32r_load_section): Update.
* monitor.c (monitor_vsprintf, monitor_store_register): Update.
* remote.c (remote_check_symbols, remote_search_memory): Update.
* remote-mips.c (mips_request, mips_common_breakpoint): Update.
* scm-valprint.c (scm_ipruk, scm_scmval_print): Update.
* sh64-tdep.c (sh64_show_media_regs, sh64_show_compact_regs): Update.
* sh-tdep.c (sh_generic_show_regs, sh3_show_regs, sh2e_show_regs,
sh2a_show_regs, sh2a_nofpu_show_regs, sh3e_show_regs,
sh3_dsp_show_regs, sh4_show_regs, sh4_nofpu_show_regs,
sh_dsp_show_regs): Update.
* xcoffsolib.c (sharedlibrary_command): Update.
* maint.c (maint_print_section_info): Add ADDR_SIZE parameter.
Use hex_string_custom instead of paddr.
(print_bfd_section_info): Pass address size.
(print_objfile_section_info): Likewise.
* annotate.h (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* annotate.c (annotate_source): Add GDBARCH parameter.
(annotate_frame_begin): Likewise.
* source.c (identify_source_line): Update call to annotate_source.
* stack.c (print_frame_info, print_frame): Update call to
annotate_frame_begin.
* breakpoint.c (describe_other_breakpoints): Add GDBARCH parameter.
(create_breakpoint, create_ada_exception_breakpoint): Update call.
* stack.c (print_block_frame_labels): Add GDBARCH parameter.
(print_frame_label_vars): Update call.
* symmisc.c (print_partial_symbols): Add GDBARCH parameter.
(dump_psymtab): Update call to print_partial_symbols.
(struct print_symbol_args): Add GDBARCH member.
(dump_symtab_1): Set print_symbol_args architecture member.
(print_symbol): Use it.
* windows-tdep.h (windows_xfer_shared_library): Add GDBARCH
parameter.
* windows-tdep.c (windows_xfer_shared_library): Likewise.
* i386-cygwin-tdep.c (struct cpms_data): Add GDBARCH member.
(core_process_module_section): Pass architecture from cpms_data to
windows_xfer_shared_library.
(windows_core_xfer_shared_libraries): Initialize cmps_data
architecture member.
* windows-nat.c (windows_xfer_shared_libraries): Pass architecture
to windows_xfer_shared_library.
* defs.h (print_address): Add GDBARCH parameter.
* printcmd.c (print_address): Add GDBARCH parameter.
(print_scalar_formatted, do_examine): Update call.
* findcmd.c (find_command): Update call.
* tracepoint.c: Include "arch-utils.h".
(trace_find_line_command): Update call.
* tui/tui-disasm.c (tui_disassemble): Update call.
* value.h (print_address_demangle): Add GDBARCH parameter.
* printcmd.c (print_address_demangle): Add GDBARCH parameter.
* c-valprint.c (print_function_pointer_address, c_val_print):
Update call.
* f-valprint.c (f_val_print): Update call.
* gnu-v3-abi.c (gnuv3_print_method_ptr): Update call.
* jv-valprint.c (java_val_print): Update call.
* m2-valprint.c (print_function_pointer_address, m2_val_print):
Update call.
* p-valprint.c (pascal_val_print): Update call.
* disasm.c (gdb_disassemble_info): Install architecture into
di.application_data field.
testsuite/ChangeLog:
* gdb.threads/tls-shared.exp: Update to locexpr_describe_location
change to prefix TLS offset in hex with 0x.
doc/ChangeLog:
* gdbint.texinfo (Item Output Functions): Update signature
for ui_out_field_core_addr.
2009-07-03 01:21:10 +08:00
|
|
|
paddress (target_gdbarch, offset)))
|
2009-07-22 13:31:26 +08:00
|
|
|
error (_("Process record canceled the operation."));
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
/* Destroy the record from here forward. */
|
2009-10-16 01:15:56 +08:00
|
|
|
record_list_release_following (record_list);
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Check record_insn_num */
|
|
|
|
record_check_insn_num (0);
|
|
|
|
|
|
|
|
/* Record registers change to list as an instruction. */
|
|
|
|
record_arch_list_head = NULL;
|
|
|
|
record_arch_list_tail = NULL;
|
|
|
|
if (record_arch_list_add_mem (offset, len))
|
|
|
|
{
|
|
|
|
record_list_release (record_arch_list_tail);
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
2009-10-23 03:36:06 +08:00
|
|
|
"Process record: failed to record "
|
|
|
|
"execution log.");
|
2009-04-30 10:58:37 +08:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (record_arch_list_add_end ())
|
|
|
|
{
|
|
|
|
record_list_release (record_arch_list_tail);
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
2009-10-23 03:36:06 +08:00
|
|
|
"Process record: failed to record "
|
|
|
|
"execution log.");
|
2009-04-30 10:58:37 +08:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
record_list->next = record_arch_list_head;
|
|
|
|
record_arch_list_head->prev = record_list;
|
|
|
|
record_list = record_arch_list_tail;
|
|
|
|
|
|
|
|
if (record_insn_num == record_insn_max_num && record_insn_max_num)
|
|
|
|
record_list_release_first ();
|
|
|
|
else
|
|
|
|
record_insn_num++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return record_beneath_to_xfer_partial (record_beneath_to_xfer_partial_ops,
|
|
|
|
object, annex, readbuf, writebuf,
|
|
|
|
offset, len);
|
|
|
|
}
|
|
|
|
|
2012-01-18 19:51:55 +08:00
|
|
|
/* This structure represents a breakpoint inserted while the record
|
|
|
|
target is active. We use this to know when to install/remove
|
|
|
|
breakpoints in/from the target beneath. For example, a breakpoint
|
|
|
|
may be inserted while recording, but removed when not replaying nor
|
|
|
|
recording. In that case, the breakpoint had not been inserted on
|
|
|
|
the target beneath, so we should not try to remove it there. */
|
|
|
|
|
|
|
|
struct record_breakpoint
|
|
|
|
{
|
|
|
|
/* The address and address space the breakpoint was set at. */
|
|
|
|
struct address_space *address_space;
|
|
|
|
CORE_ADDR addr;
|
|
|
|
|
|
|
|
/* True when the breakpoint has been also installed in the target
|
|
|
|
beneath. This will be false for breakpoints set during replay or
|
|
|
|
when recording. */
|
|
|
|
int in_target_beneath;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct record_breakpoint *record_breakpoint_p;
|
|
|
|
DEF_VEC_P(record_breakpoint_p);
|
|
|
|
|
|
|
|
/* The list of breakpoints inserted while the record target is
|
|
|
|
active. */
|
|
|
|
VEC(record_breakpoint_p) *record_breakpoints = NULL;
|
|
|
|
|
2012-04-24 22:33:12 +08:00
|
|
|
static void
|
|
|
|
record_sync_record_breakpoints (struct bp_location *loc, void *data)
|
|
|
|
{
|
|
|
|
if (loc->loc_type != bp_loc_software_breakpoint)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (loc->inserted)
|
|
|
|
{
|
|
|
|
struct record_breakpoint *bp = XNEW (struct record_breakpoint);
|
|
|
|
|
|
|
|
bp->addr = loc->target_info.placed_address;
|
|
|
|
bp->address_space = loc->target_info.placed_address_space;
|
|
|
|
|
|
|
|
bp->in_target_beneath = 1;
|
|
|
|
|
|
|
|
VEC_safe_push (record_breakpoint_p, record_breakpoints, bp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Sync existing breakpoints to record_breakpoints. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_init_record_breakpoints (void)
|
|
|
|
{
|
|
|
|
VEC_free (record_breakpoint_p, record_breakpoints);
|
|
|
|
|
|
|
|
iterate_over_bp_locations (record_sync_record_breakpoints);
|
|
|
|
}
|
|
|
|
|
2012-01-18 19:51:55 +08:00
|
|
|
/* Behavior is conditional on RECORD_IS_REPLAY. We will not actually
|
|
|
|
insert or remove breakpoints in the real target when replaying, nor
|
|
|
|
when recording. */
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
static int
|
* breakpoint.h (struct breakpoint): New member GDBARCH.
* breakpoint.c: Include "arch-utils.h".
(set_raw_breakpoint_without_location): Add GDBARCH parameter.
Use it to set breakpoint architecture.
(set_raw_breakpoint): Add GDBARCH parameter.
(create_internal_breakpoint): Likewise.
(create_catchpoint): Likewise.
(create_fork_vfork_event_catchpoint): Likewise.
(create_breakpoint): Likewise.
(create_breakpoints): Likewise.
(break_command_really): Likewise.
(create_ada_exception_breakpoint): Likewise.
Update local callers to pass architecture:
(create_internal_breakpoint): Update.
(create_overlay_event_breakpoint): Update.
(create_longjmp_master_breakpoint): Update.
(create_thread_event_breakpoint): Update.
(create_solib_event_breakpoint): Update.
(create_catchpoint): Update.
(create_fork_vfork_event_catchpoint): Update.
(set_momentary_breakpoint): Update.
(clone_momentary_breakpoint): Update.
(create_breakpoint): Update.
(create_breakpoints): Update.
(break_command_really): Update.
(break_command_1): Update.
(set_breakpoint): Update.
(watch_command_1): Update.
(catch_fork_command_1): Update.
(catch_exec_commnd_1): Update.
(handle_gnu_v3_exceptions): Update.
(create_ada_exception_breakpoint): Update.
(catch_ada_exception_command): Update.
(catch_assert_command): Update.
(trace_command): Update.
* breakpoint.h (struct bp_location): New member GDBARCH.
* breakpoint.c (get_sal_arch): New function.
(set_raw_breakpoint): Set location architecture.
(add_location_to_breakpoint): Likewise.
(clone_momentary_breakpoint): Likewise.
(watch_command_1): Likewise.
(update_watchpoint): Likewise.
(bp_loc_is_permanent): Use location architecture instead of
current_gdbarch.
(adjust_breakpoint_address): Add GDBARCH parameter; use it
instead of current_gdbarch.
Update callers of adjust_breakpoint_address to pass
breakpoint location architecture:
(set_raw_breakpoint): Update.
(watch_command_1): Update.
* tracepoint.c: (collect_symbol): Add GDBARCH parameter, use instead
of current_gdbarch.
(add_local_symbols): Add GDBARCH parameter. Pass to collect_symbol.
(encode_actions): Pass tracepoint architecture to add_local_symbols
(encode_actions): Use tracepoint architecture instead of
current_gdbarch. Pass it to add_local_symbols and collect_symbol.
* breakpoint.h (struct breakpoint_ops): Replace last_addr parameter
of print_one callback with last_loc.
* breakpoint.c (print_one_breakpoint_location): Replace last_addr
parameter with last_loc.
(print_one_breakpoint): Likewise.
(do_captured_breakpoint_query): Update call.
(breakpoint_1): Pass last_loc instead of last_addr to
print_one_breakpoint. Pass last location architecture instead of
current_gdbarch to set_next_address.
Update all implementations of the print_one callback:
* breakpoint.c (print_one_catch_fork): Update.
(print_one_catch_vfork): Update.
(print_one_catch_exec): Update.
(print_one_exception_catchpoint): Update.
* ada-lang.c (print_one_exception): Update.
(print_one_catch_exception): Update.
(print_one_catch_exception_unhandled): Update.
(print_one_catch_assert): Update.
* breakpoint.c (print_one_breakpoint_location): Add PRINT_ADDRESS_BITS
parameter. Use it instead of gdbarch_addr_bit (current_gdbarch).
(print_one_breakpoint): Add PRINT_ADDRESS_BITS parameter and pass it
to print_one_breakpoint_location.
(breakpoint_address_bits): New function.
(do_captured_breakpoint_query): Compute number of address bits to print
and pass it to print_one_breakpoint.
(breakpoint_1): Likewise. Use it instead of current_gdbarch.
* breakpoint.h (create_thread_event_breakpoint): Add GDBARCH.
* breakpoint.c (create_thread_event_breakpoint): Likewise.
Update callers to create_thread_event_breakpoint:
* aix-thread.c (pd_enable): Update.
* linux-thread-db.c (enable_thread_event): Update.
* breakpoint.h (create_solib_event_breakpoint): Add GDBARCH.
* breakpoint.c (create_solib_event_breakpoint): Likewise.
Update callers to create_solib_event_breakpoint:
* solib-frv.c (enable_break, enable_break2): Update.
* solib-pa64.c (pa64_solib_create_inferior_hook): Update.
* solib-som.c (som_solib_create_inferior_hook): Update.
* solib-darwin.c (darwin_solib_create_inferior_hook): Update.
* solib-svr4.c (enable_break): Update.
* breakpoint.h (insert_single_step_breakpoint): Add GDBARCH.
* breakpoint.c (insert_single_step_breakpoint): Likewise.
Update callers to insert_single_step_breakpoint:
* alpha-tdep.c (alpha_software_single_step): Update.
* arm-linux-tdep.c (arm_linux_software_single_step): Update.
* arm-tdep.c (arm_software_single_step): Update.
* cris-tdep.c (cris_software_single_step): Update.
* rs6000-aix-tdep.c (rs6000_software_single_step): Update.
* rs6000-tdep.c (ppc_deal_with_atomic_sequence): Update.
* sparc-tdep.c (sparc_software_single_step): Update.
* spu-tdep.c (spu_software_single_step): Update.
* mips-tdep.c (deal_with_atomic_sequence): Add GDBARCH parameter.
Pass it to insert_single_step_breakpoint.
(mips_software_single_step): Pass architecture to
deal_with_atomic_sequence and insert_single_step_breakpoint.
* breakpoint.h (deprecated_insert_raw_breakpoint): Add GDBARCH.
(deprecated_remove_raw_breakpoint): Likewise.
* breakpoint.c (deprecated_insert_raw_breakpoint): Add GDBARCH.
(deprecated_remove_raw_breakpoint): Likewise.
Update callers to deprecated_insert_raw_breakpoint and
deprecated_remove_raw_breakpoint:
* breakpoint.c (single_step_gdbarch): New static variable.
(insert_single_step_breakpoint): Pass GDBARCH parameter to
deprecated_insert_raw_breakpoint. Store it in single_step_gdbarch.
(remove_single_step_breakpoints): Pass architecture stored in
single_step_gdbarch to deprecated_remove_raw_breakpoint.
* rs6000-nat.c (exec_one_dummy_insn): Update.
* solib-irix.c (enable_break, disable_break): Update.
* procfs.c (procfs_mourn_inferior): Update.
(remove_dbx_link_breakpoint): Update.
* breakpoint.h (set_breakpoint): Add GDBARCH parameter.
(set_momentary_breakpoint, set_momentary_breakpoint_at_pc): Likewise.
* breakpoint.c (set_breakpoint): Add GDBARCH parameter.
(set_momentary_breakpoint, set_momentary_breakpoint_at_pc): Likewise.
Update callers to set_breakpoint, set_momentary_breakpoint and
set_momentary_breakpoint_at_pc:
* breakpoint.c (set_momentary_breakpoint_at_pc): Update.
(until_break_command): Update.
* infcall.c (call_function_by_hand): Update.
* infcmd.c (finish_backward, finish_forward): Update.
* infrun.c (insert_step_resume_breakpoint_at_sal): Add GDBARCH
parameter. Pass it to set_momentary_breakpoint.
(insert_longjmp_resume_breakpoint): Add GDBARCH parameter.
Pass it to set_momentary_breakpoint_at_pc.
(handle_inferior_event): Update.
(insert_step_resume_breakpoint_at_frame): Update.
(insert_step_resume_breakpoint_at_caller): Update..
* mi/mi-cmd-break.c: Include "arch-utils.h".
(mi_cmd_break_insert): Update.
* target.h (struct target_ops): Add GDBARCH parameter to
to_insert_breakpoint, to_remove_breakpoint, to_insert_hw_breakpoint,
and to_remove_hw_breakpoint members.
(target_insert_breakpoint, target_remove_breakpoint,
target_insert_hw_breakpoint, target_remove_hw_breakpoint): Add GDBARCH
parameter, pass to target routine.
(memory_remove_breakpoint, memory_insert_breakpoint): Add GDBARCH
parameter.
* target.c (debug_to_insert_breakpoint, debug_to_remove_breakpoint,
debug_to_insert_hw_breakpoint, debug_to_remove_hw_breakpoint): Add
GDBARCH parameter, pass to target routine.
(update_current_target): Update function signature.
* breakpoint.c (insert_bp_location, remove_breakpoint,
deprecated_insert_raw_breakpoint, deprecated_remove_raw_breakpoint):
Pass architecture to target_ routines.
Update all implementations of the target breakpoint routines to take
GDBARCH parameter and use it instead of GDBARCH as appropriate:
* corelow.c (ignore): Update.
* exec.c (ignore): Update.
* mem-break.c (memory_insert_breakpoint): Update.
(memory_remove_breakpoint): Update.
* monitor.c (monitor_insert_breakpoint): Update.
(monitor_remove_breakpoint): Update.
* record.c (record_insert_breakpoint): Update.
(record_beneath_to_insert_breakpoint): Update.
(record_remove_breakpoint): Update.
(record_beneath_to_remove_breakpoint): Update.
* remote.c (remote_insert_breakpoint): Update.
(remote_remove_breakpoint): Update.
(remote_insert_hw_breakpoint): Update.
(remote_remove_hw_breakpoint): Update.
* remote-m32r-sdi.c (m32r_insert_breakpoint): Update.
(m32r_remove_breakpoint): Update.
* remote-mips.c (mips_insert_breakpoint): Update.
(mips_remove_breakpoint): Update.
* i386-nat.c (i386_insert_hw_breakpoint): Update.
(i386_remove_hw_breakpoint): Update.
* nto-procfs.c (procfs_insert_breakpoint): Update.
(procfs_remove_breakpoint): Update.
(procfs_insert_hw_breakpoint): Update.
(procfs_remove_hw_breakpoint): Update.
doc/ChangeLog:
* gdbint.texi (Examples of Use of @code{ui_out} functions):
Update example code extrated from breakpoint.c.
2009-07-03 01:12:28 +08:00
|
|
|
record_insert_breakpoint (struct gdbarch *gdbarch,
|
|
|
|
struct bp_target_info *bp_tgt)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
2012-01-18 19:51:55 +08:00
|
|
|
struct record_breakpoint *bp;
|
|
|
|
int in_target_beneath = 0;
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
if (!RECORD_IS_REPLAY)
|
|
|
|
{
|
2012-01-18 19:51:55 +08:00
|
|
|
/* When recording, we currently always single-step, so we don't
|
|
|
|
really need to install regular breakpoints in the inferior.
|
|
|
|
However, we do have to insert software single-step
|
|
|
|
breakpoints, in case the target can't hardware step. To keep
|
|
|
|
things single, we always insert. */
|
|
|
|
struct cleanup *old_cleanups;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
old_cleanups = record_gdb_operation_disable_set ();
|
|
|
|
ret = record_beneath_to_insert_breakpoint (gdbarch, bp_tgt);
|
2009-04-30 10:58:37 +08:00
|
|
|
do_cleanups (old_cleanups);
|
|
|
|
|
2012-01-18 19:51:55 +08:00
|
|
|
if (ret != 0)
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
in_target_beneath = 1;
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
|
2012-01-18 19:51:55 +08:00
|
|
|
bp = XNEW (struct record_breakpoint);
|
|
|
|
bp->addr = bp_tgt->placed_address;
|
|
|
|
bp->address_space = bp_tgt->placed_address_space;
|
|
|
|
bp->in_target_beneath = in_target_beneath;
|
|
|
|
VEC_safe_push (record_breakpoint_p, record_breakpoints, bp);
|
2009-04-30 10:58:37 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* "to_remove_breakpoint" method for process record target. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static int
|
* breakpoint.h (struct breakpoint): New member GDBARCH.
* breakpoint.c: Include "arch-utils.h".
(set_raw_breakpoint_without_location): Add GDBARCH parameter.
Use it to set breakpoint architecture.
(set_raw_breakpoint): Add GDBARCH parameter.
(create_internal_breakpoint): Likewise.
(create_catchpoint): Likewise.
(create_fork_vfork_event_catchpoint): Likewise.
(create_breakpoint): Likewise.
(create_breakpoints): Likewise.
(break_command_really): Likewise.
(create_ada_exception_breakpoint): Likewise.
Update local callers to pass architecture:
(create_internal_breakpoint): Update.
(create_overlay_event_breakpoint): Update.
(create_longjmp_master_breakpoint): Update.
(create_thread_event_breakpoint): Update.
(create_solib_event_breakpoint): Update.
(create_catchpoint): Update.
(create_fork_vfork_event_catchpoint): Update.
(set_momentary_breakpoint): Update.
(clone_momentary_breakpoint): Update.
(create_breakpoint): Update.
(create_breakpoints): Update.
(break_command_really): Update.
(break_command_1): Update.
(set_breakpoint): Update.
(watch_command_1): Update.
(catch_fork_command_1): Update.
(catch_exec_commnd_1): Update.
(handle_gnu_v3_exceptions): Update.
(create_ada_exception_breakpoint): Update.
(catch_ada_exception_command): Update.
(catch_assert_command): Update.
(trace_command): Update.
* breakpoint.h (struct bp_location): New member GDBARCH.
* breakpoint.c (get_sal_arch): New function.
(set_raw_breakpoint): Set location architecture.
(add_location_to_breakpoint): Likewise.
(clone_momentary_breakpoint): Likewise.
(watch_command_1): Likewise.
(update_watchpoint): Likewise.
(bp_loc_is_permanent): Use location architecture instead of
current_gdbarch.
(adjust_breakpoint_address): Add GDBARCH parameter; use it
instead of current_gdbarch.
Update callers of adjust_breakpoint_address to pass
breakpoint location architecture:
(set_raw_breakpoint): Update.
(watch_command_1): Update.
* tracepoint.c: (collect_symbol): Add GDBARCH parameter, use instead
of current_gdbarch.
(add_local_symbols): Add GDBARCH parameter. Pass to collect_symbol.
(encode_actions): Pass tracepoint architecture to add_local_symbols
(encode_actions): Use tracepoint architecture instead of
current_gdbarch. Pass it to add_local_symbols and collect_symbol.
* breakpoint.h (struct breakpoint_ops): Replace last_addr parameter
of print_one callback with last_loc.
* breakpoint.c (print_one_breakpoint_location): Replace last_addr
parameter with last_loc.
(print_one_breakpoint): Likewise.
(do_captured_breakpoint_query): Update call.
(breakpoint_1): Pass last_loc instead of last_addr to
print_one_breakpoint. Pass last location architecture instead of
current_gdbarch to set_next_address.
Update all implementations of the print_one callback:
* breakpoint.c (print_one_catch_fork): Update.
(print_one_catch_vfork): Update.
(print_one_catch_exec): Update.
(print_one_exception_catchpoint): Update.
* ada-lang.c (print_one_exception): Update.
(print_one_catch_exception): Update.
(print_one_catch_exception_unhandled): Update.
(print_one_catch_assert): Update.
* breakpoint.c (print_one_breakpoint_location): Add PRINT_ADDRESS_BITS
parameter. Use it instead of gdbarch_addr_bit (current_gdbarch).
(print_one_breakpoint): Add PRINT_ADDRESS_BITS parameter and pass it
to print_one_breakpoint_location.
(breakpoint_address_bits): New function.
(do_captured_breakpoint_query): Compute number of address bits to print
and pass it to print_one_breakpoint.
(breakpoint_1): Likewise. Use it instead of current_gdbarch.
* breakpoint.h (create_thread_event_breakpoint): Add GDBARCH.
* breakpoint.c (create_thread_event_breakpoint): Likewise.
Update callers to create_thread_event_breakpoint:
* aix-thread.c (pd_enable): Update.
* linux-thread-db.c (enable_thread_event): Update.
* breakpoint.h (create_solib_event_breakpoint): Add GDBARCH.
* breakpoint.c (create_solib_event_breakpoint): Likewise.
Update callers to create_solib_event_breakpoint:
* solib-frv.c (enable_break, enable_break2): Update.
* solib-pa64.c (pa64_solib_create_inferior_hook): Update.
* solib-som.c (som_solib_create_inferior_hook): Update.
* solib-darwin.c (darwin_solib_create_inferior_hook): Update.
* solib-svr4.c (enable_break): Update.
* breakpoint.h (insert_single_step_breakpoint): Add GDBARCH.
* breakpoint.c (insert_single_step_breakpoint): Likewise.
Update callers to insert_single_step_breakpoint:
* alpha-tdep.c (alpha_software_single_step): Update.
* arm-linux-tdep.c (arm_linux_software_single_step): Update.
* arm-tdep.c (arm_software_single_step): Update.
* cris-tdep.c (cris_software_single_step): Update.
* rs6000-aix-tdep.c (rs6000_software_single_step): Update.
* rs6000-tdep.c (ppc_deal_with_atomic_sequence): Update.
* sparc-tdep.c (sparc_software_single_step): Update.
* spu-tdep.c (spu_software_single_step): Update.
* mips-tdep.c (deal_with_atomic_sequence): Add GDBARCH parameter.
Pass it to insert_single_step_breakpoint.
(mips_software_single_step): Pass architecture to
deal_with_atomic_sequence and insert_single_step_breakpoint.
* breakpoint.h (deprecated_insert_raw_breakpoint): Add GDBARCH.
(deprecated_remove_raw_breakpoint): Likewise.
* breakpoint.c (deprecated_insert_raw_breakpoint): Add GDBARCH.
(deprecated_remove_raw_breakpoint): Likewise.
Update callers to deprecated_insert_raw_breakpoint and
deprecated_remove_raw_breakpoint:
* breakpoint.c (single_step_gdbarch): New static variable.
(insert_single_step_breakpoint): Pass GDBARCH parameter to
deprecated_insert_raw_breakpoint. Store it in single_step_gdbarch.
(remove_single_step_breakpoints): Pass architecture stored in
single_step_gdbarch to deprecated_remove_raw_breakpoint.
* rs6000-nat.c (exec_one_dummy_insn): Update.
* solib-irix.c (enable_break, disable_break): Update.
* procfs.c (procfs_mourn_inferior): Update.
(remove_dbx_link_breakpoint): Update.
* breakpoint.h (set_breakpoint): Add GDBARCH parameter.
(set_momentary_breakpoint, set_momentary_breakpoint_at_pc): Likewise.
* breakpoint.c (set_breakpoint): Add GDBARCH parameter.
(set_momentary_breakpoint, set_momentary_breakpoint_at_pc): Likewise.
Update callers to set_breakpoint, set_momentary_breakpoint and
set_momentary_breakpoint_at_pc:
* breakpoint.c (set_momentary_breakpoint_at_pc): Update.
(until_break_command): Update.
* infcall.c (call_function_by_hand): Update.
* infcmd.c (finish_backward, finish_forward): Update.
* infrun.c (insert_step_resume_breakpoint_at_sal): Add GDBARCH
parameter. Pass it to set_momentary_breakpoint.
(insert_longjmp_resume_breakpoint): Add GDBARCH parameter.
Pass it to set_momentary_breakpoint_at_pc.
(handle_inferior_event): Update.
(insert_step_resume_breakpoint_at_frame): Update.
(insert_step_resume_breakpoint_at_caller): Update..
* mi/mi-cmd-break.c: Include "arch-utils.h".
(mi_cmd_break_insert): Update.
* target.h (struct target_ops): Add GDBARCH parameter to
to_insert_breakpoint, to_remove_breakpoint, to_insert_hw_breakpoint,
and to_remove_hw_breakpoint members.
(target_insert_breakpoint, target_remove_breakpoint,
target_insert_hw_breakpoint, target_remove_hw_breakpoint): Add GDBARCH
parameter, pass to target routine.
(memory_remove_breakpoint, memory_insert_breakpoint): Add GDBARCH
parameter.
* target.c (debug_to_insert_breakpoint, debug_to_remove_breakpoint,
debug_to_insert_hw_breakpoint, debug_to_remove_hw_breakpoint): Add
GDBARCH parameter, pass to target routine.
(update_current_target): Update function signature.
* breakpoint.c (insert_bp_location, remove_breakpoint,
deprecated_insert_raw_breakpoint, deprecated_remove_raw_breakpoint):
Pass architecture to target_ routines.
Update all implementations of the target breakpoint routines to take
GDBARCH parameter and use it instead of GDBARCH as appropriate:
* corelow.c (ignore): Update.
* exec.c (ignore): Update.
* mem-break.c (memory_insert_breakpoint): Update.
(memory_remove_breakpoint): Update.
* monitor.c (monitor_insert_breakpoint): Update.
(monitor_remove_breakpoint): Update.
* record.c (record_insert_breakpoint): Update.
(record_beneath_to_insert_breakpoint): Update.
(record_remove_breakpoint): Update.
(record_beneath_to_remove_breakpoint): Update.
* remote.c (remote_insert_breakpoint): Update.
(remote_remove_breakpoint): Update.
(remote_insert_hw_breakpoint): Update.
(remote_remove_hw_breakpoint): Update.
* remote-m32r-sdi.c (m32r_insert_breakpoint): Update.
(m32r_remove_breakpoint): Update.
* remote-mips.c (mips_insert_breakpoint): Update.
(mips_remove_breakpoint): Update.
* i386-nat.c (i386_insert_hw_breakpoint): Update.
(i386_remove_hw_breakpoint): Update.
* nto-procfs.c (procfs_insert_breakpoint): Update.
(procfs_remove_breakpoint): Update.
(procfs_insert_hw_breakpoint): Update.
(procfs_remove_hw_breakpoint): Update.
doc/ChangeLog:
* gdbint.texi (Examples of Use of @code{ui_out} functions):
Update example code extrated from breakpoint.c.
2009-07-03 01:12:28 +08:00
|
|
|
record_remove_breakpoint (struct gdbarch *gdbarch,
|
|
|
|
struct bp_target_info *bp_tgt)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
2012-01-18 19:51:55 +08:00
|
|
|
struct record_breakpoint *bp;
|
|
|
|
int ix;
|
|
|
|
|
|
|
|
for (ix = 0;
|
|
|
|
VEC_iterate (record_breakpoint_p, record_breakpoints, ix, bp);
|
|
|
|
++ix)
|
2009-04-30 10:58:37 +08:00
|
|
|
{
|
2012-01-18 19:51:55 +08:00
|
|
|
if (bp->addr == bp_tgt->placed_address
|
|
|
|
&& bp->address_space == bp_tgt->placed_address_space)
|
|
|
|
{
|
|
|
|
if (bp->in_target_beneath)
|
|
|
|
{
|
|
|
|
struct cleanup *old_cleanups;
|
|
|
|
int ret;
|
2009-04-30 10:58:37 +08:00
|
|
|
|
2012-01-18 19:51:55 +08:00
|
|
|
old_cleanups = record_gdb_operation_disable_set ();
|
|
|
|
ret = record_beneath_to_remove_breakpoint (gdbarch, bp_tgt);
|
|
|
|
do_cleanups (old_cleanups);
|
2009-04-30 10:58:37 +08:00
|
|
|
|
2012-01-18 19:51:55 +08:00
|
|
|
if (ret != 0)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
VEC_unordered_remove (record_breakpoint_p, record_breakpoints, ix);
|
|
|
|
return 0;
|
|
|
|
}
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
|
2012-01-18 19:51:55 +08:00
|
|
|
gdb_assert_not_reached ("removing unknown breakpoint");
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* "to_can_execute_reverse" method for process record target. */
|
2009-10-23 03:32:11 +08:00
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static int
|
|
|
|
record_can_execute_reverse (void)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2009-11-21 01:23:38 +08:00
|
|
|
/* "to_get_bookmark" method for process record and prec over core. */
|
|
|
|
|
|
|
|
static gdb_byte *
|
|
|
|
record_get_bookmark (char *args, int from_tty)
|
|
|
|
{
|
|
|
|
gdb_byte *ret = NULL;
|
|
|
|
|
|
|
|
/* Return stringified form of instruction count. */
|
|
|
|
if (record_list && record_list->type == record_end)
|
|
|
|
ret = xstrdup (pulongest (record_list->u.end.insn_num));
|
|
|
|
|
|
|
|
if (record_debug)
|
|
|
|
{
|
|
|
|
if (ret)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"record_get_bookmark returns %s\n", ret);
|
|
|
|
else
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"record_get_bookmark returns NULL\n");
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The implementation of the command "record goto". */
|
|
|
|
static void cmd_record_goto (char *, int);
|
|
|
|
|
|
|
|
/* "to_goto_bookmark" method for process record and prec over core. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_goto_bookmark (gdb_byte *bookmark, int from_tty)
|
|
|
|
{
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
"record_goto_bookmark receives %s\n", bookmark);
|
|
|
|
|
|
|
|
if (bookmark[0] == '\'' || bookmark[0] == '\"')
|
|
|
|
{
|
|
|
|
if (bookmark[strlen (bookmark) - 1] != bookmark[0])
|
|
|
|
error (_("Unbalanced quotes: %s"), bookmark);
|
|
|
|
|
|
|
|
/* Strip trailing quote. */
|
|
|
|
bookmark[strlen (bookmark) - 1] = '\0';
|
|
|
|
/* Strip leading quote. */
|
|
|
|
bookmark++;
|
|
|
|
/* Pass along to cmd_record_goto. */
|
|
|
|
}
|
|
|
|
|
|
|
|
cmd_record_goto ((char *) bookmark, from_tty);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2011-05-27 02:11:33 +08:00
|
|
|
static void
|
|
|
|
record_async (void (*callback) (enum inferior_event_type event_type,
|
|
|
|
void *context), void *context)
|
|
|
|
{
|
|
|
|
/* If we're on top of a line target (e.g., linux-nat, remote), then
|
|
|
|
set it to async mode as well. Will be NULL if we're sitting on
|
|
|
|
top of the core target, for "record restore". */
|
|
|
|
if (record_beneath_to_async != NULL)
|
|
|
|
record_beneath_to_async (callback, context);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
record_can_async_p (void)
|
|
|
|
{
|
|
|
|
/* We only enable async when the user specifically asks for it. */
|
2011-06-06 20:47:07 +08:00
|
|
|
return target_async_permitted;
|
2011-05-27 02:11:33 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
record_is_async_p (void)
|
|
|
|
{
|
|
|
|
/* We only enable async when the user specifically asks for it. */
|
2011-06-06 20:47:07 +08:00
|
|
|
return target_async_permitted;
|
2011-05-27 02:11:33 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static enum exec_direction_kind
|
|
|
|
record_execution_direction (void)
|
|
|
|
{
|
|
|
|
return record_execution_dir;
|
|
|
|
}
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
|
|
|
init_record_ops (void)
|
|
|
|
{
|
|
|
|
record_ops.to_shortname = "record";
|
|
|
|
record_ops.to_longname = "Process record and replay target";
|
|
|
|
record_ops.to_doc =
|
|
|
|
"Log program while executing and replay execution from log.";
|
|
|
|
record_ops.to_open = record_open;
|
|
|
|
record_ops.to_close = record_close;
|
|
|
|
record_ops.to_resume = record_resume;
|
|
|
|
record_ops.to_wait = record_wait;
|
|
|
|
record_ops.to_disconnect = record_disconnect;
|
|
|
|
record_ops.to_detach = record_detach;
|
|
|
|
record_ops.to_mourn_inferior = record_mourn_inferior;
|
|
|
|
record_ops.to_kill = record_kill;
|
|
|
|
record_ops.to_create_inferior = find_default_create_inferior;
|
|
|
|
record_ops.to_store_registers = record_store_registers;
|
|
|
|
record_ops.to_xfer_partial = record_xfer_partial;
|
|
|
|
record_ops.to_insert_breakpoint = record_insert_breakpoint;
|
|
|
|
record_ops.to_remove_breakpoint = record_remove_breakpoint;
|
2009-11-22 23:38:59 +08:00
|
|
|
record_ops.to_stopped_by_watchpoint = record_stopped_by_watchpoint;
|
2009-11-24 09:47:51 +08:00
|
|
|
record_ops.to_stopped_data_address = record_stopped_data_address;
|
2009-04-30 10:58:37 +08:00
|
|
|
record_ops.to_can_execute_reverse = record_can_execute_reverse;
|
|
|
|
record_ops.to_stratum = record_stratum;
|
2009-11-21 01:23:38 +08:00
|
|
|
/* Add bookmark target methods. */
|
|
|
|
record_ops.to_get_bookmark = record_get_bookmark;
|
|
|
|
record_ops.to_goto_bookmark = record_goto_bookmark;
|
2011-05-27 02:11:33 +08:00
|
|
|
record_ops.to_async = record_async;
|
|
|
|
record_ops.to_can_async_p = record_can_async_p;
|
|
|
|
record_ops.to_is_async_p = record_is_async_p;
|
|
|
|
record_ops.to_execution_direction = record_execution_direction;
|
2009-04-30 10:58:37 +08:00
|
|
|
record_ops.to_magic = OPS_MAGIC;
|
|
|
|
}
|
|
|
|
|
2009-10-23 03:32:11 +08:00
|
|
|
/* "to_resume" method for prec over corefile. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_core_resume (struct target_ops *ops, ptid_t ptid, int step,
|
2012-05-25 00:39:15 +08:00
|
|
|
enum gdb_signal signal)
|
2009-10-23 03:32:11 +08:00
|
|
|
{
|
|
|
|
record_resume_step = step;
|
2011-05-27 02:11:33 +08:00
|
|
|
record_resumed = 1;
|
|
|
|
record_execution_dir = execution_direction;
|
|
|
|
|
|
|
|
/* We are about to start executing the inferior (or simulate it),
|
|
|
|
let's register it with the event loop. */
|
|
|
|
if (target_can_async_p ())
|
|
|
|
{
|
|
|
|
target_async (inferior_event_handler, 0);
|
|
|
|
|
|
|
|
/* Notify the event loop there's an event to wait for. */
|
|
|
|
mark_async_event_handler (record_async_inferior_event_token);
|
|
|
|
}
|
2009-10-23 03:32:11 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* "to_kill" method for prec over corefile. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_core_kill (struct target_ops *ops)
|
|
|
|
{
|
|
|
|
if (record_debug)
|
|
|
|
fprintf_unfiltered (gdb_stdlog, "Process record: record_core_kill\n");
|
|
|
|
|
|
|
|
unpush_target (&record_core_ops);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* "to_fetch_registers" method for prec over corefile. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_core_fetch_registers (struct target_ops *ops,
|
|
|
|
struct regcache *regcache,
|
|
|
|
int regno)
|
|
|
|
{
|
|
|
|
if (regno < 0)
|
|
|
|
{
|
|
|
|
int num = gdbarch_num_regs (get_regcache_arch (regcache));
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < num; i ++)
|
|
|
|
regcache_raw_supply (regcache, i,
|
|
|
|
record_core_regbuf + MAX_REGISTER_SIZE * i);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
regcache_raw_supply (regcache, regno,
|
|
|
|
record_core_regbuf + MAX_REGISTER_SIZE * regno);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* "to_prepare_to_store" method for prec over corefile. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_core_prepare_to_store (struct regcache *regcache)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
/* "to_store_registers" method for prec over corefile. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_core_store_registers (struct target_ops *ops,
|
|
|
|
struct regcache *regcache,
|
|
|
|
int regno)
|
|
|
|
{
|
|
|
|
if (record_gdb_operation_disable)
|
|
|
|
regcache_raw_collect (regcache, regno,
|
|
|
|
record_core_regbuf + MAX_REGISTER_SIZE * regno);
|
|
|
|
else
|
|
|
|
error (_("You can't do that without a process to debug."));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* "to_xfer_partial" method for prec over corefile. */
|
|
|
|
|
|
|
|
static LONGEST
|
|
|
|
record_core_xfer_partial (struct target_ops *ops, enum target_object object,
|
|
|
|
const char *annex, gdb_byte *readbuf,
|
|
|
|
const gdb_byte *writebuf, ULONGEST offset,
|
|
|
|
LONGEST len)
|
|
|
|
{
|
2010-05-17 05:11:14 +08:00
|
|
|
if (object == TARGET_OBJECT_MEMORY)
|
|
|
|
{
|
|
|
|
if (record_gdb_operation_disable || !writebuf)
|
|
|
|
{
|
|
|
|
struct target_section *p;
|
|
|
|
|
|
|
|
for (p = record_core_start; p < record_core_end; p++)
|
|
|
|
{
|
|
|
|
if (offset >= p->addr)
|
|
|
|
{
|
|
|
|
struct record_core_buf_entry *entry;
|
|
|
|
ULONGEST sec_offset;
|
|
|
|
|
|
|
|
if (offset >= p->endaddr)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (offset + len > p->endaddr)
|
|
|
|
len = p->endaddr - offset;
|
|
|
|
|
|
|
|
sec_offset = offset - p->addr;
|
|
|
|
|
|
|
|
/* Read readbuf or write writebuf p, offset, len. */
|
|
|
|
/* Check flags. */
|
|
|
|
if (p->the_bfd_section->flags & SEC_CONSTRUCTOR
|
|
|
|
|| (p->the_bfd_section->flags & SEC_HAS_CONTENTS) == 0)
|
|
|
|
{
|
|
|
|
if (readbuf)
|
|
|
|
memset (readbuf, 0, len);
|
|
|
|
return len;
|
|
|
|
}
|
|
|
|
/* Get record_core_buf_entry. */
|
|
|
|
for (entry = record_core_buf_list; entry;
|
|
|
|
entry = entry->prev)
|
|
|
|
if (entry->p == p)
|
|
|
|
break;
|
|
|
|
if (writebuf)
|
|
|
|
{
|
|
|
|
if (!entry)
|
|
|
|
{
|
|
|
|
/* Add a new entry. */
|
|
|
|
entry = (struct record_core_buf_entry *)
|
|
|
|
xmalloc (sizeof (struct record_core_buf_entry));
|
|
|
|
entry->p = p;
|
|
|
|
if (!bfd_malloc_and_get_section (p->bfd,
|
|
|
|
p->the_bfd_section,
|
|
|
|
&entry->buf))
|
|
|
|
{
|
|
|
|
xfree (entry);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
entry->prev = record_core_buf_list;
|
|
|
|
record_core_buf_list = entry;
|
|
|
|
}
|
|
|
|
|
|
|
|
memcpy (entry->buf + sec_offset, writebuf,
|
|
|
|
(size_t) len);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!entry)
|
|
|
|
return record_beneath_to_xfer_partial
|
|
|
|
(record_beneath_to_xfer_partial_ops,
|
|
|
|
object, annex, readbuf, writebuf,
|
|
|
|
offset, len);
|
|
|
|
|
|
|
|
memcpy (readbuf, entry->buf + sec_offset,
|
|
|
|
(size_t) len);
|
|
|
|
}
|
|
|
|
|
|
|
|
return len;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
error (_("You can't do that without a process to debug."));
|
|
|
|
}
|
2009-10-23 03:32:11 +08:00
|
|
|
|
|
|
|
return record_beneath_to_xfer_partial (record_beneath_to_xfer_partial_ops,
|
|
|
|
object, annex, readbuf, writebuf,
|
|
|
|
offset, len);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* "to_insert_breakpoint" method for prec over corefile. */
|
|
|
|
|
|
|
|
static int
|
|
|
|
record_core_insert_breakpoint (struct gdbarch *gdbarch,
|
|
|
|
struct bp_target_info *bp_tgt)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* "to_remove_breakpoint" method for prec over corefile. */
|
|
|
|
|
|
|
|
static int
|
|
|
|
record_core_remove_breakpoint (struct gdbarch *gdbarch,
|
|
|
|
struct bp_target_info *bp_tgt)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* "to_has_execution" method for prec over corefile. */
|
|
|
|
|
2011-03-07 23:58:13 +08:00
|
|
|
static int
|
|
|
|
record_core_has_execution (struct target_ops *ops, ptid_t the_ptid)
|
2009-10-23 03:32:11 +08:00
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
init_record_core_ops (void)
|
|
|
|
{
|
2010-05-10 04:04:52 +08:00
|
|
|
record_core_ops.to_shortname = "record-core";
|
2009-10-23 03:32:11 +08:00
|
|
|
record_core_ops.to_longname = "Process record and replay target";
|
|
|
|
record_core_ops.to_doc =
|
|
|
|
"Log program while executing and replay execution from log.";
|
|
|
|
record_core_ops.to_open = record_open;
|
|
|
|
record_core_ops.to_close = record_close;
|
|
|
|
record_core_ops.to_resume = record_core_resume;
|
|
|
|
record_core_ops.to_wait = record_wait;
|
|
|
|
record_core_ops.to_kill = record_core_kill;
|
|
|
|
record_core_ops.to_fetch_registers = record_core_fetch_registers;
|
|
|
|
record_core_ops.to_prepare_to_store = record_core_prepare_to_store;
|
|
|
|
record_core_ops.to_store_registers = record_core_store_registers;
|
|
|
|
record_core_ops.to_xfer_partial = record_core_xfer_partial;
|
|
|
|
record_core_ops.to_insert_breakpoint = record_core_insert_breakpoint;
|
|
|
|
record_core_ops.to_remove_breakpoint = record_core_remove_breakpoint;
|
2009-11-22 23:38:59 +08:00
|
|
|
record_core_ops.to_stopped_by_watchpoint = record_stopped_by_watchpoint;
|
2009-11-24 09:47:51 +08:00
|
|
|
record_core_ops.to_stopped_data_address = record_stopped_data_address;
|
2009-10-23 03:32:11 +08:00
|
|
|
record_core_ops.to_can_execute_reverse = record_can_execute_reverse;
|
|
|
|
record_core_ops.to_has_execution = record_core_has_execution;
|
|
|
|
record_core_ops.to_stratum = record_stratum;
|
2009-11-21 01:23:38 +08:00
|
|
|
/* Add bookmark target methods. */
|
|
|
|
record_core_ops.to_get_bookmark = record_get_bookmark;
|
|
|
|
record_core_ops.to_goto_bookmark = record_goto_bookmark;
|
2011-05-27 02:11:33 +08:00
|
|
|
record_core_ops.to_async = record_async;
|
|
|
|
record_core_ops.to_can_async_p = record_can_async_p;
|
|
|
|
record_core_ops.to_is_async_p = record_is_async_p;
|
|
|
|
record_core_ops.to_execution_direction = record_execution_direction;
|
2009-10-23 03:32:11 +08:00
|
|
|
record_core_ops.to_magic = OPS_MAGIC;
|
|
|
|
}
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* Implement "show record debug" command. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
|
|
|
show_record_debug (struct ui_file *file, int from_tty,
|
|
|
|
struct cmd_list_element *c, const char *value)
|
|
|
|
{
|
|
|
|
fprintf_filtered (file, _("Debugging of process record target is %s.\n"),
|
|
|
|
value);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Alias for "target record". */
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_record_start (char *args, int from_tty)
|
|
|
|
{
|
|
|
|
execute_command ("target record", from_tty);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Truncate the record log from the present point
|
|
|
|
of replay until the end. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_record_delete (char *args, int from_tty)
|
|
|
|
{
|
|
|
|
if (current_target.to_stratum == record_stratum)
|
|
|
|
{
|
|
|
|
if (RECORD_IS_REPLAY)
|
|
|
|
{
|
|
|
|
if (!from_tty || query (_("Delete the log from this point forward "
|
|
|
|
"and begin to record the running message "
|
|
|
|
"at current PC?")))
|
2009-10-16 01:15:56 +08:00
|
|
|
record_list_release_following (record_list);
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
printf_unfiltered (_("Already at end of record list.\n"));
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
printf_unfiltered (_("Process record is not started.\n"));
|
|
|
|
}
|
|
|
|
|
2009-10-21 07:06:13 +08:00
|
|
|
/* Implement the "stoprecord" or "record stop" command. */
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_record_stop (char *args, int from_tty)
|
|
|
|
{
|
|
|
|
if (current_target.to_stratum == record_stratum)
|
|
|
|
{
|
2009-09-27 10:49:34 +08:00
|
|
|
unpush_target (&record_ops);
|
2009-10-21 23:21:16 +08:00
|
|
|
printf_unfiltered (_("Process record is stopped and all execution "
|
|
|
|
"logs are deleted.\n"));
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
printf_unfiltered (_("Process record is not started.\n"));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Set upper limit of record log size. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
set_record_insn_max_num (char *args, int from_tty, struct cmd_list_element *c)
|
|
|
|
{
|
|
|
|
if (record_insn_num > record_insn_max_num && record_insn_max_num)
|
|
|
|
{
|
2009-10-16 00:57:36 +08:00
|
|
|
/* Count down record_insn_num while releasing records from list. */
|
2009-04-30 10:58:37 +08:00
|
|
|
while (record_insn_num > record_insn_max_num)
|
2009-10-16 00:57:36 +08:00
|
|
|
{
|
|
|
|
record_list_release_first ();
|
|
|
|
record_insn_num--;
|
|
|
|
}
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct cmd_list_element *record_cmdlist, *set_record_cmdlist,
|
|
|
|
*show_record_cmdlist, *info_record_cmdlist;
|
|
|
|
|
|
|
|
static void
|
|
|
|
set_record_command (char *args, int from_tty)
|
|
|
|
{
|
2011-01-06 06:22:53 +08:00
|
|
|
printf_unfiltered (_("\"set record\" must be followed "
|
|
|
|
"by an apporpriate subcommand.\n"));
|
2009-04-30 10:58:37 +08:00
|
|
|
help_list (set_record_cmdlist, "set record ", all_commands, gdb_stdout);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
show_record_command (char *args, int from_tty)
|
|
|
|
{
|
|
|
|
cmd_show_list (show_record_cmdlist, from_tty, "");
|
|
|
|
}
|
|
|
|
|
2009-10-21 23:21:16 +08:00
|
|
|
/* Display some statistics about the execution log. */
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
static void
|
|
|
|
info_record_command (char *args, int from_tty)
|
|
|
|
{
|
2009-10-21 23:21:16 +08:00
|
|
|
struct record_entry *p;
|
|
|
|
|
|
|
|
if (current_target.to_stratum == record_stratum)
|
|
|
|
{
|
|
|
|
if (RECORD_IS_REPLAY)
|
|
|
|
printf_filtered (_("Replay mode:\n"));
|
|
|
|
else
|
|
|
|
printf_filtered (_("Record mode:\n"));
|
|
|
|
|
|
|
|
/* Find entry for first actual instruction in the log. */
|
|
|
|
for (p = record_first.next;
|
|
|
|
p != NULL && p->type != record_end;
|
|
|
|
p = p->next)
|
|
|
|
;
|
|
|
|
|
|
|
|
/* Do we have a log at all? */
|
|
|
|
if (p != NULL && p->type == record_end)
|
|
|
|
{
|
|
|
|
/* Display instruction number for first instruction in the log. */
|
|
|
|
printf_filtered (_("Lowest recorded instruction number is %s.\n"),
|
|
|
|
pulongest (p->u.end.insn_num));
|
|
|
|
|
|
|
|
/* If in replay mode, display where we are in the log. */
|
|
|
|
if (RECORD_IS_REPLAY)
|
|
|
|
printf_filtered (_("Current instruction number is %s.\n"),
|
|
|
|
pulongest (record_list->u.end.insn_num));
|
|
|
|
|
|
|
|
/* Display instruction number for last instruction in the log. */
|
|
|
|
printf_filtered (_("Highest recorded instruction number is %s.\n"),
|
|
|
|
pulongest (record_insn_count));
|
|
|
|
|
|
|
|
/* Display log count. */
|
|
|
|
printf_filtered (_("Log contains %d instructions.\n"),
|
|
|
|
record_insn_num);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printf_filtered (_("No instructions have been logged.\n"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printf_filtered (_("target record is not active.\n"));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Display max log size. */
|
|
|
|
printf_filtered (_("Max logged instructions is %d.\n"),
|
|
|
|
record_insn_max_num);
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|
|
|
|
|
2009-10-23 03:36:06 +08:00
|
|
|
/* Record log save-file format
|
|
|
|
Version 1 (never released)
|
|
|
|
|
|
|
|
Header:
|
|
|
|
4 bytes: magic number htonl(0x20090829).
|
|
|
|
NOTE: be sure to change whenever this file format changes!
|
|
|
|
|
|
|
|
Records:
|
|
|
|
record_end:
|
|
|
|
1 byte: record type (record_end, see enum record_type).
|
|
|
|
record_reg:
|
|
|
|
1 byte: record type (record_reg, see enum record_type).
|
|
|
|
8 bytes: register id (network byte order).
|
|
|
|
MAX_REGISTER_SIZE bytes: register value.
|
|
|
|
record_mem:
|
|
|
|
1 byte: record type (record_mem, see enum record_type).
|
|
|
|
8 bytes: memory length (network byte order).
|
|
|
|
8 bytes: memory address (network byte order).
|
|
|
|
n bytes: memory value (n == memory length).
|
|
|
|
|
|
|
|
Version 2
|
|
|
|
4 bytes: magic number netorder32(0x20091016).
|
|
|
|
NOTE: be sure to change whenever this file format changes!
|
|
|
|
|
|
|
|
Records:
|
|
|
|
record_end:
|
|
|
|
1 byte: record type (record_end, see enum record_type).
|
|
|
|
4 bytes: signal
|
|
|
|
4 bytes: instruction count
|
|
|
|
record_reg:
|
|
|
|
1 byte: record type (record_reg, see enum record_type).
|
|
|
|
4 bytes: register id (network byte order).
|
|
|
|
n bytes: register value (n == actual register size).
|
|
|
|
(eg. 4 bytes for x86 general registers).
|
|
|
|
record_mem:
|
|
|
|
1 byte: record type (record_mem, see enum record_type).
|
|
|
|
4 bytes: memory length (network byte order).
|
|
|
|
8 bytes: memory address (network byte order).
|
|
|
|
n bytes: memory value (n == memory length).
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* bfdcore_read -- read bytes from a core file section. */
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
bfdcore_read (bfd *obfd, asection *osec, void *buf, int len, int *offset)
|
|
|
|
{
|
|
|
|
int ret = bfd_get_section_contents (obfd, osec, buf, *offset, len);
|
|
|
|
|
|
|
|
if (ret)
|
|
|
|
*offset += len;
|
|
|
|
else
|
2011-03-18 21:09:47 +08:00
|
|
|
error (_("Failed to read %d bytes from core file %s ('%s')."),
|
2009-10-23 03:36:06 +08:00
|
|
|
len, bfd_get_filename (obfd),
|
|
|
|
bfd_errmsg (bfd_get_error ()));
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint64_t
|
2009-10-24 07:42:25 +08:00
|
|
|
netorder64 (uint64_t input)
|
2009-10-23 03:36:06 +08:00
|
|
|
{
|
2009-10-24 07:42:25 +08:00
|
|
|
uint64_t ret;
|
|
|
|
|
|
|
|
store_unsigned_integer ((gdb_byte *) &ret, sizeof (ret),
|
|
|
|
BFD_ENDIAN_BIG, input);
|
|
|
|
return ret;
|
2009-10-23 03:36:06 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint32_t
|
2009-10-24 07:42:25 +08:00
|
|
|
netorder32 (uint32_t input)
|
2009-10-23 03:36:06 +08:00
|
|
|
{
|
2009-10-24 07:42:25 +08:00
|
|
|
uint32_t ret;
|
|
|
|
|
|
|
|
store_unsigned_integer ((gdb_byte *) &ret, sizeof (ret),
|
|
|
|
BFD_ENDIAN_BIG, input);
|
|
|
|
return ret;
|
2009-10-23 03:36:06 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint16_t
|
2009-10-24 07:42:25 +08:00
|
|
|
netorder16 (uint16_t input)
|
2009-10-23 03:36:06 +08:00
|
|
|
{
|
2009-10-24 07:42:25 +08:00
|
|
|
uint16_t ret;
|
|
|
|
|
|
|
|
store_unsigned_integer ((gdb_byte *) &ret, sizeof (ret),
|
|
|
|
BFD_ENDIAN_BIG, input);
|
|
|
|
return ret;
|
2009-10-23 03:36:06 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Restore the execution log from a core_bfd file. */
|
|
|
|
static void
|
|
|
|
record_restore (void)
|
|
|
|
{
|
|
|
|
uint32_t magic;
|
|
|
|
struct cleanup *old_cleanups;
|
|
|
|
struct record_entry *rec;
|
|
|
|
asection *osec;
|
|
|
|
uint32_t osec_size;
|
|
|
|
int bfd_offset = 0;
|
|
|
|
struct regcache *regcache;
|
|
|
|
|
|
|
|
/* We restore the execution log from the open core bfd,
|
|
|
|
if there is one. */
|
|
|
|
if (core_bfd == NULL)
|
|
|
|
return;
|
|
|
|
|
|
|
|
/* "record_restore" can only be called when record list is empty. */
|
|
|
|
gdb_assert (record_first.next == NULL);
|
|
|
|
|
|
|
|
if (record_debug)
|
2009-10-31 22:56:26 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog, "Restoring recording from core file.\n");
|
2009-10-23 03:36:06 +08:00
|
|
|
|
|
|
|
/* Now need to find our special note section. */
|
|
|
|
osec = bfd_get_section_by_name (core_bfd, "null0");
|
|
|
|
if (record_debug)
|
2009-10-31 22:56:26 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog, "Find precord section %s.\n",
|
|
|
|
osec ? "succeeded" : "failed");
|
2011-03-03 02:09:11 +08:00
|
|
|
if (osec == NULL)
|
|
|
|
return;
|
|
|
|
osec_size = bfd_section_size (core_bfd, osec);
|
2009-10-23 03:36:06 +08:00
|
|
|
if (record_debug)
|
2009-10-31 22:56:26 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog, "%s", bfd_section_name (core_bfd, osec));
|
2009-10-23 03:36:06 +08:00
|
|
|
|
|
|
|
/* Check the magic code. */
|
|
|
|
bfdcore_read (core_bfd, osec, &magic, sizeof (magic), &bfd_offset);
|
|
|
|
if (magic != RECORD_FILE_MAGIC)
|
|
|
|
error (_("Version mis-match or file format error in core file %s."),
|
|
|
|
bfd_get_filename (core_bfd));
|
|
|
|
if (record_debug)
|
2011-01-06 06:22:53 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
" Reading 4-byte magic cookie "
|
|
|
|
"RECORD_FILE_MAGIC (0x%s)\n",
|
2009-10-31 22:56:26 +08:00
|
|
|
phex_nz (netorder32 (magic), 4));
|
2009-10-23 03:36:06 +08:00
|
|
|
|
|
|
|
/* Restore the entries in recfd into record_arch_list_head and
|
|
|
|
record_arch_list_tail. */
|
|
|
|
record_arch_list_head = NULL;
|
|
|
|
record_arch_list_tail = NULL;
|
|
|
|
record_insn_num = 0;
|
|
|
|
old_cleanups = make_cleanup (record_arch_list_cleanups, 0);
|
|
|
|
regcache = get_current_regcache ();
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
{
|
2010-03-08 09:49:35 +08:00
|
|
|
uint8_t rectype;
|
2009-10-23 03:36:06 +08:00
|
|
|
uint32_t regnum, len, signal, count;
|
|
|
|
uint64_t addr;
|
|
|
|
|
|
|
|
/* We are finished when offset reaches osec_size. */
|
|
|
|
if (bfd_offset >= osec_size)
|
|
|
|
break;
|
2010-03-08 09:49:35 +08:00
|
|
|
bfdcore_read (core_bfd, osec, &rectype, sizeof (rectype), &bfd_offset);
|
2009-10-23 03:36:06 +08:00
|
|
|
|
2010-03-08 09:49:35 +08:00
|
|
|
switch (rectype)
|
2009-10-23 03:36:06 +08:00
|
|
|
{
|
|
|
|
case record_reg: /* reg */
|
|
|
|
/* Get register number to regnum. */
|
|
|
|
bfdcore_read (core_bfd, osec, ®num,
|
|
|
|
sizeof (regnum), &bfd_offset);
|
|
|
|
regnum = netorder32 (regnum);
|
|
|
|
|
|
|
|
rec = record_reg_alloc (regcache, regnum);
|
|
|
|
|
|
|
|
/* Get val. */
|
|
|
|
bfdcore_read (core_bfd, osec, record_get_loc (rec),
|
|
|
|
rec->u.reg.len, &bfd_offset);
|
|
|
|
|
2009-10-31 22:56:26 +08:00
|
|
|
if (record_debug)
|
2011-01-06 06:22:53 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
" Reading register %d (1 "
|
|
|
|
"plus %lu plus %d bytes)\n",
|
2009-10-31 22:56:26 +08:00
|
|
|
rec->u.reg.num,
|
|
|
|
(unsigned long) sizeof (regnum),
|
|
|
|
rec->u.reg.len);
|
2009-10-23 03:36:06 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case record_mem: /* mem */
|
|
|
|
/* Get len. */
|
|
|
|
bfdcore_read (core_bfd, osec, &len,
|
|
|
|
sizeof (len), &bfd_offset);
|
|
|
|
len = netorder32 (len);
|
|
|
|
|
|
|
|
/* Get addr. */
|
|
|
|
bfdcore_read (core_bfd, osec, &addr,
|
|
|
|
sizeof (addr), &bfd_offset);
|
|
|
|
addr = netorder64 (addr);
|
|
|
|
|
|
|
|
rec = record_mem_alloc (addr, len);
|
|
|
|
|
|
|
|
/* Get val. */
|
|
|
|
bfdcore_read (core_bfd, osec, record_get_loc (rec),
|
|
|
|
rec->u.mem.len, &bfd_offset);
|
|
|
|
|
2009-10-31 22:56:26 +08:00
|
|
|
if (record_debug)
|
2011-01-06 06:22:53 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
" Reading memory %s (1 plus "
|
|
|
|
"%lu plus %lu plus %d bytes)\n",
|
2009-10-31 22:56:26 +08:00
|
|
|
paddress (get_current_arch (),
|
|
|
|
rec->u.mem.addr),
|
|
|
|
(unsigned long) sizeof (addr),
|
|
|
|
(unsigned long) sizeof (len),
|
|
|
|
rec->u.mem.len);
|
2009-10-23 03:36:06 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case record_end: /* end */
|
|
|
|
rec = record_end_alloc ();
|
|
|
|
record_insn_num ++;
|
|
|
|
|
|
|
|
/* Get signal value. */
|
|
|
|
bfdcore_read (core_bfd, osec, &signal,
|
|
|
|
sizeof (signal), &bfd_offset);
|
|
|
|
signal = netorder32 (signal);
|
|
|
|
rec->u.end.sigval = signal;
|
|
|
|
|
|
|
|
/* Get insn count. */
|
|
|
|
bfdcore_read (core_bfd, osec, &count,
|
|
|
|
sizeof (count), &bfd_offset);
|
|
|
|
count = netorder32 (count);
|
|
|
|
rec->u.end.insn_num = count;
|
|
|
|
record_insn_count = count + 1;
|
2009-10-31 22:56:26 +08:00
|
|
|
if (record_debug)
|
2011-01-06 06:22:53 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
" Reading record_end (1 + "
|
|
|
|
"%lu + %lu bytes), offset == %s\n",
|
2009-10-31 22:56:26 +08:00
|
|
|
(unsigned long) sizeof (signal),
|
|
|
|
(unsigned long) sizeof (count),
|
|
|
|
paddress (get_current_arch (),
|
|
|
|
bfd_offset));
|
2009-10-23 03:36:06 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
error (_("Bad entry type in core file %s."),
|
|
|
|
bfd_get_filename (core_bfd));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Add rec to record arch list. */
|
|
|
|
record_arch_list_add (rec);
|
|
|
|
}
|
|
|
|
|
|
|
|
discard_cleanups (old_cleanups);
|
|
|
|
|
|
|
|
/* Add record_arch_list_head to the end of record list. */
|
|
|
|
record_first.next = record_arch_list_head;
|
|
|
|
record_arch_list_head->prev = &record_first;
|
|
|
|
record_arch_list_tail->next = NULL;
|
|
|
|
record_list = &record_first;
|
|
|
|
|
|
|
|
/* Update record_insn_max_num. */
|
|
|
|
if (record_insn_num > record_insn_max_num)
|
|
|
|
{
|
|
|
|
record_insn_max_num = record_insn_num;
|
|
|
|
warning (_("Auto increase record/replay buffer limit to %d."),
|
|
|
|
record_insn_max_num);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Succeeded. */
|
|
|
|
printf_filtered (_("Restored records from core file %s.\n"),
|
|
|
|
bfd_get_filename (core_bfd));
|
|
|
|
|
|
|
|
print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* bfdcore_write -- write bytes into a core file section. */
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
bfdcore_write (bfd *obfd, asection *osec, void *buf, int len, int *offset)
|
|
|
|
{
|
|
|
|
int ret = bfd_set_section_contents (obfd, osec, buf, *offset, len);
|
|
|
|
|
|
|
|
if (ret)
|
|
|
|
*offset += len;
|
|
|
|
else
|
2011-03-17 01:59:03 +08:00
|
|
|
error (_("Failed to write %d bytes to core file %s ('%s')."),
|
2009-10-23 03:36:06 +08:00
|
|
|
len, bfd_get_filename (obfd),
|
|
|
|
bfd_errmsg (bfd_get_error ()));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Restore the execution log from a file. We use a modified elf
|
|
|
|
corefile format, with an extra section for our data. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_record_restore (char *args, int from_tty)
|
|
|
|
{
|
|
|
|
core_file_command (args, from_tty);
|
|
|
|
record_open (args, from_tty);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_save_cleanups (void *data)
|
|
|
|
{
|
|
|
|
bfd *obfd = data;
|
|
|
|
char *pathname = xstrdup (bfd_get_filename (obfd));
|
2010-05-17 05:11:14 +08:00
|
|
|
|
2009-10-23 03:36:06 +08:00
|
|
|
bfd_close (obfd);
|
|
|
|
unlink (pathname);
|
|
|
|
xfree (pathname);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Save the execution log to a file. We use a modified elf corefile
|
|
|
|
format, with an extra section for our data. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_record_save (char *args, int from_tty)
|
|
|
|
{
|
|
|
|
char *recfilename, recfilename_buffer[40];
|
|
|
|
struct record_entry *cur_record_list;
|
|
|
|
uint32_t magic;
|
|
|
|
struct regcache *regcache;
|
|
|
|
struct gdbarch *gdbarch;
|
|
|
|
struct cleanup *old_cleanups;
|
|
|
|
struct cleanup *set_cleanups;
|
|
|
|
bfd *obfd;
|
|
|
|
int save_size = 0;
|
|
|
|
asection *osec = NULL;
|
|
|
|
int bfd_offset = 0;
|
|
|
|
|
|
|
|
if (strcmp (current_target.to_shortname, "record") != 0)
|
|
|
|
error (_("This command can only be used with target 'record'.\n"
|
|
|
|
"Use 'target record' first.\n"));
|
|
|
|
|
|
|
|
if (args && *args)
|
|
|
|
recfilename = args;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Default recfile name is "gdb_record.PID". */
|
|
|
|
snprintf (recfilename_buffer, sizeof (recfilename_buffer),
|
|
|
|
"gdb_record.%d", PIDGET (inferior_ptid));
|
|
|
|
recfilename = recfilename_buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Open the save file. */
|
|
|
|
if (record_debug)
|
2009-10-31 22:56:26 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog, "Saving execution log to core file '%s'\n",
|
|
|
|
recfilename);
|
2009-10-23 03:36:06 +08:00
|
|
|
|
|
|
|
/* Open the output file. */
|
|
|
|
obfd = create_gcore_bfd (recfilename);
|
|
|
|
old_cleanups = make_cleanup (record_save_cleanups, obfd);
|
|
|
|
|
|
|
|
/* Save the current record entry to "cur_record_list". */
|
|
|
|
cur_record_list = record_list;
|
|
|
|
|
|
|
|
/* Get the values of regcache and gdbarch. */
|
|
|
|
regcache = get_current_regcache ();
|
|
|
|
gdbarch = get_regcache_arch (regcache);
|
|
|
|
|
|
|
|
/* Disable the GDB operation record. */
|
|
|
|
set_cleanups = record_gdb_operation_disable_set ();
|
|
|
|
|
|
|
|
/* Reverse execute to the begin of record list. */
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
/* Check for beginning and end of log. */
|
|
|
|
if (record_list == &record_first)
|
|
|
|
break;
|
|
|
|
|
|
|
|
record_exec_insn (regcache, gdbarch, record_list);
|
|
|
|
|
|
|
|
if (record_list->prev)
|
|
|
|
record_list = record_list->prev;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Compute the size needed for the extra bfd section. */
|
|
|
|
save_size = 4; /* magic cookie */
|
|
|
|
for (record_list = record_first.next; record_list;
|
|
|
|
record_list = record_list->next)
|
|
|
|
switch (record_list->type)
|
|
|
|
{
|
|
|
|
case record_end:
|
|
|
|
save_size += 1 + 4 + 4;
|
|
|
|
break;
|
|
|
|
case record_reg:
|
|
|
|
save_size += 1 + 4 + record_list->u.reg.len;
|
|
|
|
break;
|
|
|
|
case record_mem:
|
|
|
|
save_size += 1 + 4 + 8 + record_list->u.mem.len;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Make the new bfd section. */
|
|
|
|
osec = bfd_make_section_anyway_with_flags (obfd, "precord",
|
|
|
|
SEC_HAS_CONTENTS
|
|
|
|
| SEC_READONLY);
|
|
|
|
if (osec == NULL)
|
|
|
|
error (_("Failed to create 'precord' section for corefile %s: %s"),
|
|
|
|
recfilename,
|
|
|
|
bfd_errmsg (bfd_get_error ()));
|
|
|
|
bfd_set_section_size (obfd, osec, save_size);
|
|
|
|
bfd_set_section_vma (obfd, osec, 0);
|
|
|
|
bfd_set_section_alignment (obfd, osec, 0);
|
|
|
|
bfd_section_lma (obfd, osec) = 0;
|
|
|
|
|
|
|
|
/* Save corefile state. */
|
|
|
|
write_gcore_file (obfd);
|
|
|
|
|
|
|
|
/* Write out the record log. */
|
|
|
|
/* Write the magic code. */
|
|
|
|
magic = RECORD_FILE_MAGIC;
|
|
|
|
if (record_debug)
|
2011-01-06 06:22:53 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
" Writing 4-byte magic cookie "
|
|
|
|
"RECORD_FILE_MAGIC (0x%s)\n",
|
2009-10-31 22:56:26 +08:00
|
|
|
phex_nz (magic, 4));
|
2009-10-23 03:36:06 +08:00
|
|
|
bfdcore_write (obfd, osec, &magic, sizeof (magic), &bfd_offset);
|
|
|
|
|
|
|
|
/* Save the entries to recfd and forward execute to the end of
|
|
|
|
record list. */
|
|
|
|
record_list = &record_first;
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
/* Save entry. */
|
|
|
|
if (record_list != &record_first)
|
|
|
|
{
|
|
|
|
uint8_t type;
|
|
|
|
uint32_t regnum, len, signal, count;
|
|
|
|
uint64_t addr;
|
|
|
|
|
|
|
|
type = record_list->type;
|
|
|
|
bfdcore_write (obfd, osec, &type, sizeof (type), &bfd_offset);
|
|
|
|
|
|
|
|
switch (record_list->type)
|
|
|
|
{
|
|
|
|
case record_reg: /* reg */
|
2009-10-31 22:56:26 +08:00
|
|
|
if (record_debug)
|
2011-01-06 06:22:53 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
" Writing register %d (1 "
|
|
|
|
"plus %lu plus %d bytes)\n",
|
2009-10-31 22:56:26 +08:00
|
|
|
record_list->u.reg.num,
|
|
|
|
(unsigned long) sizeof (regnum),
|
|
|
|
record_list->u.reg.len);
|
2009-10-23 03:36:06 +08:00
|
|
|
|
|
|
|
/* Write regnum. */
|
|
|
|
regnum = netorder32 (record_list->u.reg.num);
|
|
|
|
bfdcore_write (obfd, osec, ®num,
|
|
|
|
sizeof (regnum), &bfd_offset);
|
|
|
|
|
|
|
|
/* Write regval. */
|
|
|
|
bfdcore_write (obfd, osec, record_get_loc (record_list),
|
|
|
|
record_list->u.reg.len, &bfd_offset);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case record_mem: /* mem */
|
|
|
|
if (record_debug)
|
2011-01-06 06:22:53 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
" Writing memory %s (1 plus "
|
|
|
|
"%lu plus %lu plus %d bytes)\n",
|
2009-10-31 22:56:26 +08:00
|
|
|
paddress (gdbarch,
|
|
|
|
record_list->u.mem.addr),
|
|
|
|
(unsigned long) sizeof (addr),
|
|
|
|
(unsigned long) sizeof (len),
|
|
|
|
record_list->u.mem.len);
|
2009-10-23 03:36:06 +08:00
|
|
|
|
|
|
|
/* Write memlen. */
|
|
|
|
len = netorder32 (record_list->u.mem.len);
|
|
|
|
bfdcore_write (obfd, osec, &len, sizeof (len), &bfd_offset);
|
|
|
|
|
|
|
|
/* Write memaddr. */
|
|
|
|
addr = netorder64 (record_list->u.mem.addr);
|
|
|
|
bfdcore_write (obfd, osec, &addr,
|
|
|
|
sizeof (addr), &bfd_offset);
|
|
|
|
|
|
|
|
/* Write memval. */
|
|
|
|
bfdcore_write (obfd, osec, record_get_loc (record_list),
|
|
|
|
record_list->u.mem.len, &bfd_offset);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case record_end:
|
2009-10-31 22:56:26 +08:00
|
|
|
if (record_debug)
|
2011-01-06 06:22:53 +08:00
|
|
|
fprintf_unfiltered (gdb_stdlog,
|
|
|
|
" Writing record_end (1 + "
|
|
|
|
"%lu + %lu bytes)\n",
|
2009-10-31 22:56:26 +08:00
|
|
|
(unsigned long) sizeof (signal),
|
|
|
|
(unsigned long) sizeof (count));
|
2009-10-23 03:36:06 +08:00
|
|
|
/* Write signal value. */
|
|
|
|
signal = netorder32 (record_list->u.end.sigval);
|
|
|
|
bfdcore_write (obfd, osec, &signal,
|
|
|
|
sizeof (signal), &bfd_offset);
|
|
|
|
|
|
|
|
/* Write insn count. */
|
|
|
|
count = netorder32 (record_list->u.end.insn_num);
|
|
|
|
bfdcore_write (obfd, osec, &count,
|
|
|
|
sizeof (count), &bfd_offset);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Execute entry. */
|
|
|
|
record_exec_insn (regcache, gdbarch, record_list);
|
|
|
|
|
|
|
|
if (record_list->next)
|
|
|
|
record_list = record_list->next;
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Reverse execute to cur_record_list. */
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
/* Check for beginning and end of log. */
|
|
|
|
if (record_list == cur_record_list)
|
|
|
|
break;
|
|
|
|
|
|
|
|
record_exec_insn (regcache, gdbarch, record_list);
|
|
|
|
|
|
|
|
if (record_list->prev)
|
|
|
|
record_list = record_list->prev;
|
|
|
|
}
|
|
|
|
|
|
|
|
do_cleanups (set_cleanups);
|
|
|
|
bfd_close (obfd);
|
|
|
|
discard_cleanups (old_cleanups);
|
|
|
|
|
|
|
|
/* Succeeded. */
|
|
|
|
printf_filtered (_("Saved core file %s with execution log.\n"),
|
|
|
|
recfilename);
|
|
|
|
}
|
|
|
|
|
2009-11-21 01:23:38 +08:00
|
|
|
/* record_goto_insn -- rewind the record log (forward or backward,
|
|
|
|
depending on DIR) to the given entry, changing the program state
|
|
|
|
correspondingly. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
record_goto_insn (struct record_entry *entry,
|
|
|
|
enum exec_direction_kind dir)
|
|
|
|
{
|
|
|
|
struct cleanup *set_cleanups = record_gdb_operation_disable_set ();
|
|
|
|
struct regcache *regcache = get_current_regcache ();
|
|
|
|
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
|
|
|
|
|
|
|
/* Assume everything is valid: we will hit the entry,
|
|
|
|
and we will not hit the end of the recording. */
|
|
|
|
|
|
|
|
if (dir == EXEC_FORWARD)
|
|
|
|
record_list = record_list->next;
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
record_exec_insn (regcache, gdbarch, record_list);
|
|
|
|
if (dir == EXEC_REVERSE)
|
|
|
|
record_list = record_list->prev;
|
|
|
|
else
|
|
|
|
record_list = record_list->next;
|
|
|
|
} while (record_list != entry);
|
|
|
|
do_cleanups (set_cleanups);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* "record goto" command. Argument is an instruction number,
|
|
|
|
as given by "info record".
|
|
|
|
|
|
|
|
Rewinds the recording (forward or backward) to the given instruction. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_record_goto (char *arg, int from_tty)
|
|
|
|
{
|
|
|
|
struct record_entry *p = NULL;
|
|
|
|
ULONGEST target_insn = 0;
|
|
|
|
|
|
|
|
if (arg == NULL || *arg == '\0')
|
|
|
|
error (_("Command requires an argument (insn number to go to)."));
|
|
|
|
|
|
|
|
if (strncmp (arg, "start", strlen ("start")) == 0
|
|
|
|
|| strncmp (arg, "begin", strlen ("begin")) == 0)
|
|
|
|
{
|
|
|
|
/* Special case. Find first insn. */
|
|
|
|
for (p = &record_first; p != NULL; p = p->next)
|
|
|
|
if (p->type == record_end)
|
|
|
|
break;
|
|
|
|
if (p)
|
|
|
|
target_insn = p->u.end.insn_num;
|
|
|
|
}
|
|
|
|
else if (strncmp (arg, "end", strlen ("end")) == 0)
|
|
|
|
{
|
|
|
|
/* Special case. Find last insn. */
|
|
|
|
for (p = record_list; p->next != NULL; p = p->next)
|
|
|
|
;
|
|
|
|
for (; p!= NULL; p = p->prev)
|
|
|
|
if (p->type == record_end)
|
|
|
|
break;
|
|
|
|
if (p)
|
|
|
|
target_insn = p->u.end.insn_num;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* General case. Find designated insn. */
|
|
|
|
target_insn = parse_and_eval_long (arg);
|
|
|
|
|
|
|
|
for (p = &record_first; p != NULL; p = p->next)
|
|
|
|
if (p->type == record_end && p->u.end.insn_num == target_insn)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (p == NULL)
|
|
|
|
error (_("Target insn '%s' not found."), arg);
|
|
|
|
else if (p == record_list)
|
|
|
|
error (_("Already at insn '%s'."), arg);
|
|
|
|
else if (p->u.end.insn_num > record_list->u.end.insn_num)
|
|
|
|
{
|
|
|
|
printf_filtered (_("Go forward to insn number %s\n"),
|
|
|
|
pulongest (target_insn));
|
|
|
|
record_goto_insn (p, EXEC_FORWARD);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printf_filtered (_("Go backward to insn number %s\n"),
|
|
|
|
pulongest (target_insn));
|
|
|
|
record_goto_insn (p, EXEC_REVERSE);
|
|
|
|
}
|
|
|
|
registers_changed ();
|
|
|
|
reinit_frame_cache ();
|
|
|
|
print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
|
|
|
|
}
|
|
|
|
|
2012-03-01 Pedro Alves <palves@redhat.com>
* amd64-linux-tdep.c (amd64_linux_record_signal): Make static.
* breakpoint.c (create_exception_master_breakpoint, trace_command)
(ftrace_command, strace_command): Make static.
* d-lang.c (_initialize_d_language): Declare.
* dwarf2expr.c (_initialize_dwarf2expr): Declare.
* dwarf2loc.c (_initialize_dwarf2loc):
* dwarf2read.c (process_psymtab_comp_unit): Make static.
* exec.c (exec_get_section_table): Make static.
* i386-linux-tdep.c (i386_linux_record_signal): Make static.
* infcmd.c (ensure_valid_thread, ensure_not_tfind_mode): Make static.
* inferior.c (remove_inferior_command, add_inferior_command)
(clone_inferior_command): Make static.
* linux-nat.c (linux_nat_thread_address_space)
(linux_nat_core_of_thread): Make static.
* linux-tdep.c (_initialize_linux_tdep): Declare.
* objc-lang.c (_initialize_objc_lang): Declare.
* opencl-lang.c (builtin_opencl_type, opencl_language_arch_info):
Make static.
(_initialize_opencl_language): Declare.
* record.c (_initialize_record): Declare.
* remote.c (demand_private_info, remote_get_tib_address)
(remote_supports_cond_tracepoints)
(remote_supports_fast_tracepoints, remote_get_tracepoint_status):
Make static.
* skip.c (_initialize_step_skip): Declare.
* symtab.c (skip_prologue_using_lineinfo): Make static.
* tracepoint.c (delete_trace_state_variable)
(trace_variable_command, delete_trace_variable_command)
(get_uploaded_tsv, find_matching_tracepoint_location)
(find_matching_tsv, create_tsv_from_upload, get_traceframe_info):
Make static.
* value.c (pack_unsigned_long): Make static.
* varobj.c (varobj_ensure_python_env): Make static.
* windows-tdep.c (_initialize_windows_tdep): Declare.
* xml-syscall.c (make_cleanup_free_syscalls_info): Make static.
2012-03-02 05:14:00 +08:00
|
|
|
/* Provide a prototype to silence -Wmissing-prototypes. */
|
|
|
|
extern initialize_file_ftype _initialize_record;
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
void
|
|
|
|
_initialize_record (void)
|
|
|
|
{
|
2009-10-23 03:36:06 +08:00
|
|
|
struct cmd_list_element *c;
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
/* Init record_first. */
|
|
|
|
record_first.prev = NULL;
|
|
|
|
record_first.next = NULL;
|
|
|
|
record_first.type = record_end;
|
|
|
|
|
|
|
|
init_record_ops ();
|
|
|
|
add_target (&record_ops);
|
2009-10-23 03:32:11 +08:00
|
|
|
init_record_core_ops ();
|
|
|
|
add_target (&record_core_ops);
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
add_setshow_zinteger_cmd ("record", no_class, &record_debug,
|
|
|
|
_("Set debugging of record/replay feature."),
|
|
|
|
_("Show debugging of record/replay feature."),
|
|
|
|
_("When enabled, debugging output for "
|
|
|
|
"record/replay feature is displayed."),
|
|
|
|
NULL, show_record_debug, &setdebuglist,
|
|
|
|
&showdebuglist);
|
|
|
|
|
2009-10-23 03:36:06 +08:00
|
|
|
c = add_prefix_cmd ("record", class_obscure, cmd_record_start,
|
|
|
|
_("Abbreviated form of \"target record\" command."),
|
|
|
|
&record_cmdlist, "record ", 0, &cmdlist);
|
|
|
|
set_cmd_completer (c, filename_completer);
|
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
add_com_alias ("rec", "record", class_obscure, 1);
|
|
|
|
add_prefix_cmd ("record", class_support, set_record_command,
|
|
|
|
_("Set record options"), &set_record_cmdlist,
|
|
|
|
"set record ", 0, &setlist);
|
|
|
|
add_alias_cmd ("rec", "record", class_obscure, 1, &setlist);
|
|
|
|
add_prefix_cmd ("record", class_support, show_record_command,
|
|
|
|
_("Show record options"), &show_record_cmdlist,
|
|
|
|
"show record ", 0, &showlist);
|
|
|
|
add_alias_cmd ("rec", "record", class_obscure, 1, &showlist);
|
|
|
|
add_prefix_cmd ("record", class_support, info_record_command,
|
|
|
|
_("Info record options"), &info_record_cmdlist,
|
|
|
|
"info record ", 0, &infolist);
|
|
|
|
add_alias_cmd ("rec", "record", class_obscure, 1, &infolist);
|
|
|
|
|
2009-10-23 03:36:06 +08:00
|
|
|
c = add_cmd ("save", class_obscure, cmd_record_save,
|
|
|
|
_("Save the execution log to a file.\n\
|
|
|
|
Argument is optional filename.\n\
|
|
|
|
Default filename is 'gdb_record.<process_id>'."),
|
|
|
|
&record_cmdlist);
|
|
|
|
set_cmd_completer (c, filename_completer);
|
|
|
|
|
|
|
|
c = add_cmd ("restore", class_obscure, cmd_record_restore,
|
|
|
|
_("Restore the execution log from a file.\n\
|
|
|
|
Argument is filename. File must be created with 'record save'."),
|
|
|
|
&record_cmdlist);
|
|
|
|
set_cmd_completer (c, filename_completer);
|
2009-04-30 10:58:37 +08:00
|
|
|
|
|
|
|
add_cmd ("delete", class_obscure, cmd_record_delete,
|
|
|
|
_("Delete the rest of execution log and start recording it anew."),
|
|
|
|
&record_cmdlist);
|
|
|
|
add_alias_cmd ("d", "delete", class_obscure, 1, &record_cmdlist);
|
|
|
|
add_alias_cmd ("del", "delete", class_obscure, 1, &record_cmdlist);
|
|
|
|
|
|
|
|
add_cmd ("stop", class_obscure, cmd_record_stop,
|
|
|
|
_("Stop the record/replay target."),
|
|
|
|
&record_cmdlist);
|
|
|
|
add_alias_cmd ("s", "stop", class_obscure, 1, &record_cmdlist);
|
|
|
|
|
|
|
|
/* Record instructions number limit command. */
|
|
|
|
add_setshow_boolean_cmd ("stop-at-limit", no_class,
|
2009-09-08 08:50:42 +08:00
|
|
|
&record_stop_at_limit, _("\
|
2009-05-02 01:57:31 +08:00
|
|
|
Set whether record/replay stops when record/replay buffer becomes full."), _("\
|
2011-01-06 06:22:53 +08:00
|
|
|
Show whether record/replay stops when record/replay buffer becomes full."),
|
|
|
|
_("Default is ON.\n\
|
2009-05-02 01:57:31 +08:00
|
|
|
When ON, if the record/replay buffer becomes full, ask user what to do.\n\
|
|
|
|
When OFF, if the record/replay buffer becomes full,\n\
|
|
|
|
delete the oldest recorded instruction to make room for each new one."),
|
2009-09-08 08:50:42 +08:00
|
|
|
NULL, NULL,
|
|
|
|
&set_record_cmdlist, &show_record_cmdlist);
|
2009-10-16 01:27:54 +08:00
|
|
|
add_setshow_uinteger_cmd ("insn-number-max", no_class,
|
2009-04-30 10:58:37 +08:00
|
|
|
&record_insn_max_num,
|
|
|
|
_("Set record/replay buffer limit."),
|
2009-05-02 01:57:31 +08:00
|
|
|
_("Show record/replay buffer limit."), _("\
|
|
|
|
Set the maximum number of instructions to be stored in the\n\
|
|
|
|
record/replay buffer. Zero means unlimited. Default is 200000."),
|
2009-04-30 10:58:37 +08:00
|
|
|
set_record_insn_max_num,
|
|
|
|
NULL, &set_record_cmdlist, &show_record_cmdlist);
|
2009-11-21 01:23:38 +08:00
|
|
|
|
|
|
|
add_cmd ("goto", class_obscure, cmd_record_goto, _("\
|
|
|
|
Restore the program to its state at instruction number N.\n\
|
|
|
|
Argument is instruction number, as shown by 'info record'."),
|
|
|
|
&record_cmdlist);
|
2010-06-22 10:15:46 +08:00
|
|
|
|
|
|
|
add_setshow_boolean_cmd ("memory-query", no_class,
|
|
|
|
&record_memory_query, _("\
|
|
|
|
Set whether query if PREC cannot record memory change of next instruction."),
|
|
|
|
_("\
|
|
|
|
Show whether query if PREC cannot record memory change of next instruction."),
|
|
|
|
_("\
|
|
|
|
Default is OFF.\n\
|
|
|
|
When ON, query if PREC cannot record memory change of next instruction."),
|
|
|
|
NULL, NULL,
|
|
|
|
&set_record_cmdlist, &show_record_cmdlist);
|
2010-06-29 Hui Zhu <teawater@gmail.com>
* record.c (set_record_pic_cmdlist,
show_record_pic_cmdlist): New variables.
(set_record_pic_command,
show_record_pic_command): New functions.
(record_pic_function, record_pic_line, record_pic_enum,
set_record_pic_type, record_pic_hide_nofunction,
record_pic_hide_nosource, record_pic_hide_same): New variables.
(record_pic_fputs): New function.
(function_list, node_list, edge_list): New struct.
(function_list, node_list, edge_list): New variables.
(record_pic_cleanups, record_pic_node,
record_pic_edge, cmd_record_pic): New functions.
(_initialize_record): Add new commands for record pic.
2010-06-29 13:52:17 +08:00
|
|
|
|
2009-04-30 10:58:37 +08:00
|
|
|
}
|