[patch#4 6/8] set debug auto-load http://sourceware.org/ml/gdb-patches/2012-04/msg00089.html http://sourceware.org/ml/gdb-cvs/2012-04/msg00115.html ### src/gdb/ChangeLog 2012/04/17 15:54:28 1.14114 ### src/gdb/ChangeLog 2012/04/17 15:56:20 1.14115 ## -1,5 +1,27 @@ 2012-04-17 Jan Kratochvil + New option "set debug auto-load". + * NEWS: New commands "set debug auto-load" and "show debug auto-load". + * auto-load.c (debug_auto_load, show_debug_auto_load: New. + (auto_load_safe_path_vec_update) + (filename_is_in_auto_load_safe_path_vec): Call fprintf_unfiltered + if DEBUG_AUTO_LOAD. + (file_is_auto_load_safe): New parameters debug_fmt and .... + Call fprintf_unfiltered if DEBUG_AUTO_LOAD. + (source_gdb_script_for_objfile): Extend the file_is_auto_load_safe + caller by explanatory string. + (_initialize_auto_load): Register "set debug auto-load". + * auto-load.h (file_is_auto_load_safe): New parameters debug_fmt + and .... + * linux-thread-db.c (try_thread_db_load_from_pdir_1) + (try_thread_db_load_from_dir): Extend the file_is_auto_load_safe caller + by explanatory string. + * main.c (captured_main): Likewise. + * python/py-auto-load.c (gdbpy_load_auto_script_for_objfile) + (source_section_scripts): Likewise. + +2012-04-17 Jan Kratochvil + New option "set auto-load safe-path". * NEWS: New commands "set auto-load safe-path" and "show auto-load safe-path". Index: gdb-7.4.50.20120120/gdb/NEWS =================================================================== --- gdb-7.4.50.20120120.orig/gdb/NEWS 2012-04-18 00:49:33.000000000 +0200 +++ gdb-7.4.50.20120120/gdb/NEWS 2012-04-18 00:50:15.018600282 +0200 @@ -72,6 +72,10 @@ show auto-load safe-path Set a list of directories from which it is safe to auto-load files. The delimiter (':' above) may differ according to the host platform. +set debug auto-load on|off +show debug auto-load + Control display of debugging info for auto-loading the files above. + * New command line options --init-command=FILE, -ix Like --command, -x but execute it Index: gdb-7.4.50.20120120/gdb/auto-load.c =================================================================== --- gdb-7.4.50.20120120.orig/gdb/auto-load.c 2012-04-18 00:49:21.000000000 +0200 +++ gdb-7.4.50.20120120/gdb/auto-load.c 2012-04-18 00:50:04.801626235 +0200 @@ -43,6 +43,20 @@ static void source_gdb_script_for_objfile (struct objfile *objfile, FILE *file, const char *filename); +/* Value of the 'set debug auto-load' configuration variable. */ +static int debug_auto_load = 0; + +/* "show" command for the debug_auto_load configuration variable. */ + +static void +show_debug_auto_load (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + fprintf_filtered (file, _("Debugging output for files " + "of 'set auto-load ...' is %s.\n"), + value); +} + /* User-settable option to enable/disable auto-loading of GDB_AUTO_FILE_NAME scripts: set auto-load gdb-scripts on|off @@ -112,6 +126,11 @@ auto_load_safe_path_vec_update (void) unsigned len; int ix; + if (debug_auto_load) + fprintf_unfiltered (gdb_stdlog, + _("auto-load: Updating directories of \"%s\".\n"), + auto_load_safe_path); + free_char_ptr_vec (auto_load_safe_path_vec); auto_load_safe_path_vec = dirnames_to_char_ptr_vec (auto_load_safe_path); @@ -126,14 +145,34 @@ auto_load_safe_path_vec_update (void) char *real_path = gdb_realpath (expanded); /* Ensure the current entry is at least tilde_expand-ed. */ - xfree (dir); VEC_replace (char_ptr, auto_load_safe_path_vec, ix, expanded); + if (debug_auto_load) + { + if (strcmp (expanded, dir) == 0) + fprintf_unfiltered (gdb_stdlog, + _("auto-load: Using directory \"%s\".\n"), + expanded); + else + fprintf_unfiltered (gdb_stdlog, + _("auto-load: Resolved directory \"%s\" " + "as \"%s\".\n"), + dir, expanded); + } + xfree (dir); + /* If gdb_realpath returns a different content, append it. */ if (strcmp (real_path, expanded) == 0) xfree (real_path); else - VEC_safe_push (char_ptr, auto_load_safe_path_vec, real_path); + { + VEC_safe_push (char_ptr, auto_load_safe_path_vec, real_path); + + if (debug_auto_load) + fprintf_unfiltered (gdb_stdlog, + _("auto-load: And canonicalized as \"%s\".\n"), + real_path); + } } } @@ -217,16 +256,30 @@ filename_is_in_auto_load_safe_path_vec ( if (dir == NULL) { if (*filename_realp == NULL) - *filename_realp = gdb_realpath (filename); + { + *filename_realp = gdb_realpath (filename); + if (debug_auto_load && strcmp (*filename_realp, filename) != 0) + fprintf_unfiltered (gdb_stdlog, + _("auto-load: Resolved " + "file \"%s\" as \"%s\".\n"), + filename, *filename_realp); + } - for (ix = 0; VEC_iterate (char_ptr, auto_load_safe_path_vec, ix, dir); - ++ix) - if (filename_is_in_dir (*filename_realp, dir)) - break; + if (strcmp (*filename_realp, filename) != 0) + for (ix = 0; VEC_iterate (char_ptr, auto_load_safe_path_vec, ix, dir); + ++ix) + if (filename_is_in_dir (*filename_realp, dir)) + break; } if (dir != NULL) - return 1; + { + if (debug_auto_load) + fprintf_unfiltered (gdb_stdlog, _("auto-load: File \"%s\" matches " + "directory \"%s\".\n"), + filename, dir); + return 1; + } return 0; } @@ -240,11 +293,20 @@ filename_is_in_auto_load_safe_path_vec ( directory. */ int -file_is_auto_load_safe (const char *filename) +file_is_auto_load_safe (const char *filename, const char *debug_fmt, ...) { char *filename_real = NULL; struct cleanup *back_to; + if (debug_auto_load) + { + va_list debug_args; + + va_start (debug_args, debug_fmt); + vfprintf_unfiltered (gdb_stdlog, debug_fmt, debug_args); + va_end (debug_args); + } + back_to = make_cleanup (free_current_contents, &filename_real); if (filename_is_in_auto_load_safe_path_vec (filename, &filename_real)) @@ -281,7 +343,10 @@ source_gdb_script_for_objfile (struct ob struct auto_load_pspace_info *pspace_info; volatile struct gdb_exception e; - is_safe = file_is_auto_load_safe (filename); + is_safe = file_is_auto_load_safe (filename, _("auto-load: Loading canned " + "sequences of commands script " + "\"%s\" for objfile \"%s\".\n"), + filename, objfile->name); /* Add this script to the hash table too so "info auto-load gdb-scripts" can print it. */ @@ -975,4 +1040,13 @@ See the commands 'set auto-load safe-pat access the current full list setting."), &cmdlist); set_cmd_completer (cmd, filename_completer); + + add_setshow_boolean_cmd ("auto-load", class_maintenance, + &debug_auto_load, _("\ +Set auto-load verifications debugging."), _("\ +Show auto-load verifications debugging."), _("\ +When non-zero, debugging output for files of 'set auto-load ...'\n\ +is displayed."), + NULL, show_debug_auto_load, + &setdebuglist, &showdebuglist); } Index: gdb-7.4.50.20120120/gdb/auto-load.h =================================================================== --- gdb-7.4.50.20120120.orig/gdb/auto-load.h 2012-04-18 00:49:21.000000000 +0200 +++ gdb-7.4.50.20120120/gdb/auto-load.h 2012-04-18 00:50:04.801626235 +0200 @@ -55,6 +55,7 @@ extern struct cmd_list_element **auto_lo extern struct cmd_list_element **auto_load_show_cmdlist_get (void); extern struct cmd_list_element **auto_load_info_cmdlist_get (void); -extern int file_is_auto_load_safe (const char *filename); +extern int file_is_auto_load_safe (const char *filename, + const char *debug_fmt, ...); #endif /* AUTO_LOAD_H */ Index: gdb-7.4.50.20120120/gdb/linux-thread-db.c =================================================================== --- gdb-7.4.50.20120120.orig/gdb/linux-thread-db.c 2012-04-18 00:49:21.000000000 +0200 +++ gdb-7.4.50.20120120/gdb/linux-thread-db.c 2012-04-18 00:50:04.801626235 +0200 @@ -869,7 +869,9 @@ try_thread_db_load_from_pdir_1 (struct o gdb_assert (cp != NULL); strcpy (cp + 1, LIBTHREAD_DB_SO); - if (!file_is_auto_load_safe (path)) + if (!file_is_auto_load_safe (path, _("auto-load: Loading libthread-db " + "library \"%s\" from $pdir.\n"), + path)) result = 0; else result = try_thread_db_load (path); @@ -939,7 +941,10 @@ try_thread_db_load_from_dir (const char path[dir_len] = '/'; strcpy (path + dir_len + 1, LIBTHREAD_DB_SO); - if (!file_is_auto_load_safe (path)) + if (!file_is_auto_load_safe (path, _("auto-load: Loading libthread-db " + "library \"%s\" from explicit " + "directory.\n"), + path)) result = 0; else result = try_thread_db_load (path); Index: gdb-7.4.50.20120120/gdb/main.c =================================================================== --- gdb-7.4.50.20120120.orig/gdb/main.c 2012-04-18 00:49:21.000000000 +0200 +++ gdb-7.4.50.20120120/gdb/main.c 2012-04-18 00:50:04.801626235 +0200 @@ -1027,7 +1027,10 @@ captured_main (void *data) auto_load_local_gdbinit_pathname = gdb_realpath (local_gdbinit); if (!inhibit_gdbinit && auto_load_local_gdbinit - && file_is_auto_load_safe (local_gdbinit)) + && file_is_auto_load_safe (local_gdbinit, + _("auto-load: Loading .gdbinit " + "file \"%s\".\n"), + local_gdbinit)) { auto_load_local_gdbinit_loaded = 1; Index: gdb-7.4.50.20120120/gdb/doc/gdb.texinfo =================================================================== --- gdb-7.4.50.20120120.orig/gdb/doc/gdb.texinfo 2012-04-18 00:49:21.000000000 +0200 +++ gdb-7.4.50.20120120/gdb/doc/gdb.texinfo 2012-04-18 00:50:04.809626215 +0200 @@ -20887,6 +20887,7 @@ These are @value{GDBN} control commands * libthread_db.so.1 file:: @samp{set/show/info auto-load libthread-db} * objfile-gdb.gdb file:: @samp{set/show/info auto-load gdb-script} * Auto-loading safe path:: @samp{set/show/info auto-load safe-path} +* Auto-loading verbose mode:: @samp{set/show debug auto-load} @xref{Python Auto-loading}. @end menu @@ -21085,6 +21086,45 @@ entries again. @value{GDBN} already can own before starting the comparison so a canonical form of directories is recommended to be entered. +@node Auto-loading verbose mode +@subsection Displaying files tried for auto-load +@cindex auto-loading verbose mode + +For better visibility of all the file locations where you can place scripts to +be auto-loaded with inferior --- or to protect yourself against accidental +execution of untrusted scripts --- @value{GDBN} provides a feature for printing +all the files attempted to be loaded. Both existing and non-existing files may +be printed. + +For example the list of directories from which it is safe to auto-load files +(@pxref{Auto-loading safe path}) applies also to canonicalized filenames which +may not be too obvious while setting it up. + +@smallexample +(gdb) set debug auto-load ues +(gdb) file ~/src/t/true +auto-load: Loading canned sequences of commands script "/tmp/true-gdb.gdb" + for objfile "/tmp/true". +auto-load: Updating directories of "/usr:/opt". +auto-load: Using directory "/usr". +auto-load: Using directory "/opt". +warning: File "/tmp/true-gdb.gdb" auto-loading has been declined + by your `auto-load safe-path' set to "/usr:/opt". +@end smallexample + +@table @code +@anchor{set debug auto-load} +@kindex set debug auto-load +@item set debug auto-load [on|off] +Set whether to print the filenames attempted to be auto-loaded. + +@anchor{show debug auto-load} +@kindex show debug auto-load +@item show debug auto-load +Show whether printing of the filenames attempted to be auto-loaded is turned +on or off. +@end table + @node Messages/Warnings @section Optional Warnings and Messages Index: gdb-7.4.50.20120120/gdb/python/py-auto-load.c =================================================================== --- gdb-7.4.50.20120120.orig/gdb/python/py-auto-load.c 2012-04-18 00:49:21.000000000 +0200 +++ gdb-7.4.50.20120120/gdb/python/py-auto-load.c 2012-04-18 00:50:04.810626212 +0200 @@ -75,7 +75,10 @@ gdbpy_load_auto_script_for_objfile (stru int is_safe; struct auto_load_pspace_info *pspace_info; - is_safe = file_is_auto_load_safe (filename); + is_safe = file_is_auto_load_safe (filename, + _("auto-load: Loading Python script \"%s\" " + "by extension for objfile \"%s\".\n"), + filename, objfile->name); /* Add this script to the hash table too so "info auto-load python-scripts" can print it. */ @@ -153,7 +156,12 @@ source_section_scripts (struct objfile * make_cleanup_fclose (stream); make_cleanup (xfree, full_path); - if (!file_is_auto_load_safe (full_path)) + if (!file_is_auto_load_safe (full_path, + _("auto-load: Loading Python script " + "\"%s\" from section \"%s\" of " + "objfile \"%s\".\n"), + full_path, GDBPY_AUTO_SECTION_NAME, + objfile->name)) opened = 0; } else