Initial python support.

gdb/
2008-08-06  Vladimir Prus  <vladimir@codesourcery.com>
	    Tom Tromey  <tromey@redhat.com>
	    Thiago Jung Bauermann  <bauerman@br.ibm.com>
	    Doug Evans  <dje@google.com>

	* Makefile.in (SUBDIR_PYTHON_OBS, SUBDIR_PYTHON_SRCS,
	SUBDIR_PYTHON_DEPS, SUBDIR_PYTHON_LDFLAGS, SUBDIR_PYTHON_CFLAGS,
	PYTHON_CFLAGS): New.
	(python_h, python_internal_h): New.
	(cli-script.o): Depend on python.h
	(python.o, python-utils.o): New.
	* cli/cli-script.c (print_command_lines): Handle python_control.
	(execute_control_command): Handle python_control.
	(execute_control_command_untraced): New function.
	(while_command): Call execute_control_command_untraced.
	(if_command): Likewise.
	(get_command_line): Remove static attribute.
	(read_next_line): Handle "python".
	(recurse_read_control_structure): Handle python_control.
	(read_command_lines): Handle python_control.
	Include python.h.
	* cli/cli-script.h (get_command_line): Add prototype.
	(execute_control_command_untraced): Likewise.
	* configure.ac: Add --with-python.
	* defs.h (enum command_control_type) <python_control>: New
	constant.
	* python/python-internal.h: New file.
	* python/python.c: New file.
	* python/python.h: New file.
	* python/python-utils.c: New file.
	* NEWS: Mention Python scripting support and its new commands.

gdb/doc/
2008-08-06  Tom Tromey  <tromey@redhat.com>

	* gdb.texinfo (Extending GDB): New chapter.
	(Sequences): Demoted chapter, now a section under the new
	Extending GDB chapter.
	(Python): New section.

gdb/testsuite/
2008-08-06  Tom Tromey  <tromey@redhat.com>

	* gdb.python/python.exp: New file.
This commit is contained in:
Thiago Jung Bauermann 2008-08-06 19:41:33 +00:00
parent 5141027dd0
commit d57a3c85f6
17 changed files with 1525 additions and 14 deletions

View File

@ -1,3 +1,35 @@
2008-08-06 Vladimir Prus <vladimir@codesourcery.com>
Tom Tromey <tromey@redhat.com>
Thiago Jung Bauermann <bauerman@br.ibm.com>
Doug Evans <dje@google.com>
* Makefile.in (SUBDIR_PYTHON_OBS, SUBDIR_PYTHON_SRCS,
SUBDIR_PYTHON_DEPS, SUBDIR_PYTHON_LDFLAGS, SUBDIR_PYTHON_CFLAGS,
PYTHON_CFLAGS): New.
(python_h, python_internal_h): New.
(cli-script.o): Depend on python.h
(python.o, python-utils.o): New.
* cli/cli-script.c (print_command_lines): Handle python_control.
(execute_control_command): Handle python_control.
(execute_control_command_untraced): New function.
(while_command): Call execute_control_command_untraced.
(if_command): Likewise.
(get_command_line): Remove static attribute.
(read_next_line): Handle "python".
(recurse_read_control_structure): Handle python_control.
(read_command_lines): Handle python_control.
Include python.h.
* cli/cli-script.h (get_command_line): Add prototype.
(execute_control_command_untraced): Likewise.
* configure.ac: Add --with-python.
* defs.h (enum command_control_type) <python_control>: New
constant.
* python/python-internal.h: New file.
* python/python.c: New file.
* python/python.h: New file.
* python/python-utils.c: New file.
* NEWS: Mention Python scripting support and its new commands.
2008-08-06 Ulrich Weigand <uweigand@de.ibm.com>
* spu-tdep.c (spu_gdbarch_init): Call set_gdbarch_frame_red_zone_size.

View File

