mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-30 21:44:19 +08:00
a96d9b2e9a
* amd64-linux-tdep.c: Include xml-syscall.h header, define the XML syscall name for the architecture. (amd64_linux_get_syscall_number): New function. (amd64_linux_init_abi): Register the correct functions for syscall catchpoint; set the correct syscall file name. * breakpoint.c: New include: xml-syscall.h. (set_raw_breakpoint_without_location): Setting the parameters for the catch syscall feature. (insert_catch_syscall): New. (remove_catch_syscall): New. (breakpoint_hit_catch_syscall): New. (print_it_catch_syscall): New. (print_one_catch_syscall): New. (print_mention_catch_syscall): New. (catch_syscall_breakpoint_ops): New. (syscall_catchpoint_p): New. (create_catchpoint_without_mention): New. (create_catchpoint): Modified in order to use create_catchpoint_without_mention. (create_syscall_event_catchpoint): New. (clean_up_filters): New. (catch_syscall_split_args): New. (catch_syscall_command_1): New. (delete_breakpoint): Add cleanup for catch syscall. (is_syscall_catchpoint_enabled): New. (catch_syscall_enabled): New. (catching_syscall_number): New. (catch_syscall_completer): New completer function. (add_catch_command): Add the completer function for catchpoints. * breakpoint.h (syscalls_to_be_caught): New vector. (catch_syscall_enabled): New. (catching_syscall_number): New. * gdbarch.c: Regenerated. * gdbarch.h: Regenerated. * gdbarch.sh: Add syscall catchpoint functions and structures. (get_syscall_number): New. (UNKNOWN_SYSCALL): New definition. * i386-linux-nat.c (i386_linux_resume): Select the proper request to be made for ptrace() considering if we are catching syscalls or not. * i386-linux-tdep.c: Include xml-syscall.h header, define the XML syscall name for the architecture. (i386_linux_get_syscall_number): New. (i386_linux_init_abi): Register the correct functions for syscall catchpoint; set the correct syscall file name. * inf-child.c (inf_child_set_syscall_catchpoint): New. (inf_child_target): Assign default values to target_ops. * inf-ptrace.c (inf_ptrace_resume): Select the proper request to be made for ptrace() considering if we are catching syscalls or not. * inferior.h (struct inferior): Included new variables any_syscall_count, syscalls_counts and total_syscalls_count, used to keep track of requested syscall catchpoints. * infrun.c (resume): Add syscall catchpoint. (deal_with_syscall_event): New. (handle_inferior_event): Add syscall entry/return events. (inferior_has_called_syscall): New. * linux-nat.c: Define some helpful variables to track wether we have support for the needed ptrace option. (linux_test_for_tracesysgood): New. (linux_supports_tracesysgood): New. (linux_enable_tracesysgood): New. (linux_enable_event_reporting): Save the current used ptrace options. (linux_child_post_attach): Calling linux_enable_tracesysgood. (linux_child_post_startup_inferior): Likewise. (linux_child_set_syscall_catchpoint): New function. (linux_handle_extended_wait): Handle the case which the inferior stops because it has called or returned from a syscall. (linux_target_install_ops): Install the necessary functions to handle syscall catchpoints. * linux-nat.h (struct lwp_info): Include syscall_state into the structure, which indicates if we are in a syscall entry or return. * ppc-linux-tdep.c: Include xml-syscall.h header, define the XML syscall filename for the arch. (ppc_linux_get_syscall_number): New. (ppc_linux_init_abi): Register the correct functions for syscall catchpoint; setting the correct name for the XML syscall file. * target.c (update_current_target): Update/copy functions related to syscall catchpoint. (target_waitstatus_to_string): Add syscall catchpoint entry/return events. * target.h (struct target_waitstatus): Add syscall number. (struct syscall): New struct to hold information about syscalls in the system. (struct target_ops): Add ops for syscall catchpoint. (inferior_has_called_syscall): New. (target_set_syscall_catchpoint): New. * xml-support.c (xml_fetch_content_from_file): New function, transferred from xml-tdesc.c. * xml-support.h (xml_fetch_content_from_file): New. * xml-tdesc.c (fetch_xml_from_file): Function removed; transferred to xml-support.c. (file_read_description_xml): Updated to use the new xml_fetch_content_from_file function. * syscalls/gdb-syscalls.dtd: New definition file for syscall's XML support. * syscalls/amd64-linux.xml: New file containing information about syscalls for GNU/Linux systems that use amd64 architecture. * syscalls/i386-linux.xml: New file containing information about syscalls for GNU/Linux systems that use i386 architecture. * syscalls/ppc-linux.xml: New file containing information about syscalls for GNU/Linux systems that use PPC architecture. * syscalls/ppc64-linux.xml: New file containing information about syscalls for GNU/Linux systems that use PPC64 architecture. * xml-syscall.c: New file containing functions for manipulating syscall's XML files. * xml-syscall.h: New file, exporting the functions above mentioned. * Makefile.in: Support for relocatable GDB datadir and XML syscall. * NEWS: Added information about the catch syscall feature. * doc/gdb.texinfo (Set Catchpoints): Documentation about the new feature. * testsuite/Makefile.in: Inclusion of catch-syscall object. * testsuite/gdb.base/catch-syscall.c: New file. * testsuite/gdb.base/catch-syscall.exp: New file.
154 lines
5.2 KiB
C
154 lines
5.2 KiB
C
/* Native debugging support for GNU/Linux (LWP layer).
|
|
|
|
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
|
Free Software Foundation, Inc.
|
|
|
|
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 "target.h"
|
|
|
|
#include <signal.h>
|
|
|
|
/* Structure describing an LWP. This is public only for the purposes
|
|
of ALL_LWPS; target-specific code should generally not access it
|
|
directly. */
|
|
|
|
struct lwp_info
|
|
{
|
|
/* The process id of the LWP. This is a combination of the LWP id
|
|
and overall process id. */
|
|
ptid_t ptid;
|
|
|
|
/* Non-zero if this LWP is cloned. In this context "cloned" means
|
|
that the LWP is reporting to its parent using a signal other than
|
|
SIGCHLD. */
|
|
int cloned;
|
|
|
|
/* Non-zero if we sent this LWP a SIGSTOP (but the LWP didn't report
|
|
it back yet). */
|
|
int signalled;
|
|
|
|
/* Non-zero if this LWP is stopped. */
|
|
int stopped;
|
|
|
|
/* Non-zero if this LWP will be/has been resumed. Note that an LWP
|
|
can be marked both as stopped and resumed at the same time. This
|
|
happens if we try to resume an LWP that has a wait status
|
|
pending. We shouldn't let the LWP run until that wait status has
|
|
been processed, but we should not report that wait status if GDB
|
|
didn't try to let the LWP run. */
|
|
int resumed;
|
|
|
|
/* If non-zero, a pending wait status. */
|
|
int status;
|
|
|
|
/* Non-zero if we were stepping this LWP. */
|
|
int step;
|
|
|
|
/* Non-zero si_signo if this LWP stopped with a trap. si_addr may
|
|
be the address of a hardware watchpoint. */
|
|
struct siginfo siginfo;
|
|
|
|
/* Non-zero if we expect a duplicated SIGINT. */
|
|
int ignore_sigint;
|
|
|
|
/* If WAITSTATUS->KIND != TARGET_WAITKIND_SPURIOUS, the waitstatus
|
|
for this LWP's last event. This may correspond to STATUS above,
|
|
or to a local variable in lin_lwp_wait. */
|
|
struct target_waitstatus waitstatus;
|
|
|
|
/* Signal wether we are in a SYSCALL_ENTRY or
|
|
in a SYSCALL_RETURN event.
|
|
Values:
|
|
- TARGET_WAITKIND_SYSCALL_ENTRY
|
|
- TARGET_WAITKIND_SYSCALL_RETURN */
|
|
int syscall_state;
|
|
|
|
/* Next LWP in list. */
|
|
struct lwp_info *next;
|
|
};
|
|
|
|
/* The global list of LWPs, for ALL_LWPS. Unlike the threads list,
|
|
there is always at least one LWP on the list while the GNU/Linux
|
|
native target is active. */
|
|
extern struct lwp_info *lwp_list;
|
|
|
|
/* Iterate over the PTID each active thread (light-weight process). There
|
|
must be at least one. */
|
|
#define ALL_LWPS(LP, PTID) \
|
|
for ((LP) = lwp_list, (PTID) = (LP)->ptid; \
|
|
(LP) != NULL; \
|
|
(LP) = (LP)->next, (PTID) = (LP) ? (LP)->ptid : (PTID))
|
|
|
|
#define GET_LWP(ptid) ptid_get_lwp (ptid)
|
|
#define GET_PID(ptid) ptid_get_pid (ptid)
|
|
#define is_lwp(ptid) (GET_LWP (ptid) != 0)
|
|
#define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
|
|
|
|
/* Attempt to initialize libthread_db. */
|
|
void check_for_thread_db (void);
|
|
|
|
int thread_db_attach_lwp (ptid_t ptid);
|
|
|
|
/* Find process PID's pending signal set from /proc/pid/status. */
|
|
void linux_proc_pending_signals (int pid, sigset_t *pending, sigset_t *blocked, sigset_t *ignored);
|
|
|
|
/* Return the TGID of LWPID from /proc/pid/status. Returns -1 if not
|
|
found. */
|
|
extern int linux_proc_get_tgid (int lwpid);
|
|
|
|
/* linux-nat functions for handling fork events. */
|
|
extern void linux_enable_event_reporting (ptid_t ptid);
|
|
|
|
extern int lin_lwp_attach_lwp (ptid_t ptid);
|
|
|
|
/* Iterator function for lin-lwp's lwp list. */
|
|
struct lwp_info *iterate_over_lwps (ptid_t filter,
|
|
int (*callback) (struct lwp_info *,
|
|
void *),
|
|
void *data);
|
|
|
|
/* Create a prototype generic GNU/Linux target. The client can
|
|
override it with local methods. */
|
|
struct target_ops * linux_target (void);
|
|
|
|
/* Create a generic GNU/Linux target using traditional
|
|
ptrace register access. */
|
|
struct target_ops *
|
|
linux_trad_target (CORE_ADDR (*register_u_offset)(struct gdbarch *, int, int));
|
|
|
|
/* Register the customized GNU/Linux target. This should be used
|
|
instead of calling add_target directly. */
|
|
void linux_nat_add_target (struct target_ops *);
|
|
|
|
/* Register a method to call whenever a new thread is attached. */
|
|
void linux_nat_set_new_thread (struct target_ops *, void (*) (ptid_t));
|
|
|
|
/* Register a method that converts a siginfo object between the layout
|
|
that ptrace returns, and the layout in the architecture of the
|
|
inferior. */
|
|
void linux_nat_set_siginfo_fixup (struct target_ops *,
|
|
int (*) (struct siginfo *,
|
|
gdb_byte *,
|
|
int));
|
|
|
|
/* Update linux-nat internal state when changing from one fork
|
|
to another. */
|
|
void linux_nat_switch_fork (ptid_t new_ptid);
|
|
|
|
/* Return the saved siginfo associated with PTID. */
|
|
struct siginfo *linux_nat_get_siginfo (ptid_t ptid);
|