diff options
author | Tom Tromey <tromey@redhat.com> | 2014-05-14 14:35:45 -0600 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2014-12-12 22:28:44 +0100 |
commit | bb2ec1b34e7cc8d8602512235016e74b800dac3b (patch) | |
tree | 6fb368ff4d35c37a24d434d5d7348d8dd8850ca7 /gdb/doc | |
parent | a2658febe2016f875ffb70287904b01013bcca75 (diff) | |
download | gdb-bb2ec1b34e7cc8d8602512235016e74b800dac3b.zip gdb-bb2ec1b34e7cc8d8602512235016e74b800dac3b.tar.gz gdb-bb2ec1b34e7cc8d8602512235016e74b800dac3b.tar.bz2 |
the "compile" command
This final patch adds the new "compile" command and subcommands, and
all the machinery needed to make it work.
A shared library supplied by gcc is used for all communications with
gcc. Types and most aspects of symbols are provided directly by gdb
to the compiler using this library.
gdb provides some information about the user's code using plain text.
Macros are emitted this way, and DWARF location expressions (and
bounds for VLA) are compiled to C code.
This hybrid approach was taken because, on the one hand, it is better
to provide global declarations and such on demand; but on the other
hand, for local variables, translating DWARF location expressions to C
was much simpler than exporting a full compiler API to gdb -- the same
result, only easier to implement, understand, and debug.
In the ordinary mode, the user's expression is wrapped in a dummy
function. After compilation, gdb inserts the resulting object code
into the inferior, then calls this function.
Access to local variables is provided by noting which registers are
used by location expressions, and passing a structure of register
values into the function. Writes to registers are supported by
copying out these values after the function returns.
This approach was taken so that we could eventually implement other
more interesting features based on this same infrastructure; for
example, we're planning to investigate inferior-side breakpoint
conditions.
gdb/ChangeLog
2014-12-12 Phil Muldoon <pmuldoon@redhat.com>
Jan Kratochvil <jan.kratochvil@redhat.com>
Tom Tromey <tromey@redhat.com>
* NEWS: Update.
* symtab.h (struct symbol_computed_ops) <generate_c_location>: New
field.
* p-lang.c (pascal_language_defn): Update.
* opencl-lang.c (opencl_language_defn): Update.
* objc-lang.c (objc_language_defn): Update.
* m2-lang.c (m2_language_defn): Update.
* language.h (struct language_defn) <la_get_compile_instance,
la_compute_program>: New fields.
* language.c (unknown_language_defn, auto_language_defn)
(local_language_defn): Update.
* jv-lang.c (java_language_defn): Update.
* go-lang.c (go_language_defn): Update.
* f-lang.c (f_language_defn): Update.
* dwarf2loc.h (dwarf2_compile_property_to_c): Declare.
* dwarf2loc.c (dwarf2_compile_property_to_c)
(locexpr_generate_c_location, loclist_generate_c_location): New
functions.
(dwarf2_locexpr_funcs, dwarf2_loclist_funcs): Update.
* defs.h (enum compile_i_scope_types): New.
(enum command_control_type) <compile_control>: New constant.
(struct command_line) <control_u>: New field.
* d-lang.c (d_language_defn): Update.
* compile/compile.c: New file.
* compile/compile-c-support.c: New file.
* compile/compile-c-symbols.c: New file.
* compile/compile-c-types.c: New file.
* compile/compile.h: New file.
* compile/compile-internal.h: New file.
* compile/compile-loc2c.c: New file.
* compile/compile-object-load.c: New file.
* compile/compile-object-load.h: New file.
* compile/compile-object-run.c: New file.
* compile/compile-object-run.h: New file.
* cli/cli-script.c (multi_line_command_p, print_command_lines)
(execute_control_command, process_next_line)
(recurse_read_control_structure): Handle compile_control.
* c-lang.h (c_get_compile_context, c_compute_program): Declare.
* c-lang.c (c_language_defn, cplus_language_defn)
(asm_language_defn, minimal_language_defn): Update.
* ada-lang.c (ada_language_defn): Update.
* Makefile.in (SUBDIR_GCC_COMPILE_OBS, SUBDIR_GCC_COMPILE_SRCS):
New variables.
(SFILES): Add SUBDIR_GCC_COMPILE_SRCS.
(HFILES_NO_SRCDIR): Add compile.h.
(COMMON_OBS): Add SUBDIR_GCC_COMPILE_OBS.
(INIT_FILES): Add SUBDIR_GCC_COMPILE_SRCS.
(compile.o, compile-c-types.o, compile-c-symbols.o)
(compile-object-load.o, compile-object-run.o, compile-loc2c.o)
(compile-c-support.o): New targets.
gdb/doc/ChangeLog
2014-12-12 Phil Muldoon <pmuldoon@redhat.com>
Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.texinfo (Altering): Update.
(Compiling and Injecting Code): New node.
gdb/testsuite/ChangeLog
2014-12-12 Phil Muldoon <pmuldoon@redhat.com>
Jan Kratochvil <jan.kratochvil@redhat.com>
Tom Tromey <tromey@redhat.com>
* configure.ac: Add gdb.compile/.
* configure: Regenerate.
* gdb.compile/Makefile.in: New file.
* gdb.compile/compile-ops.exp: New file.
* gdb.compile/compile-ops.c: New file.
* gdb.compile/compile-tls.c: New file.
* gdb.compile/compile-tls.exp: New file.
* gdb.compile/compile-constvar.S: New file.
* gdb.compile/compile-constvar.c: New file.
* gdb.compile/compile-mod.c: New file.
* gdb.compile/compile-nodebug.c: New file.
* gdb.compile/compile-setjmp-mod.c: New file.
* gdb.compile/compile-setjmp.c: New file.
* gdb.compile/compile-setjmp.exp: New file.
* gdb.compile/compile-shlib.c: New file.
* gdb.compile/compile.c: New file.
* gdb.compile/compile.exp: New file.
* lib/gdb.exp (skip_compile_feature_tests): New proc.
Diffstat (limited to 'gdb/doc')
-rw-r--r-- | gdb/doc/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 232 |
2 files changed, 238 insertions, 0 deletions
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 9b36c37..7dfaee0 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,9 @@ +2014-12-12 Phil Muldoon <pmuldoon@redhat.com> + Jan Kratochvil <jan.kratochvil@redhat.com> + + * gdb.texinfo (Altering): Update. + (Compiling and Injecting Code): New node. + 2014-12-12 Doug Evans <dje@google.com> * python.texi (Objfiles In Python): Document gdb.lookup_objfile. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 4986a68..56a81f0 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -16494,6 +16494,7 @@ address, or even return prematurely from a function. * Returning:: Returning from a function * Calling:: Calling your program's functions * Patching:: Patching your program +* Compiling and Injecting Code:: Compiling and injecting code in @value{GDBN} @end menu @node Assignment @@ -16916,6 +16917,237 @@ Display whether executable files and core files are opened for writing as well as reading. @end table +@node Compiling and Injecting Code +@section Compiling and injecting code in @value{GDBN} +@cindex injecting code +@cindex writing into executables +@cindex compiling code + +@value{GDBN} supports on-demand compilation and code injection into +programs running under @value{GDBN}. GCC 5.0 or higher built with +@file{libcc1.so} must be installed for this functionality to be enabled. +This functionality is implemented with the following commands. + +@table @code +@kindex compile code +@item compile code @var{source-code} +@itemx compile code -raw @var{--} @var{source-code} +Compile @var{source-code} with the compiler language found as the current +language in @value{GDBN} (@pxref{Languages}). If compilation and +injection is not supported with the current language specified in +@value{GDBN}, or the compiler does not support this feature, an error +message will be printed. If @var{source-code} compiles and links +successfully, @value{GDBN} will load the object-code emitted, +and execute it within the context of the currently selected inferior. +It is important to note that the compiled code is executed immediately. +After execution, the compiled code is removed from @value{GDBN} and any +new types or variables you have defined will be deleted. + +The command allows you to specify @var{source-code} in two ways. +The simplest method is to provide a single line of code to the command. +E.g.: + +@smallexample +compile code printf ("hello world\n"); +@end smallexample + +If you specify options on the command line as well as source code, they +may conflict. The @samp{--} delimiter can be used to separate options +from actual source code. E.g.: + +@smallexample +compile code -r -- printf ("hello world\n"); +@end smallexample + +Alternatively you can enter source code as multiple lines of text. To +enter this mode, invoke the @samp{compile code} command without any text +following the command. This will start the multiple-line editor and +allow you to type as many lines of source code as required. When you +have completed typing, enter @samp{end} on its own line to exit the +editor. + +@smallexample +compile code +>printf ("hello\n"); +>printf ("world\n"); +>end +@end smallexample + +Specifying @samp{-raw}, prohibits @value{GDBN} from wrapping the +provided @var{source-code} in a callable scope. In this case, you must +specify the entry point of the code by defining a function named +@code{_gdb_expr_}. The @samp{-raw} code cannot access variables of the +inferior. Using @samp{-raw} option may be needed for example when +@var{source-code} requires @samp{#include} lines which may conflict with +inferior symbols otherwise. + +@kindex compile file +@item compile file @var{filename} +@itemx compile file -raw @var{filename} +Like @code{compile code}, but take the source code from @var{filename}. + +@smallexample +compile file /home/user/example.c +@end smallexample +@end table + +@subsection Caveats when using the @code{compile} command + +There are a few caveats to keep in mind when using the @code{compile} +command. As the caveats are different per language, the table below +highlights specific issues on a per language basis. + +@table @asis +@item C code examples and caveats +When the language in @value{GDBN} is set to @samp{C}, the compiler will +attempt to compile the source code with a @samp{C} compiler. The source +code provided to the @code{compile} command will have much the same +access to variables and types as it normally would if it were part of +the program currently being debugged in @value{GDBN}. + +Below is a sample program that forms the basis of the examples that +follow. This program has been compiled and loaded into @value{GDBN}, +much like any other normal debugging session. + +@smallexample +void function1 (void) +@{ + int i = 42; + printf ("function 1\n"); +@} + +void function2 (void) +@{ + int j = 12; + function1 (); +@} + +int main(void) +@{ + int k = 6; + int *p; + function2 (); + return 0; +@} +@end smallexample + +For the purposes of the examples in this section, the program above has +been compiled, loaded into @value{GDBN}, stopped at the function +@code{main}, and @value{GDBN} is awaiting input from the user. + +To access variables and types for any program in @value{GDBN}, the +program must be compiled and packaged with debug information. The +@code{compile} command is not an exception to this rule. Without debug +information, you can still use the @code{compile} command, but you will +be very limited in what variables and types you can access. + +So with that in mind, the example above has been compiled with debug +information enabled. The @code{compile} command will have access to +all variables and types (except those that may have been optimized +out). Currently, as @value{GDBN} has stopped the program in the +@code{main} function, the @code{compile} command would have access to +the variable @code{k}. You could invoke the @code{compile} command +and type some source code to set the value of @code{k}. You can also +read it, or do anything with that variable you would normally do in +@code{C}. Be aware that changes to inferior variables in the +@code{compile} command are persistent. In the following example: + +@smallexample +compile code k = 3; +@end smallexample + +@noindent +the variable @code{k} is now 3. It will retain that value until +something else in the example program changes it, or another +@code{compile} command changes it. + +Normal scope and access rules apply to source code compiled and +injected by the @code{compile} command. In the example, the variables +@code{j} and @code{k} are not accessible yet, because the program is +currently stopped in the @code{main} function, where these variables +are not in scope. Therefore, the following command + +@smallexample +compile code j = 3; +@end smallexample + +@noindent +will result in a compilation error message. + +Once the program is continued, execution will bring these variables in +scope, and they will become accessible; then the code you specify via +the @code{compile} command will be able to access them. + +You can create variables and types with the @code{compile} command as +part of your source code. Variables and types that are created as part +of the @code{compile} command are not visible to the rest of the program for +the duration of its run. This example is valid: + +@smallexample +compile code int ff = 5; printf ("ff is %d\n", ff); +@end smallexample + +However, if you were to type the following into @value{GDBN} after that +command has completed: + +@smallexample +compile code printf ("ff is %d\n'', ff); +@end smallexample + +@noindent +a compiler error would be raised as the variable @code{ff} no longer +exists. Object code generated and injected by the @code{compile} +command is removed when its execution ends. Caution is advised +when assigning to program variables values of variables created by the +code submitted to the @code{compile} command. This example is valid: + +@smallexample +compile code int ff = 5; k = ff; +@end smallexample + +The value of the variable @code{ff} is assigned to @code{k}. The variable +@code{k} does not require the existence of @code{ff} to maintain the value +it has been assigned. However, pointers require particular care in +assignment. If the source code compiled with the @code{compile} command +changed the address of a pointer in the example program, perhaps to a +variable created in the @code{compile} command, that pointer would point +to an invalid location when the command exits. The following example +would likely cause issues with your debugged program: + +@smallexample +compile code int ff = 5; p = &ff; +@end smallexample + +In this example, @code{p} would point to @code{ff} when the +@code{compile} command is executing the source code provided to it. +However, as variables in the (example) program persist with their +assigned values, the variable @code{p} would point to an invalid +location when the command exists. A general rule should be followed +in that you should either assign @code{NULL} to any assigned pointers, +or restore a valid location to the pointer before the command exits. + +Similar caution must be exercised with any structs, unions, and typedefs +defined in @code{compile} command. Types defined in the @code{compile} +command will no longer be available in the next @code{compile} command. +Therefore, if you cast a variable to a type defined in the +@code{compile} command, care must be taken to ensure that any future +need to resolve the type can be achieved. + +@smallexample +(gdb) compile code static struct a @{ int a; @} v = @{ 42 @}; argv = &v; +(gdb) compile code printf ("%d\n", ((struct a *) argv)->a); +gdb command line:1:36: error: dereferencing pointer to incomplete type ‘struct a’ +Compilation failed. +(gdb) compile code struct a @{ int a; @}; printf ("%d\n", ((struct a *) argv)->a); +42 +@end smallexample + +Variables that have been optimized away by the compiler are not +accessible to the code submitted to the @code{compile} command. +Access to those variables will generate a compiler error which @value{GDBN} +will print to the console. +@end table + @node GDB Files @chapter @value{GDBN} Files |