@ -254,6 +254,19 @@ SUBDIR_TUI_LDFLAGS=
SUBDIR_TUI_CFLAGS= \
-DTUI=1
#
# python sub directory definitons
#
SUBDIR_PYTHON_OBS = \
python.o \
python-utils.o
SUBDIR_PYTHON_SRCS = \
python/python.c \
python/python-utils.c
SUBDIR_PYTHON_DEPS =
SUBDIR_PYTHON_LDFLAGS=
SUBDIR_PYTHON_CFLAGS=
# Opcodes currently live in one of two places. Either they are in the
# opcode library, typically ../opcodes, or they are in a header file
@ -951,6 +964,13 @@ tui_wingeneral_h = $(srcdir)/tui/tui-wingeneral.h
tui_win_h = $(srcdir)/tui/tui-win.h $(tui_data_h)
tui_winsource_h = $(srcdir)/tui/tui-winsource.h $(tui_data_h)
#
# gdb/python/ headers
#
python_h = $(srcdir)/python/python.h $(value_h)
python_internal_h = $(srcdir)/python/python-internal.h
# gdb/features preparsed descriptions
features_headers = $(defs_h) $(gdbtypes_h) $(target_descriptions_h)
arm_with_iwmmxt_c = $(srcdir)/features/arm-with-iwmmxt.c $(features_headers)
@ -3044,7 +3064,8 @@ cli-logging.o: $(srcdir)/cli/cli-logging.c $(defs_h) $(gdbcmd_h) $(ui_out_h) \
$(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/cli/cli-logging.c
cli-script.o: $(srcdir)/cli/cli-script.c $(defs_h) $(value_h) $(language_h) \
$(ui_out_h) $(gdb_string_h) $(exceptions_h) $(top_h) $(cli_cmds_h) \
$(cli_decode_h) $(cli_script_h) $(gdb_assert_h) $(breakpoint_h)
$(cli_decode_h) $(cli_script_h) $(gdb_assert_h) $(breakpoint_h) \
$(python_h)
$(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/cli/cli-script.c
cli-setshow.o: $(srcdir)/cli/cli-setshow.c $(defs_h) $(readline_tilde_h) \
$(value_h) $(gdb_string_h) $(ui_out_h) $(cli_decode_h) $(cli_cmds_h) \
@ -3372,4 +3393,22 @@ tui-winsource.o: $(srcdir)/tui/tui-winsource.c $(defs_h) $(symtab_h) \
$(gdb_curses_h) $(gdb_assert_h)
$(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/tui/tui-winsource.c
#
# gdb/python/ dependencies
#
# Need to explicitly specify the compile rule as make will do nothing
# or try to compile the object file into the sub-directory.
# Flags needed to compile Python code
PYTHON_CFLAGS=@PYTHON_CFLAGS@
python.o: $(srcdir)/python/python.c $(defs_h) $(python_h) \
$(command_h) $(libiberty_h) $(cli_decode_h) $(charset_h) $(top_h) \
$(exceptions_h) $(python_internal_h) $(version_h) $(cli_script_h) \
$(ui_out_h) $(target_h) $(gdbthread_h)
$(CC) -c $(INTERNAL_CFLAGS) $(PYTHON_CFLAGS) $(srcdir)/python/python.c
python-utils.o: $(srcdir)/python/python-utils.c $(defs_h) $(python_internal_h)
$(CC) -c $(INTERNAL_CFLAGS) $(PYTHON_CFLAGS) \
$(srcdir)/python/python-utils.c -o python-utils.o
### end of the gdb Makefile.in.

View File

@ -62,12 +62,24 @@ have also been fixed.
gdbserver executable to debug both 32-bit and 64-bit programs.
(This requires gdbserver itself to be built as a 64-bit executable.)
* Python scripting
GDB now has support for scripting using Python. Whether this is
available is determined at configure time.
* New commands
find [/size-char] [/max-count] start-address, end-address|+search-space-size,
val1 [, val2, ...]
Search memory for a sequence of bytes.
maint set python print-stack
maint show python print-stack
Show a stack trace when an error is encountered in a Python script.
python [CODE]
Invoke CODE by passing it to the Python interpreter.
set print symbol-loading
show print symbol-loading
Control printing of symbol loading messages.

View File

@ -34,6 +34,8 @@
#include "cli/cli-script.h"
#include "gdb_assert.h"
#include "python/python.h"
/* Prototypes for local functions */
static enum command_control_type
@ -102,7 +104,7 @@ build_command_line (enum command_control_type type, char *args)
/* Build and return a new command structure for the control commands
such as "if" and "while". */
static struct command_line *
struct command_line *
get_command_line (enum command_control_type type, char *arg)
{
struct command_line *cmd;
@ -225,6 +227,20 @@ print_command_lines (struct ui_out *uiout, struct command_line *cmd,
continue;
}
if (list->control_type == python_control)
{
ui_out_field_string (uiout, NULL, "python");
ui_out_text (uiout, "\n");
/* Don't indent python code at all. */
print_command_lines (uiout, *list->body_list, 0);
if (depth)
ui_out_spaces (uiout, 2 * depth);
ui_out_field_string (uiout, NULL, "end");
ui_out_text (uiout, "\n");
list = list->next;
continue;
}
/* ignore illegal command type and try next */
list = list->next;
} /* while (list) */
@ -527,6 +543,12 @@ execute_control_command (struct command_line *cmd)
ret = commands_from_control_command (new_line, cmd);
break;
}
case python_control:
{
eval_python_from_control_command (cmd);
ret = simple_control;
break;
}
default:
warning (_("Invalid control type in canned commands structure."));
@ -538,6 +560,17 @@ execute_control_command (struct command_line *cmd)
return ret;
}
/* Like execute_control_command, but first set
suppress_next_print_command_trace. */
enum command_control_type
execute_control_command_untraced (struct command_line *cmd)
{
suppress_next_print_command_trace = 1;
return execute_control_command (cmd);
}
/* "while" command support. Executes a body of statements while the
loop condition is nonzero. */
@ -552,8 +585,7 @@ while_command (char *arg, int from_tty)
if (command == NULL)
return;
suppress_next_print_command_trace = 1;
execute_control_command (command);
execute_control_command_untraced (command);
free_command_lines (&command);
}
@ -571,8 +603,7 @@ if_command (char *arg, int from_tty)
if (command == NULL)
return;
suppress_next_print_command_trace = 1;
execute_control_command (command);
execute_control_command_untraced (command);
free_command_lines (&command);
}
@ -886,6 +917,12 @@ read_next_line (struct command_line **command)
first_arg++;
*command = build_command_line (commands_control, first_arg);
}
else if (p1 - p == 6 && !strncmp (p, "python", 6))
{
/* Note that we ignore the inline "python command" form
here. */
*command = build_command_line (python_control, "");
}
else if (p1 - p == 10 && !strncmp (p, "loop_break", 10))
{
*command = (struct command_line *)
@ -962,6 +999,7 @@ recurse_read_control_structure (struct command_line *current_cmd)
{
if (current_cmd->control_type == while_control
|| current_cmd->control_type == if_control
|| current_cmd->control_type == python_control
|| current_cmd->control_type == commands_control)
{
/* Success reading an entire canned sequence of commands. */
@ -1013,6 +1051,7 @@ recurse_read_control_structure (struct command_line *current_cmd)
on it. */
if (next->control_type == while_control
|| next->control_type == if_control
|| next->control_type == python_control
|| next->control_type == commands_control)
{
control_level++;
@ -1086,6 +1125,7 @@ read_command_lines (char *prompt_arg, int from_tty)
if (next->control_type == while_control
|| next->control_type == if_control
|| next->control_type == python_control
|| next->control_type == commands_control)
{
control_level++;

View File

@ -40,6 +40,12 @@ extern void show_user_1 (struct cmd_list_element *c, struct ui_file *stream);
extern enum command_control_type
execute_control_command (struct command_line *cmd);
extern enum command_control_type
execute_control_command_untraced (struct command_line *cmd);
extern struct command_line *get_command_line (enum command_control_type,
char *);
extern void print_command_lines (struct ui_out *,
struct command_line *, unsigned int);

View File

@ -184,6 +184,15 @@
/* Define to 1 if you have the `m' library (-lm). */
#undef HAVE_LIBM
/* Define if Python 2.4 is being used. */
#undef HAVE_LIBPYTHON2_4
/* Define if Python 2.5 is being used. */
#undef HAVE_LIBPYTHON2_5
/* Define if Python 2.6 is being used. */
#undef HAVE_LIBPYTHON2_6
/* Define if libunwind library is being used. */
#undef HAVE_LIBUNWIND
@ -307,6 +316,9 @@
/* Define if sys/ptrace.h defines the PT_GETXMMREGS request. */
#undef HAVE_PT_GETXMMREGS
/* Define if Python interpreter is being linked in. */
#undef HAVE_PYTHON
/* Define to 1 if you have the `realpath' function. */
#undef HAVE_REALPATH

358
gdb/configure vendored
View File

@ -314,7 +314,7 @@ ac_subdirs_all="$ac_subdirs_all doc testsuite"
ac_subdirs_all="$ac_subdirs_all gdbtk"
ac_subdirs_all="$ac_subdirs_all multi-ice"
ac_subdirs_all="$ac_subdirs_all gdbserver"
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags nm_h LIBICONV LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS'
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags nm_h LIBICONV LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS'
ac_subst_files='host_makefile_frag'
ac_pwd=`pwd`
@ -890,6 +890,7 @@ Optional Packages:
--with-gnu-ld assume the C compiler uses GNU ld default=no
--with-libexpat-prefix[=DIR] search for libexpat in DIR/include and DIR/lib
--without-libexpat-prefix don't search for libexpat in includedir and libdir
--with-python include python support (auto/yes/no/<path>)
--without-included-regex don't use included regex; this is the default
on systems with version 2 of the GNU C library
(use with caution on other system)
@ -11197,6 +11198,358 @@ done
fi
fi
# Check whether --with-python or --without-python was given.
if test "${with_python+set}" = set; then
withval="$with_python"
else
with_python=auto
fi;
echo "$as_me:$LINENO: checking whether to use python" >&5
echo $ECHO_N "checking whether to use python... $ECHO_C" >&6
echo "$as_me:$LINENO: result: $with_python" >&5
echo "${ECHO_T}$with_python" >&6
if test "${with_python}" = no; then
{ echo "$as_me:$LINENO: WARNING: python support disabled; some features may be unavailable." >&5
echo "$as_me: WARNING: python support disabled; some features may be unavailable." >&2;}
have_libpython=no
else
case "${with_python}" in
yes | auto)
# Leave as empty, use defaults.
python_includes=
python_libs=
;;
/*)
python_includes="-I${with_python}/include"
python_libs="-L${with_python}/lib"
;;
*)
{ { echo "$as_me:$LINENO: error: invalid value for --with-python" >&5
echo "$as_me: error: invalid value for --with-python" >&2;}
{ (exit 1); exit 1; }; }
;;
esac
save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS ${python_includes}"
save_LIBS=$LIBS
LIBS="$LIBS ${python_libs}"
have_libpython=no
if test "${have_libpython}" = no; then
version=python2.6
HAVE_LIBPYTHON2_6=no
echo "$as_me:$LINENO: checking for ${version}" >&5
echo $ECHO_N "checking for ${version}... $ECHO_C" >&6
save_LIBS=$LIBS
LIBS="$LIBS -l${version}"
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include "${version}/Python.h"
int
main ()
{
Py_Initialize ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
HAVE_LIBPYTHON2_6=yes
have_libpython=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
LIBS=$save_LIBS
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
echo "$as_me:$LINENO: result: $HAVE_LIBPYTHON2_6" >&5
echo "${ECHO_T}$HAVE_LIBPYTHON2_6" >&6
if test "${HAVE_LIBPYTHON2_6}" = yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_LIBPYTHON2_6 1
_ACEOF
fi
fi
if test ${have_libpython} = no; then
version=python2.5
HAVE_LIBPYTHON2_5=no
echo "$as_me:$LINENO: checking for ${version}" >&5
echo $ECHO_N "checking for ${version}... $ECHO_C" >&6
save_LIBS=$LIBS
LIBS="$LIBS -l${version}"
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include "${version}/Python.h"
int
main ()
{
Py_Initialize ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
HAVE_LIBPYTHON2_5=yes
have_libpython=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
LIBS=$save_LIBS
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
echo "$as_me:$LINENO: result: $HAVE_LIBPYTHON2_5" >&5
echo "${ECHO_T}$HAVE_LIBPYTHON2_5" >&6
if test "${HAVE_LIBPYTHON2_5}" = yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_LIBPYTHON2_5 1
_ACEOF
fi
fi
if test ${have_libpython} = no; then
version=python2.4
HAVE_LIBPYTHON2_4=no
echo "$as_me:$LINENO: checking for ${version}" >&5
echo $ECHO_N "checking for ${version}... $ECHO_C" >&6
save_LIBS=$LIBS
LIBS="$LIBS -l${version}"
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include "${version}/Python.h"
int
main ()
{
Py_Initialize ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
(eval $ac_link) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest$ac_exeext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
HAVE_LIBPYTHON2_4=yes
have_libpython=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
LIBS=$save_LIBS
fi
rm -f conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
echo "$as_me:$LINENO: result: $HAVE_LIBPYTHON2_4" >&5
echo "${ECHO_T}$HAVE_LIBPYTHON2_4" >&6
if test "${HAVE_LIBPYTHON2_4}" = yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_LIBPYTHON2_4 1
_ACEOF
fi
fi
if test ${have_libpython} = no; then
case "${with_python}" in
yes)
{ { echo "$as_me:$LINENO: error: python is missing or unusable" >&5
echo "$as_me: error: python is missing or unusable" >&2;}
{ (exit 1); exit 1; }; }
;;
auto)
{ echo "$as_me:$LINENO: WARNING: python is missing or unusable; some features may be unavailable." >&5
echo "$as_me: WARNING: python is missing or unusable; some features may be unavailable." >&2;}
;;
*)
{ { echo "$as_me:$LINENO: error: no usable python found at ${with_python}" >&5
echo "$as_me: error: no usable python found at ${with_python}" >&2;}
{ (exit 1); exit 1; }; }
;;
esac
CPPFLAGS=$save_CPPFLAGS
LIBS=$save_LIBS
fi
fi
if test "${have_libpython}" = yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_PYTHON 1
_ACEOF
CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_PYTHON_OBS)"
CONFIG_DEPS="$CONFIG_DEPS \$(SUBDIR_PYTHON_DEPS)"
CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_PYTHON_SRCS)"
ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)"
# Flags needed to compile Python code (taken from python-config --cflags).
# We cannot call python-config directly because it will output whatever was
# used when compiling the Python interpreter itself, including flags which
# would make the python-related objects be compiled differently from the
# rest of GDB (e.g., -O2 and -fPIC).
if test "${GCC}" = yes; then
tentative_python_cflags="-fno-strict-aliasing -DNDEBUG -fwrapv"
fi
if test "x${tentative_python_cflags}" != x; then
echo "$as_me:$LINENO: checking compiler flags for python code" >&5
echo $ECHO_N "checking compiler flags for python code... $ECHO_C" >&6
for flag in ${tentative_python_cflags}; do
# Check that the compiler accepts it
saved_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $flag"
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
PYTHON_CFLAGS="${PYTHON_CFLAGS} $flag"
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
CFLAGS="$saved_CFLAGS"
done
echo "$as_me:$LINENO: result: ${PYTHON_CFLAGS}" >&5
echo "${ECHO_T}${PYTHON_CFLAGS}" >&6
fi
else
# Even if Python support is not compiled in, we need to have this file
# included in order to recognize the GDB command "python".
CONFIG_OBS="$CONFIG_OBS python.o"
CONFIG_SRCS="$CONFIG_SRCS python/python.c"
fi
# ------------------------- #
# Checks for header files. #
# ------------------------- #
@ -26284,7 +26637,7 @@ s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
s,@INSTALL_DATA@,$INSTALL_DATA,;t t
s,@CYGPATH_W@,$CYGPATH_W,;t t
s,@VERSION@,$VERSION,;t t
s,@PYTHON2_4@,$PYTHON2_4,;t t
s,@ACLOCAL@,$ACLOCAL,;t t
s,@AUTOCONF@,$AUTOCONF,;t t
s,@AUTOMAKE@,$AUTOMAKE,;t t
@ -26331,6 +26684,7 @@ s,@READLINE_CFLAGS@,$READLINE_CFLAGS,;t t
s,@HAVE_LIBEXPAT@,$HAVE_LIBEXPAT,;t t
s,@LIBEXPAT@,$LIBEXPAT,;t t
s,@LTLIBEXPAT@,$LTLIBEXPAT,;t t
s,@PYTHON_CFLAGS@,$PYTHON_CFLAGS,;t t
s,@ALLOCA@,$ALLOCA,;t t
s,@CONFIG_LDFLAGS@,$CONFIG_LDFLAGS,;t t
s,@TARGET_SYSTEM_ROOT@,$TARGET_SYSTEM_ROOT,;t t

View File

@ -497,6 +497,125 @@ else
fi
fi
dnl Utility to simplify finding libpython.
AC_DEFUN([AC_TRY_LIBPYTHON],
[
version=$1
define([have_libpython_var],$2)
define([VERSION],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
[HAVE_LIB]VERSION=no
AC_MSG_CHECKING([for ${version}])
save_LIBS=$LIBS
LIBS="$LIBS -l${version}"
AC_LINK_IFELSE(AC_LANG_PROGRAM([[#include "${version}/Python.h"]],
[[Py_Initialize ();]]),
[[HAVE_LIB]VERSION=yes
have_libpython_var=yes],
[LIBS=$save_LIBS])
AC_MSG_RESULT([$[HAVE_LIB]VERSION])
])
AC_ARG_WITH(python,
AS_HELP_STRING([--with-python], [include python support (auto/yes/no/<path>)]),
[], [with_python=auto])
AC_MSG_CHECKING([whether to use python])
AC_MSG_RESULT([$with_python])
if test "${with_python}" = no; then
AC_MSG_WARN([python support disabled; some features may be unavailable.])
have_libpython=no
else
case "${with_python}" in
yes | auto)
# Leave as empty, use defaults.
python_includes=
python_libs=
;;
/*)
python_includes="-I${with_python}/include"
python_libs="-L${with_python}/lib"
;;
*)
AC_ERROR(invalid value for --with-python)
;;
esac
save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS ${python_includes}"
save_LIBS=$LIBS
LIBS="$LIBS ${python_libs}"
have_libpython=no
if test "${have_libpython}" = no; then
AC_TRY_LIBPYTHON(python2.6, have_libpython)
if test "${HAVE_LIBPYTHON2_6}" = yes; then
AC_DEFINE(HAVE_LIBPYTHON2_6, 1, [Define if Python 2.6 is being used.])
fi
fi
if test ${have_libpython} = no; then
AC_TRY_LIBPYTHON(python2.5, have_libpython)
if test "${HAVE_LIBPYTHON2_5}" = yes; then
AC_DEFINE(HAVE_LIBPYTHON2_5, 1, [Define if Python 2.5 is being used.])
fi
fi
if test ${have_libpython} = no; then
AC_TRY_LIBPYTHON(python2.4, have_libpython)
if test "${HAVE_LIBPYTHON2_4}" = yes; then
AC_DEFINE(HAVE_LIBPYTHON2_4, 1, [Define if Python 2.4 is being used.])
fi
fi
if test ${have_libpython} = no; then
case "${with_python}" in
yes)
AC_MSG_ERROR([python is missing or unusable])
;;
auto)
AC_MSG_WARN([python is missing or unusable; some features may be unavailable.])
;;
*)
AC_MSG_ERROR([no usable python found at ${with_python}])
;;
esac
CPPFLAGS=$save_CPPFLAGS
LIBS=$save_LIBS
fi
fi
if test "${have_libpython}" = yes; then
AC_DEFINE(HAVE_PYTHON, 1, [Define if Python interpreter is being linked in.])
CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_PYTHON_OBS)"
CONFIG_DEPS="$CONFIG_DEPS \$(SUBDIR_PYTHON_DEPS)"
CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_PYTHON_SRCS)"
ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)"
# Flags needed to compile Python code (taken from python-config --cflags).
# We cannot call python-config directly because it will output whatever was
# used when compiling the Python interpreter itself, including flags which
# would make the python-related objects be compiled differently from the
# rest of GDB (e.g., -O2 and -fPIC).
if test "${GCC}" = yes; then
tentative_python_cflags="-fno-strict-aliasing -DNDEBUG -fwrapv"
fi
if test "x${tentative_python_cflags}" != x; then
AC_MSG_CHECKING(compiler flags for python code)
for flag in ${tentative_python_cflags}; do
# Check that the compiler accepts it
saved_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $flag"
AC_TRY_COMPILE([],[],PYTHON_CFLAGS="${PYTHON_CFLAGS} $flag",)
CFLAGS="$saved_CFLAGS"
done
AC_MSG_RESULT(${PYTHON_CFLAGS})
fi
else
# Even if Python support is not compiled in, we need to have this file
# included in order to recognize the GDB command "python".
CONFIG_OBS="$CONFIG_OBS python.o"
CONFIG_SRCS="$CONFIG_SRCS python/python.c"
fi
AC_SUBST(PYTHON_CFLAGS)
# ------------------------- #
# Checks for header files. #
# ------------------------- #

View File

@ -652,6 +652,7 @@ enum command_control_type
while_control,
if_control,
commands_control,
python_control,
invalid_control
};

View File

@ -1,3 +1,10 @@
2008-08-06 Tom Tromey <tromey@redhat.com>
* gdb.texinfo (Extending GDB): New chapter.
(Sequences): Demoted chapter, now a section under the new
Extending GDB chapter.
(Python): New section.
2008-07-31 Stan Shebs <stan@codesourcery.com>
* gdbint.texinfo: Remove FUNCTION_EPILOGUE_SIZE.

View File

@ -159,7 +159,7 @@ software in general. We will miss him.
* Remote Debugging:: Debugging remote programs
* Configurations:: Configuration-specific information
* Controlling GDB:: Controlling @value{GDBN}
* Sequences:: Canned sequences of commands
* Extending GDB:: Extending @value{GDBN}
* Interpreters:: Command Interpreters
* TUI:: @value{GDBN} Text User Interface
* Emacs:: Using @value{GDBN} under @sc{gnu} Emacs
@ -16845,8 +16845,21 @@ Turns on or off debugging messages for built-in XML parsers.
Displays the current state of XML debugging messages.
@end table
@node Extending GDB
@chapter Extending @value{GDBN}
@cindex extending GDB
@value{GDBN} provides two mechanisms for extension. The first is based
on composition of @value{GDBN} commands, and the second is based on the
Python scripting language.
@menu
* Sequences:: Canned Sequences of Commands
* Python:: Scripting @value{GDBN} using Python
@end menu
@node Sequences
@chapter Canned Sequences of Commands
@section Canned Sequences of Commands
Aside from breakpoint commands (@pxref{Break Commands, ,Breakpoint
Command Lists}), @value{GDBN} provides two ways to store sequences of
@ -16861,7 +16874,7 @@ files.
@end menu
@node Define
@section User-defined Commands
@subsection User-defined Commands
@cindex user-defined command
@cindex arguments, to user-defined commands
@ -16973,7 +16986,7 @@ commands that normally print messages to say what they are doing omit the
messages when used in a user-defined command.
@node Hooks
@section User-defined Command Hooks
@subsection User-defined Command Hooks
@cindex command hooks
@cindex hooks, for commands
@cindex hooks, pre-command
@ -17054,7 +17067,7 @@ If you try to define a hook which does not match any known command, you
get a warning from the @code{define} command.
@node Command Files
@section Command Files
@subsection Command Files
@cindex command files
@cindex scripting commands
@ -17158,7 +17171,7 @@ Terminate the block of commands that are the body of @code{if},
@node Output
@section Commands for Controlled Output
@subsection Commands for Controlled Output
During the execution of a command file or a user-defined command, normal
@value{GDBN} output is suppressed; the only output that appears is what is
@ -17305,6 +17318,159 @@ printf "D32: %Hf - D64: %Df - D128: %DDf\n",1.2345df,1.2E10dd,1.2E1dl
@end table
@node Python
@section Scripting @value{GDBN} using Python
@cindex python scripting
@cindex scripting with python
You can script @value{GDBN} using the @uref{http://www.python.org/,
Python programming language}. This feature is available only if
@value{GDBN} was configured using @option{--with-python}.
@menu
* Python Commands:: Accessing Python from @value{GDBN}.
* Python API:: Accessing @value{GDBN} from Python.
@end menu
@node Python Commands
@subsection Python Commands
@cindex python commands
@cindex commands to access python
@value{GDBN} provides one command for accessing the Python interpreter,
and one related setting:
@table @code
@kindex python
@item python @r{[}@var{code}@r{]}
The @code{python} command can be used to evaluate Python code.
If given an argument, the @code{python} command will evaluate the
argument as a Python command. For example:
@smallexample
(@value{GDBP}) python print 23
23
@end smallexample
If you do not provide an argument to @code{python}, it will act as a
multi-line command, like @code{define}. In this case, the Python
script is made up of subsequent command lines, given after the
@code{python} command. This command list is terminated using a line
containing @code{end}. For example:
@smallexample
(@value{GDBP}) python
Type python script
End with a line saying just "end".
>print 23
>end
23
@end smallexample
@kindex maint set python print-stack
@item maint set python print-stack
By default, @value{GDBN} will print a stack trace when an error occurs
in a Python script. This can be controlled using @code{maint set
python print-stack}: if @code{on}, the default, then Python stack
printing is enabled; if @code{off}, then Python stack printing is
disabled.
@end table
@node Python API
@subsection Python API
@cindex python api
@cindex programming in python
@cindex python stdout
@cindex python pagination
At startup, @value{GDBN} overrides Python's @code{sys.stdout} and
@code{sys.stderr} to print using @value{GDBN}'s output-paging streams.
A Python program which outputs to one of these streams may have its
output interrupted by the user (@pxref{Screen Size}). In this
situation, a Python @code{KeyboardInterrupt} exception is thrown.
@menu
* Basic Python:: Basic Python Functions.
* Exception Handling::
@end menu
@node Basic Python
@subsubsection Basic Python
@cindex python functions
@cindex python module
@cindex gdb module
@value{GDBN} introduces a new Python module, named @code{gdb}. All
methods and classes added by @value{GDBN} are placed in this module.
@value{GDBN} automatically @code{import}s the @code{gdb} module for
use in all scripts evaluated by the @code{python} command.
@findex gdb.execute
@defun execute command
Evaluate @var{command}, a string, as a @value{GDBN} CLI command.
If a GDB exception happens while @var{command} runs, it is
translated as described in @ref{Exception Handling,,Exception Handling}.
If no exceptions occur, this function returns @code{None}.
@end defun
@findex gdb.get_parameter
@defun get_parameter parameter
Return the value of a @value{GDBN} parameter. @var{parameter} is a
string naming the parameter to look up; @var{parameter} may contain
spaces if the parameter has a multi-part name. For example,
@samp{print object} is a valid parameter name.
If the named parameter does not exist, this function throws a
@code{RuntimeError}. Otherwise, the parameter's value is converted to
a Python value of the appropriate type, and returned.
@end defun
@findex gdb.write
@defun write string
Print a string to @value{GDBN}'s paginated standard output stream.
Writing to @code{sys.stdout} or @code{sys.stderr} will automatically
call this function.
@end defun
@findex gdb.flush
@defun flush
Flush @value{GDBN}'s paginated standard output stream. Flushing
@code{sys.stdout} or @code{sys.stderr} will automatically call this
function.
@end defun
@node Exception Handling
@subsubsection Exception Handling
@cindex python exceptions
@cindex exceptions, python
When executing the @code{python} command, Python exceptions
uncaught within the Python code are translated to calls to
@value{GDBN} error-reporting mechanism. If the command that called
@code{python} does not handle the error, @value{GDBN} will
terminate it and print an error message containing the Python
exception name, the associated value, and the Python call stack
backtrace at the point where the exception was raised. Example:
@smallexample
(@value{GDBP}) python print foo
Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: name 'foo' is not defined
@end smallexample
@value{GDBN} errors that happen in @value{GDBN} commands invoked by Python
code are converted to Python @code{RuntimeError} exceptions. User
interrupt (via @kbd{C-c} or by typing @kbd{q} at a pagination
prompt) is translated to a Python @code{KeyboardInterrupt}
exception. If you catch these exceptions in your Python code, your
exception handler will see @code{RuntimeError} or
@code{KeyboardInterrupt} as the exception type, the @value{GDBN} error
message as its value, and the Python call stack backtrace at the
Python statement closest to where the @value{GDBN} error occured as the
traceback.
@node Interpreters
@chapter Command Interpreters
@cindex command interpreters

View File

@ -0,0 +1,71 @@
/* Gdb/Python header for private use by Python module.
Copyright (C) 2008 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/>. */
#ifndef GDB_PYTHON_INTERNAL_H
#define GDB_PYTHON_INTERNAL_H
/* Python 2.4 doesn't include stdint.h soon enough to get {u,}intptr_t
needed by pyport.h. */
#include <stdint.h>
/* /usr/include/features.h on linux systems will define _POSIX_C_SOURCE
if it sees _GNU_SOURCE (which config.h will define).
pyconfig.h defines _POSIX_C_SOURCE to a different value than
/usr/include/features.h does causing compilation to fail.
To work around this, undef _POSIX_C_SOURCE before we include Python.h. */
#undef _POSIX_C_SOURCE
#if HAVE_LIBPYTHON2_4
#include "python2.4/Python.h"
/* Py_ssize_t is not defined until 2.5. */
typedef Py_intptr_t Py_ssize_t;
#elif HAVE_LIBPYTHON2_5
#include "python2.5/Python.h"
#elif HAVE_LIBPYTHON2_6
#include "python2.6/Python.h"
#else
#error "Unable to find usable Python.h"
#endif
struct block;
struct symbol;
struct symtab_and_line;
extern PyObject *gdb_module;
struct cleanup *make_cleanup_py_decref (PyObject *py);
/* Use this after a TRY_EXCEPT to throw the appropriate Python
exception. */
#define GDB_PY_HANDLE_EXCEPTION(Exception) \
do { \
if (Exception.reason < 0) \
return PyErr_Format (Exception.reason == RETURN_QUIT \
? PyExc_KeyboardInterrupt : PyExc_RuntimeError, \
"%s", Exception.message); \
} while (0)
void gdbpy_print_stack (void);
PyObject *python_string_to_unicode (PyObject *obj);
char *unicode_to_target_string (PyObject *unicode_str);
char *python_string_to_target_string (PyObject *obj);
#endif /* GDB_PYTHON_INTERNAL_H */

117
gdb/python/python-utils.c Normal file
View File

@ -0,0 +1,117 @@
/* General utility routines for GDB/Python.
Copyright (C) 2008 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 "defs.h"
#include "charset.h"
#include "python-internal.h"
/* This is a cleanup function which decrements the refcount on a
Python object. */
static void
py_decref (void *p)
{
PyObject *py = p;
/* Note that we need the extra braces in this 'if' to avoid a
warning from gcc. */
if (py)
{
Py_DECREF (py);
}
}
/* Return a new cleanup which will decrement the Python object's
refcount when run. */
struct cleanup *
make_cleanup_py_decref (PyObject *py)
{
return make_cleanup (py_decref, (void *) py);
}
/* Converts a Python 8-bit string to a unicode string object. Assumes the
8-bit string is in the host charset. If an error occurs during conversion,
returns NULL with a python exception set.
As an added bonus, the functions accepts a unicode string and returns it
right away, so callers don't need to check which kind of string they've
got.
If the given object is not one of the mentioned string types, NULL is
returned, with the TypeError python exception set. */
PyObject *
python_string_to_unicode (PyObject *obj)
{
PyObject *unicode_str;
/* If obj is already a unicode string, just return it.
I wish life was always that simple... */
if (PyUnicode_Check (obj))
unicode_str = obj;
else if (PyString_Check (obj))
unicode_str = PyUnicode_FromEncodedObject (obj, host_charset (), NULL);
else
{
PyErr_SetString (PyExc_TypeError,
_("Expected a string or unicode object."));
unicode_str = NULL;
}
return unicode_str;
}
/* Returns a newly allocated string with the contents of the given unicode
string object converted to the target's charset. If an error occurs during
the conversion, NULL will be returned and a python exception will be set.
The caller is responsible for xfree'ing the string. */
char *
unicode_to_target_string (PyObject *unicode_str)
{
char *target_string;
PyObject *string;
/* Translate string to target's charset. */
string = PyUnicode_AsEncodedString (unicode_str, target_charset (), NULL);
if (string == NULL)
return NULL;
target_string = xstrdup (PyString_AsString (string));
Py_DECREF (string);
return target_string;
}
/* Converts a python string (8-bit or unicode) to a target string in
the target's charset. Returns NULL on error, with a python exception set.
The caller is responsible for xfree'ing the string. */
char *
python_string_to_target_string (PyObject *obj)
{
PyObject *str;
str = python_string_to_unicode (obj);
if (str == NULL)
return NULL;
return unicode_to_target_string (str);
}

438
gdb/python/python.c Normal file
View File

@ -0,0 +1,438 @@
/* General python/gdb code
Copyright (C) 2008 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 "defs.h"
#include "command.h"
#include "ui-out.h"
#include "cli/cli-script.h"
#include "gdbcmd.h"
#include <ctype.h>
/* True if we should print the stack when catching a Python error,
false otherwise. */
static int gdbpy_should_print_stack = 1;
#ifdef HAVE_PYTHON
#include "python.h"
#include "libiberty.h"
#include "cli/cli-decode.h"
#include "charset.h"
#include "top.h"
#include "exceptions.h"
#include "python-internal.h"
#include "version.h"
#include "target.h"
#include "gdbthread.h"
PyObject *gdb_module;
static PyObject *get_parameter (PyObject *, PyObject *);
static PyObject *execute_gdb_command (PyObject *, PyObject *);
static PyObject *gdbpy_write (PyObject *, PyObject *);
static PyObject *gdbpy_flush (PyObject *, PyObject *);
static PyMethodDef GdbMethods[] =
{
{ "execute", execute_gdb_command, METH_VARARGS,
"Execute a gdb command" },
{ "get_parameter", get_parameter, METH_VARARGS,
"Return a gdb parameter's value" },
{ "write", gdbpy_write, METH_VARARGS,
"Write a string using gdb's filtered stream." },
{ "flush", gdbpy_flush, METH_NOARGS,
"Flush gdb's filtered stdout stream." },
{NULL, NULL, 0, NULL}
};
/* Given a command_line, return a command string suitable for passing
to Python. Lines in the string are separated by newlines. The
return value is allocated using xmalloc and the caller is
responsible for freeing it. */
static char *
compute_python_string (struct command_line *l)
{
struct command_line *iter;
char *script = NULL;
int size = 0;
int here;
for (iter = l; iter; iter = iter->next)
size += strlen (iter->line) + 1;
script = xmalloc (size + 1);
here = 0;
for (iter = l; iter; iter = iter->next)
{
int len = strlen (iter->line);
strcpy (&script[here], iter->line);
here += len;
script[here++] = '\n';
}
script[here] = '\0';
return script;
}
/* Take a command line structure representing a 'python' command, and
evaluate its body using the Python interpreter. */
void
eval_python_from_control_command (struct command_line *cmd)
{
char *script;
if (cmd->body_count != 1)
error (_("Invalid \"python\" block structure."));
script = compute_python_string (cmd->body_list[0]);
PyRun_SimpleString (script);
xfree (script);
if (PyErr_Occurred ())
{
gdbpy_print_stack ();
error (_("error while executing Python code"));
}
}
/* Implementation of the gdb "python" command. */
static void
python_command (char *arg, int from_tty)
{
while (arg && *arg && isspace (*arg))
++arg;
if (arg && *arg)
{
PyRun_SimpleString (arg);
if (PyErr_Occurred ())
{
gdbpy_print_stack ();
error (_("error while executing Python code"));
}
}
else
{
struct command_line *l = get_command_line (python_control, "");
struct cleanup *cleanups = make_cleanup_free_command_lines (&l);
execute_control_command_untraced (l);
do_cleanups (cleanups);
}
}
/* Transform a gdb parameters's value into a Python value. May return
NULL (and set a Python exception) on error. Helper function for
get_parameter. */
static PyObject *
parameter_to_python (struct cmd_list_element *cmd)
{
switch (cmd->var_type)
{
case var_string:
case var_string_noescape:
case var_optional_filename:
case var_filename:
case var_enum:
{
char *str = * (char **) cmd->var;
if (! str)
str = "";
return PyString_Decode (str, strlen (str), host_charset (), NULL);
}
case var_boolean:
{
if (* (int *) cmd->var)
Py_RETURN_TRUE;
else
Py_RETURN_FALSE;
}
case var_auto_boolean:
{
enum auto_boolean ab = * (enum auto_boolean *) cmd->var;
if (ab == AUTO_BOOLEAN_TRUE)
Py_RETURN_TRUE;
else if (ab == AUTO_BOOLEAN_FALSE)
Py_RETURN_FALSE;
else
Py_RETURN_NONE;
}
case var_integer:
if ((* (int *) cmd->var) == INT_MAX)
Py_RETURN_NONE;
/* Fall through. */
case var_zinteger:
return PyLong_FromLong (* (int *) cmd->var);
case var_uinteger:
{
unsigned int val = * (unsigned int *) cmd->var;
if (val == UINT_MAX)
Py_RETURN_NONE;
return PyLong_FromUnsignedLong (val);
}
}
return PyErr_Format (PyExc_RuntimeError, "programmer error: unhandled type");
}
/* A Python function which returns a gdb parameter's value as a Python
value. */
static PyObject *
get_parameter (PyObject *self, PyObject *args)
{
struct cmd_list_element *alias, *prefix, *cmd;
char *arg, *newarg;
volatile struct gdb_exception except;
if (! PyArg_ParseTuple (args, "s", &arg))
return NULL;
newarg = concat ("show ", arg, (char *) NULL);
TRY_CATCH (except, RETURN_MASK_ALL)
{
if (! lookup_cmd_composition (newarg, &alias, &prefix, &cmd))
{
xfree (newarg);
return PyErr_Format (PyExc_RuntimeError,
"could not find variable `%s'", arg);
}
}
xfree (newarg);
GDB_PY_HANDLE_EXCEPTION (except);
if (! cmd->var)
return PyErr_Format (PyExc_RuntimeError, "`%s' is not a variable", arg);
return parameter_to_python (cmd);
}
/* A Python function which evaluates a string using the gdb CLI. */
static PyObject *
execute_gdb_command (PyObject *self, PyObject *args)
{
struct cmd_list_element *alias, *prefix, *cmd;
char *arg, *newarg;
volatile struct gdb_exception except;
struct cleanup *old_chain;
if (! PyArg_ParseTuple (args, "s", &arg))
return NULL;
old_chain = make_cleanup (null_cleanup, 0);
TRY_CATCH (except, RETURN_MASK_ALL)
{
execute_command (arg, 0);
}
GDB_PY_HANDLE_EXCEPTION (except);
/* Do any commands attached to breakpoint we stopped at. Only if we
are always running synchronously. Or if we have just executed a
command that doesn't start the target. */
if (!target_can_async_p () || !is_running (inferior_ptid))
{
bpstat_do_actions (&stop_bpstat);
do_cleanups (old_chain);
}
Py_RETURN_NONE;
}
/* Printing. */
/* A python function to write a single string using gdb's filtered
output stream. */
static PyObject *
gdbpy_write (PyObject *self, PyObject *args)
{
char *arg;
if (! PyArg_ParseTuple (args, "s", &arg))
return NULL;
printf_filtered ("%s", arg);
Py_RETURN_NONE;
}
/* A python function to flush gdb's filtered output stream. */
static PyObject *
gdbpy_flush (PyObject *self, PyObject *args)
{
gdb_flush (gdb_stdout);
Py_RETURN_NONE;
}
/* Print a python exception trace, or print nothing and clear the
python exception, depending on gdbpy_should_print_stack. Only call
this if a python exception is set. */
void
gdbpy_print_stack (void)
{
if (gdbpy_should_print_stack)
PyErr_Print ();
else
PyErr_Clear ();
}
#else /* HAVE_PYTHON */
/* Dummy implementation of the gdb "python" command. */
static void
python_command (char *arg, int from_tty)
{
while (arg && *arg && isspace (*arg))
++arg;
if (arg && *arg)
error (_("Python scripting is not supported in this copy of GDB."));
else
{
struct command_line *l = get_command_line (python_control, "");
struct cleanup *cleanups = make_cleanup_free_command_lines (&l);
execute_control_command_untraced (l);
do_cleanups (cleanups);
}
}
void
eval_python_from_control_command (struct command_line *cmd)
{
error (_("Python scripting is not supported in this copy of GDB."));
}
#endif /* HAVE_PYTHON */
/* Lists for 'maint set python' commands. */
static struct cmd_list_element *set_python_list;
static struct cmd_list_element *show_python_list;
/* Function for use by 'maint set python' prefix command. */
static void
set_python (char *args, int from_tty)
{
help_list (set_python_list, "maintenance set python ", -1, gdb_stdout);
}
/* Function for use by 'maint show python' prefix command. */
static void
show_python (char *args, int from_tty)
{
cmd_show_list (show_python_list, from_tty, "");
}
/* Initialize the Python code. */
void
_initialize_python (void)
{
add_com ("python", class_obscure, python_command,
#ifdef HAVE_PYTHON
_("\
Evaluate a Python command.\n\
\n\
The command can be given as an argument, for instance:\n\
\n\
python print 23\n\
\n\
If no argument is given, the following lines are read and used\n\
as the Python commands. Type a line containing \"end\" to indicate\n\
the end of the command.")
#else /* HAVE_PYTHON */
_("\
Evaluate a Python command.\n\
\n\
Python scripting is not supported in this copy of GDB.\n\
This command is only a placeholder.")
#endif /* HAVE_PYTHON */
);
add_prefix_cmd ("python", no_class, show_python,
_("Prefix command for python maintenance settings."),
&show_python_list, "maint show python ", 0,
&maintenance_show_cmdlist);
add_prefix_cmd ("python", no_class, set_python,
_("Prefix command for python maintenance settings."),
&set_python_list, "maint set python ", 0,
&maintenance_set_cmdlist);
add_setshow_boolean_cmd ("print-stack", class_maintenance,
&gdbpy_should_print_stack, _("\
Enable or disable printing of Python stack dump on error."), _("\
Show whether Python stack will be printed on error."), _("\
Enables or disables printing of Python stack traces."),
NULL, NULL,
&set_python_list,
&show_python_list);
#ifdef HAVE_PYTHON
Py_Initialize ();
gdb_module = Py_InitModule ("gdb", GdbMethods);
/* The casts to (char*) are for python 2.4. */
PyModule_AddStringConstant (gdb_module, "VERSION", (char*) version);
PyModule_AddStringConstant (gdb_module, "HOST_CONFIG", (char*) host_name);
PyModule_AddStringConstant (gdb_module, "TARGET_CONFIG", (char*) target_name);
PyRun_SimpleString ("import gdb");
/* Create a couple objects which are used for Python's stdout and
stderr. */
PyRun_SimpleString ("\
import sys\n\
class GdbOutputFile:\n\
def close(self):\n\
# Do nothing.\n\
return None\n\
\n\
def isatty(self):\n\
return False\n\
\n\
def write(self, s):\n\
gdb.write(s)\n\
\n\
def writelines(self, iterable):\n\
for line in iterable:\n\
self.write(line)\n\
\n\
def flush(self):\n\
gdb.flush()\n\
\n\
sys.stderr = GdbOutputFile()\n\
sys.stdout = GdbOutputFile()\n\
");
#endif /* HAVE_PYTHON */
}

27
gdb/python/python.h Normal file
View File

@ -0,0 +1,27 @@
/* Python/gdb header for generic use in gdb
Copyright (C) 2008 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/>. */
#ifndef GDB_PYTHON_H
#define GDB_PYTHON_H
#include "value.h"
void eval_python_from_control_command (struct command_line *);
#endif /* GDB_PYTHON_H */

View File

@ -1,3 +1,7 @@
2008-08-06 Tom Tromey <tromey@redhat.com>
* gdb.python/python.exp: New file.
2008-08-06 Jan Kratochvil <jan.kratochvil@redhat.com>
Fix for PR gdb/1543.

View File

@ -0,0 +1,66 @@
# Copyright (C) 2008 Free Software Foundation, Inc.
# 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/>.
# This file is part of the GDB testsuite. It tests the mechanism
# exposing values to Python.
if $tracelevel then {
strace $tracelevel
}
# Start with a fresh gdb.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_test_multiple "python print 23" "verify python support" {
-re "not supported.*$gdb_prompt $" {
unsupported "python support is disabled"
return -1
}
-re "$gdb_prompt $" {}
}
# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}...
# Run a test named NAME, consisting of multiple lines of input.
# After each input line INPUT, search for result line RESULT.
# Succeed if all results are seen; fail otherwise.
proc gdb_py_test_multiple {name args} {
global gdb_prompt
foreach {input result} $args {
if {[gdb_test_multiple $input "$name - $input" {
-re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" {
pass "$name - $input"
}
}]} {
return 1
}
}
return 0
}
gdb_py_test_multiple "multi-line python command" \
"python" "" \
"print 23" "" \
"end" "23"
gdb_py_test_multiple "show python command" \
"define zzq" "Type commands for definition of .* just \"end\"\\.*" \
"python" "" \
"print 23" "" \
"end" "" \
"end" "" \
"show user zzq" "User command zzq:.* python.*print 23.* end"