/*--------------------------------------------------------------------*/ /*--- Handle remote gdb protocol. pub_tool_gdbserver.h ---*/ /*--------------------------------------------------------------------*/ /* This file is part of Valgrind, a dynamic binary instrumentation framework. Copyright (C) 2011-2011 Philippe Waroquiers 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. The GNU General Public License is contained in the file COPYING. */ #ifndef __PUB_TOOL_GDBSERVER_H #define __PUB_TOOL_GDBSERVER_H #include "libvex.h" #include "libvex_ir.h" //-------------------------------------------------------------------- // PURPOSE: This module provides the support to have a gdb // connecting to a valgrind process using remote gdb protocol. It provides // * A function to allow a tool (or the valgrind core) to // wait for a gdb to connect and then handle gdb commands. // Typically, this can be used to let the user debug the process // when valgrind reports an error. // * A function allowing to instrument the code to support gdb breakpoints. // * A function allowing the tool to support watchpoints. // * A utility function to help implementing the processing of the // gdb_monitor_command strings. // Function to be used by tool or coregrind to allow a gdb to connect // to this process. // Calling VG_(gdbserver) with tid > 0 means to let a debugger attach // to the valgrind process. gdbserver will report to gdb that the // process stopped in thread tid. // tid == 0 indicates to stop gdbserver and report to gdb // that the valgrind-ified process has exited. //-------------------------------------------------------------------- extern void VG_(gdbserver) ( ThreadId tid ); /* VG_(dyn_vgdb_error) gets its initial value from VG_(clo_vgdb_error). It can be changed after initial command processing in order to enable/disable the call to VG_(gdbserver) in m_errormgr.c. The main reasons to change the below is either because the user updates it via a monitor command or to (temporarily) avoid calling gdbserver for error reporting during monitor command handling. */ extern Int VG_(dyn_vgdb_error); /* defines the various kinds of breakpoints that gdbserver might ask to insert/remove. Note that the below matches the gdbserver protocol definition. The level of support of the various breakpoint kinds depends on the tool. For the moment, it is unclear how a tool would implement hardware_breakpoint in valgrind :). software_breakpoint implies some (small) specific instrumentation to be done for gdbserver. This instrumentation is implemented for all tools in m_translate.c. write/read/access watchpoints can only be done by tools which are maintaining some notion of address accessibility as part of their instrumentation. watchpoints can then be done by marking the watched address(es) as not accessible. But instead of giving back an error (or whatever the tool wants to do with unaccessible mechanism), the tool must then just call gdbserver. See memcheck for an example of reusing accessibility for watchpoint support. */ typedef enum { software_breakpoint, hardware_breakpoint, write_watchpoint, read_watchpoint, access_watchpoint } PointKind; extern char* VG_(ppPointKind) (PointKind kind); /* watchpoint support --------------------------------------*/ /* True if one or more bytes in [addr, addr+len[ are being watched by gdbserver for write or read or access. In addition, VG_(is_watched) will invoke gdbserver if the access provided by the tool matches the watchpoint kind. For this, the tool must pass the kind of access it has detected: write_watchpoint indicates the tool has detected a write read_watchpoint indicates the tool has detected a read access_watchpoint indicates the tool has detected an access but does not know if this is a read or a write */ extern Bool VG_(is_watched)(PointKind kind, Addr addr, Int szB); extern void VG_(needs_watchpoint) ( // indicates the given Addr/len is being watched (insert) // or not watched anymore (! insert). // gdbserver will maintain the list of watched addresses. // The tool can use VG_(is_watched) to verify if an // access to an Addr is in one of the watched intervals. // Must return True if the watchpoint has been properly inserted or // removed. False if not supported. // Note that an address can only be watched for a single kind. // The tool must be ready to be called successively with // multiple kinds for the same addr and len and with // different kinds. The last kind must replace the previous values. // Behaviour with multiple watches having overlapping addr+len // is undefined. Bool (*watchpoint) (PointKind kind, Bool insert, Addr addr, SizeT len) ); // can be used during the processing of the VG_USERREQ__GDB_MONITOR_COMMAND // tool client request to output information to gdb or vgdb. extern UInt VG_(gdb_printf) ( const HChar *format, ... ) PRINTF_CHECK(1, 2); /* Utility functions to (e.g.) parse gdb monitor commands. keywords is a set of keywords separated by a space keyword_id will search for the keyword starting with the string input_word and return its position. It returns -1 if no keyword matches. It returns -2 if two or more keywords are starting with input_word and none of these matches exactly input_word Example with keywords = "hello world here is hell" : input_word result ---------- ------ paradise => -1 i => 3 hell => 4 hel => -2 ishtar => -1 report indicates when to output an error msg with VG_(gdb_printf). kwd_report_none : no error is reported. kwd_report_all : the error msg will show all possible keywords kwd_report_duplicated_matches : the error msg will show only the ambiguous matches. */ typedef enum { kwd_report_none, kwd_report_all, kwd_report_duplicated_matches } kwd_report_error; extern Int VG_(keyword_id) (Char* keywords, Char* input_word, kwd_report_error report); /* Extract an address and (optionally) a size from the string currently being parsed by strtok_r (see pub_tool_libcbase.h). If no size in the string, keeps the current value of szB. Returns address 0 and szB 0 if there is an error. Reports to the user problems via VG_(gdb_printf). */ extern void VG_(strtok_get_address_and_size) (Addr* address, SizeT* szB, Char **ssaveptr); #endif // __PUB_TOOL_GDBSERVER_H /*--------------------------------------------------------------------*/ /*--- end ---*/ /*--------------------------------------------------------------------*/