From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2202 invoked by alias); 19 Aug 2008 14:52:20 -0000 Received: (qmail 2190 invoked by uid 22791); 19 Aug 2008 14:52:17 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 19 Aug 2008 14:51:45 +0000 Received: (qmail 20356 invoked from network); 19 Aug 2008 14:51:42 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 19 Aug 2008 14:51:42 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: About issue #3571 (Error in re-setting breakpoint 1: No source file named...) Date: Tue, 19 Aug 2008 14:52:00 -0000 User-Agent: KMail/1.9.9 Cc: Daniel Jacobowitz , Sandra Loosemore MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_l4tqIv8jPlSiEZ1" Message-Id: <200808191552.21165.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-08/txt/msg00519.txt.bz2 --Boundary-00=_l4tqIv8jPlSiEZ1 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 13581 Sorry for the long email below, This is mostly GDB logs with comments, promise. :-) With my latest change in the tree, we're now *not* discarding and refetching the list of shared libraries when we attach/detach to/from processes. The list is now only fetched on connection, or when the user does "info sharedlibraries". This prevents the error reported on issue #3571 from triggering on the common attach/detach case. Let me go through what is was again: Issue #3571's error is triggered due to breakpoint_re_set being called on every object file loaded. Since "attach" got rid of the previous list of SOs, attach 1 &"attach 1\n" ~"Attached to process 1\n" =thread-group-created,id="1" =thread-created,id="1",group-id="1" ^running *running,thread-id="1" &"Error while mapping shared library sections:\n" &"ProcessSupport.LM_AXG425.elf.R7T01.i686: No such file or directory.\n" ~"Reading symbols from /local/home/lmckhou/TSP/CodeSourcery/STUB/src/dicos_stub/DicosKernel_LM/bin/DicosKernel.LM_AXG561.elf.R7S01_ECHO.i686..." ~"done.\n" &"Error in re-setting breakpoint 1: No source file named /local/home/lmckhou/TSP/TADE/Test_OU/src/test.cc.\n" ... and this breakpoint was set at in an SO whose symbols are only loaded afterwards, below, we get this error above, on the first SO loaded. ~"Loaded symbols for /local/home/lmckhou/TSP/CodeSourcery/STUB/src/dicos_stub/DicosKernel_LM/bin/DicosKernel.LM_AXG561.elf.R7S01_ECHO.i686\n" ~"Symbol file not found for ProcessSupport.LM_AXG425.elf.R7T01.i686\n" ~"Reading symbols from /local/home/lmckhou/TSP/TADE/Test_LM/bin/Test.LM_Test1.elf.R1A01.i686..." ~"done.\n" ~"Loaded symbols for /local/home/lmckhou/TSP/TADE/Test_LM/bin/Test.LM_Test1.elf.R1A01.i686\n" (gdb) Now that we don't get rid of the solist so often, we don't trip on this as much. We do still trip on it on disconnect/reconnect: (gdb) b test.cc:123 Breakpoint 2 at 0xe3f6468: file /scratch/pedro/dicos/build/Test_OU/src/test.cc, line 123. (gdb) info sharedlibrary From To Syms Read Shared Object Library 0x0916b730 0x0a2f3d23 Yes /net/daisy/scratch/pedro/dicos/build/DicosKernel_LM/bin/DicosKernel.LM_AXG561.elf.R7S01_ECHO.i686 No ProcessSupport.LM_AXG425.elf.R7T01.i686 0x0e267944 0x0e3f68bf Yes /net/daisy/scratch/pedro/dicos/build/Test_LM/bin/Test.LM_Test1.elf.R1A01.i686 (gdb) info breakpoints Num Type Disp Enb Address What 2 breakpoint keep y 0x0e3f6468 in aBlockingCapsule() at /scratch/pedro/dicos/build/Test_OU/src/test.cc:123 (gdb) disconnect Ending remote debugging. (gdb) info sharedlibrary No shared libraries loaded at this time. (gdb) info breakpoints Num Type Disp Enb Address What 2 breakpoint keep y 0x0e3f6468 /scratch/pedro/dicos/build/Test_OU/src/test.cc:123 (gdb) disable 2 (gdb) enable 2 (gdb) info breakpoints Num Type Disp Enb Address What 2 breakpoint keep y 0x0e3f6468 /scratch/pedro/dicos/build/Test_OU/src/test.cc:123 (gdb) tar extended-remote :10019 Remote debugging using :10019 Error while mapping shared library sections: ProcessSupport.LM_AXG425.elf.R7T01.i686: No such file or directory. Reading symbols from /net/daisy/scratch/pedro/dicos/build/DicosKernel_LM/bin/DicosKernel.LM_AXG561.elf.R7S01_ECHO.i686...done. Error in re-setting breakpoint 2: No source file named test.cc. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Loaded symbols for /net/daisy/scratch/pedro/dicos/build/DicosKernel_LM/bin/DicosKernel.LM_AXG561.elf.R7S01_ECHO.i686 Symbol file not found for ProcessSupport.LM_AXG425.elf.R7T01.i686 Reading symbols from /net/daisy/scratch/pedro/dicos/build/Test_LM/bin/Test.LM_Test1.elf.R1A01.i686...done. Loaded symbols for /net/daisy/scratch/pedro/dicos/build/Test_LM/bin/Test.LM_Test1.elf.R1A01.i686 ^^ test.cc is found in this library. (gdb) info breakpoints Num Type Disp Enb Address What 2 breakpoint keep n 0x0e3f6468 in aBlockingCapsule() at /scratch/pedro/dicos/build/Test_OU/src/test.cc:123 ^^^ ^^^ breakpoint is now disabled. The error is almost OK to ignore, if it weren't for the fact, that when enough symbols to resolve the breakpoint are loaded, the breakpoint is left disabled, when it was enabled before disconnect. I've spent a bit trying to change this behaviour, but I couldn't get it 100% solved. Here's what I've done: Check this sequence, showing how to reproduce this easilly on linux: Setting a breakpoint, when we have symbols: >gdb ./gdb (top-gdb) b main Breakpoint 3 at 0x44f1a7: file ../../src/gdb/gdb.c, line 28. Running to it: (top-gdb) r Starting program: /home/pedro/gdb/multi_process/build/gdb/gdb [Thread debugging using libthread_db enabled] [New Thread 0x7fbdca1fb6e0 (LWP 26651)] [Switching to Thread 0x7fbdca1fb6e0 (LWP 26651)] Breakpoint 3, main (argc=1, argv=0x7fffd2220688) at ../../src/gdb/gdb.c:28 28 memset (&args, 0, sizeof args); Setting another breakpoint: (top-gdb) b gdb_main Breakpoint 4 at 0x450288: file ../../src/gdb/main.c, line 839. Let's take a look at the breakpoints state: (top-gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000459ca6 in internal_error at ../../src/gdb/utils.c:893 2 breakpoint keep y 0x000000000049f6d2 in info_command at ../../src/gdb/cli/cli-cmds.c:199 silent return 3 breakpoint keep y 0x000000000044f1a7 in main at ../../src/gdb/gdb.c:28 breakpoint already hit 1 time 4 breakpoint keep y 0x0000000000450288 in gdb_main at ../../src/gdb/main.c:839 Let's now discard the loaded symbols: (top-gdb) file A program is being debugged already. Are you sure you want to change the file? (y or n) y No executable file now. Discard symbol table from `/home/pedro/gdb/multi_process/build/gdb/gdb'? (y or n) y Error in re-setting breakpoint 1: No symbol table is loaded. Use the "file" command. Error in re-setting breakpoint 2: No symbol table is loaded. Use the "file" command. Error in re-setting breakpoint 3: No symbol table is loaded. Use the "file" command. Error in re-setting breakpoint 4: No symbol table is loaded. Use the "file" command. No symbol file now. Hmmm, a bunch of weird looking errors. What happened to the breakpoints? (top-gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep n 0x00459ca6 ../../src/gdb/utils.c:893 2 breakpoint keep n 0x0049f6d2 ../../src/gdb/cli/cli-cmds.c:199 silent return 3 breakpoint keep n 0x0044f1a7 ../../src/gdb/gdb.c:28 breakpoint already hit 1 time 4 breakpoint keep n 0x00450288 ../../src/gdb/main.c:839 Oh, right, no symbol table is loaded, so the breakpoints are gone. And, they are marked as not enabled. Ok, let's fix what GDB suspected was the reason --- let's load a symbol table: (top-gdb) file gdb A program is being debugged already. Are you sure you want to change the file? (y or n) y Reading symbols from /home/pedro/gdb/multi_process/build/gdb/gdb...done. So, at this point, breakpoint should have been enabled, shouldn't they?: (top-gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep n 0x0000000000459ca6 in internal_error at ../../src/gdb/utils.c:893 2 breakpoint keep n 0x000000000049f6d2 in info_command at ../../src/gdb/cli/cli-cmds.c:199 silent return 3 breakpoint keep n 0x000000000044f1a7 in main at ../../src/gdb/gdb.c:28 breakpoint already hit 1 time 4 breakpoint keep n 0x0000000000450288 in gdb_main at ../../src/gdb/main.c:839 (top-gdb) Bummer, they're still disabled... ------------------------- Patch 001 (submitted upstream a few months back already), in combination with patch 002, changes GDB's behaviour so instead of throwing an error when reparsing a breakpoint failed, we set it to pending. So now, you'd get: >./gdb --quiet --args ./gdb --quiet Setting up the environment for debugging gdb. Breakpoint 1 at 0x459ce6: file ../../src/gdb/utils.c, line 893. Breakpoint 2 at 0x49f756: file ../../src/gdb/cli/cli-cmds.c, line 199. (top-gdb) b main Breakpoint 3 at 0x44f1e7: file ../../src/gdb/gdb.c, line 28. (top-gdb) r Starting program: /home/pedro/gdb/multi_process/build/gdb/gdb --quiet [Thread debugging using libthread_db enabled] Breakpoint 3, main (argc=2, argv=0x7fffffffe448) at ../../src/gdb/gdb.c:28 28 memset (&args, 0, sizeof args); (top-gdb) b gdb_main Breakpoint 4 at 0x4502c8: file ../../src/gdb/main.c, line 839. (top-gdb) file A program is being debugged already. Are you sure you want to change the file? (y or n) y No executable file now. Discard symbol table from `/home/pedro/gdb/multi_process/build/gdb/gdb'? (y or n) y warning: Leaving breakpoint #1 pending warning: Leaving breakpoint #2 pending warning: Leaving breakpoint #3 pending warning: Leaving breakpoint #4 pending No symbol file now. (top-gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y ../../src/gdb/utils.c:893 2 breakpoint keep y ../../src/gdb/cli/cli-cmds.c:199 silent return 3 breakpoint keep y ../../src/gdb/gdb.c:28 breakpoint already hit 1 time 4 breakpoint keep y ../../src/gdb/main.c:839 (top-gdb) file gdb A program is being debugged already. Are you sure you want to change the file? (y or n) y Reading symbols from /home/pedro/gdb/multi_process/build/gdb/gdb...done. (top-gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000459ce6 in internal_error at ../../src/gdb/utils.c:893 2 breakpoint keep y 0x000000000049f756 in info_command at ../../src/gdb/cli/cli-cmds.c:199 silent return 3 breakpoint keep y 0x000000000044f1e7 in main at ../../src/gdb/gdb.c:28 breakpoint already hit 1 time 4 breakpoint keep y 0x00000000004502c8 in gdb_main at ../../src/gdb/main.c:839 (top-gdb) Ahh, now they're left enabled. This looks promising, but when shared libraries are involved, things don't look so great. I've added a hack so that if we're fetching the solist from the inferior/target, breakpoint resetting is blocked until after loading the whole list. That's patch 003. Unfortunatelly, on linux, behaviour still isn't the best: (gdb) b main Breakpoint 1 at 0x40066c: file ../../../src/gdb/testsuite/gdb.base/solib-symbol-main.c, line 25. (gdb) r Starting program: /home/pedro/gdb/multi_process/build/gdb/testsuite/gdb.base/solib-symbol-main Breakpoint 1, main () at ../../../src/gdb/testsuite/gdb.base/solib-symbol-main.c:25 25 printf ("in main\n"); (gdb) b foo Breakpoint 2 at 0x7ffff7bdf570: file ../../../src/gdb/testsuite/gdb.base/solib-symbol-lib.c, line 22. (gdb) file A program is being debugged already. Are you sure you want to change the file? (y or n) y No executable file now. Discard symbol table from `/home/pedro/gdb/multi_process/build/gdb/testsuite/gdb.base/solib-symbol-main'? (y or n) y warning: Leaving breakpoint #1 pending warning: Leaving breakpoint #2 pending No symbol file now. (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y ../../../src/gdb/testsuite/gdb.base/solib-symbol-main.c:25 breakpoint already hit 1 time 2 breakpoint keep y ../../../src/gdb/testsuite/gdb.base/solib-symbol-lib.c:22 (gdb) file /home/pedro/gdb/multi_process/build/gdb/testsuite/gdb.base/solib-symbol-main A program is being debugged already. Are you sure you want to change the file? (y or n) y Reading symbols from /home/pedro/gdb/multi_process/build/gdb/testsuite/gdb.base/solib-symbol-main...done. (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x000000000040066c in main at ../../../src/gdb/testsuite/gdb.base/solib-symbol-main.c:25 breakpoint already hit 1 time 2 breakpoint keep y 0x00000000004005a0 ^^^^^^^ (gdb) Oh, the pending breakpoint at foo is now resolved to the plt in the main binary... This happens because there are still calls to breakpoint_re_set in several places, before we get to load the symbols of the SO where foo is defined in. Specifically in this case, this happens when we load the symbols for the main executable, the expression finds the foo@plt symbol and is happy with it. So subsequent loads of SO's symbols don't change the breakpoint anymore. At the point in the code, where the symbols for the main executable are loaded, it isn't possible to know if the user or the target is going to add more symbols afterwards, which means, that we can't remove the breakpoint_re_set call... I'm much inclined to punt on this at this point, as the reported "error" will only trigger across a disconnect/reconnect, and that is not the use case Marc was reporting. What do you think? -- Pedro Alves --Boundary-00=_l4tqIv8jPlSiEZ1 Content-Type: text/x-diff; charset="utf-8"; name="001-pending.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="001-pending.diff" Content-length: 3142 2008-08-18 Pedro Alves gdb/ * linespec.c (symtab_from_filename): Also throw NOT_FOUND_ERROR if there are no symbols loaded, instead of throwing a generic error. (decode_variable): Likewise. gdb/testsuite/ * gdb.base/pending.exp: Test pending breakpoints without symbols loaded. --- gdb/linespec.c | 15 +++++++++------ gdb/testsuite/gdb.base/pending.exp | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) Index: src/gdb/linespec.c =================================================================== --- src.orig/gdb/linespec.c 2008-08-18 21:42:42.000000000 +0100 +++ src/gdb/linespec.c 2008-08-18 21:43:30.000000000 +0100 @@ -1556,10 +1556,11 @@ symtab_from_filename (char **argptr, cha file_symtab = lookup_symtab (copy); if (file_symtab == 0) { - if (!have_full_symbols () && !have_partial_symbols ()) - error (_("No symbol table is loaded. Use the \"file\" command.")); if (not_found_ptr) *not_found_ptr = 1; + if (!have_full_symbols () && !have_partial_symbols ()) + throw_error (NOT_FOUND_ERROR, + _("No symbol table is loaded. Use the \"file\" command.")); throw_error (NOT_FOUND_ERROR, _("No source file named %s."), copy); } @@ -1760,12 +1761,14 @@ decode_variable (char *copy, int funfirs if (msymbol != NULL) return minsym_found (funfirstline, msymbol); - if (!have_full_symbols () && - !have_partial_symbols () && !have_minimal_symbols ()) - error (_("No symbol table is loaded. Use the \"file\" command.")); - if (not_found_ptr) *not_found_ptr = 1; + + if (!have_full_symbols () + && !have_partial_symbols () + && !have_minimal_symbols ()) + throw_error (NOT_FOUND_ERROR, + _("No symbol table is loaded. Use the \"file\" command.")); throw_error (NOT_FOUND_ERROR, _("Function \"%s\" not defined."), copy); } Index: src/gdb/testsuite/gdb.base/pending.exp =================================================================== --- src.orig/gdb/testsuite/gdb.base/pending.exp 2008-08-18 21:42:42.000000000 +0100 +++ src/gdb/testsuite/gdb.base/pending.exp 2008-08-18 21:43:30.000000000 +0100 @@ -54,6 +54,32 @@ if { [gdb_compile_shlib $libsrc $lib_sl gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir + +gdb_test_multiple "break pendfunc1" "set pending breakpoint" { + -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" { + gdb_test "y" "Breakpoint.*pendfunc1.*pending." "set pending breakpoint (without symbols)" + } +} + +gdb_test "info break" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+breakpoint keep y.*PENDING.*pendfunc1.*" \ +"single pending breakpoint info (without symbols)" + +gdb_load ${binfile} +gdb_load_shlibs $lib_sl + +set pendfunc1_loc [gdb_get_line_number "y = x + 4" ${libfile}.c] +gdb_test "run" \ +".*Breakpoint.*pendfunc1.*at.*pendshr.c:$pendfunc1_loc.*y = x \\+ 4.*" \ +"run to resolved breakpoint 1 (without symbols)" + +# Restart with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} gdb_load_shlibs $lib_sl --Boundary-00=_l4tqIv8jPlSiEZ1 Content-Type: text/x-diff; charset="utf-8"; name="002-breakpoint_re_set_one.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="002-breakpoint_re_set_one.diff" Content-length: 2352 2008-08-19 Pedro Alves * breakpoint.c (breakpoint_re_set_one): If parsing failed, and the breakpoint had been inserted before, set it to pending state. (sharedlibrary_command): Disable breakpoints set in solibs, effectively setting them to the pending state. --- gdb/breakpoint.c | 19 +++++++++++++++---- gdb/solib.c | 1 + 2 files changed, 16 insertions(+), 4 deletions(-) Index: src/gdb/breakpoint.c =================================================================== --- src.orig/gdb/breakpoint.c 2008-08-19 12:35:52.000000000 +0100 +++ src/gdb/breakpoint.c 2008-08-19 15:00:02.000000000 +0100 @@ -7485,15 +7485,26 @@ breakpoint_re_set_one (void *bint) if (e.reason < 0) { int not_found_and_ok = 0; + + /* If this breakpoint had been inserted before, but we + cannot parse where to place it anymore, set it to + pending. */ + if (not_found && b->loc && !b->loc->shlib_disabled) + { + warning (_("Leaving breakpoint #%d pending"), + b->number); + b->loc->shlib_disabled = 1; + } + /* For pending breakpoints, it's expected that parsing will fail until the right shared library is loaded. User has already told to create pending breakpoints and don't need extra messages. If breakpoint is in bp_shlib_disabled state, then user already saw the message about that breakpoint being disabled, and don't want to see more errors. */ - if (not_found - && (b->condition_not_parsed - || (b->loc && b->loc->shlib_disabled) + if (not_found + && (b->condition_not_parsed + || b->loc || b->enable_state == bp_disabled)) not_found_and_ok = 1; @@ -7512,7 +7523,7 @@ breakpoint_re_set_one (void *bint) if (not_found) break; - + gdb_assert (sals.nelts == 1); resolve_sal_pc (&sals.sals[0]); if (b->condition_not_parsed && s && s[0]) Index: src/gdb/solib.c =================================================================== --- src.orig/gdb/solib.c 2008-08-19 12:35:52.000000000 +0100 +++ src/gdb/solib.c 2008-08-19 15:00:02.000000000 +0100 @@ -950,6 +950,7 @@ sharedlibrary_command (char *args, int f void no_shared_libraries (char *ignored, int from_tty) { + disable_breakpoints_in_shlibs (); objfile_purge_solibs (); clear_solib (); } --Boundary-00=_l4tqIv8jPlSiEZ1 Content-Type: text/x-diff; charset="utf-8"; name="003-suppress_breakpoint_reset.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="003-suppress_breakpoint_reset.diff" Content-length: 2596 2008-08-18 Pedro Alves * breakpoint.c (defer_breakpoint_re_setting): New. (breakpoint_re_set): Check it. (solib_add, reload_shared_libraries): Mask breakpoint_re_set. --- gdb/breakpoint.c | 8 ++++++++ gdb/solib.c | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) Index: src/gdb/breakpoint.c =================================================================== --- src.orig/gdb/breakpoint.c 2008-08-19 12:17:03.000000000 +0100 +++ src/gdb/breakpoint.c 2008-08-19 12:21:04.000000000 +0100 @@ -7616,6 +7616,8 @@ breakpoint_re_set_one (void *bint) return 0; } +int defer_breakpoint_re_setting = 0; + /* Re-set all breakpoints after symbols have been re-loaded. */ void breakpoint_re_set (void) @@ -7624,6 +7626,12 @@ breakpoint_re_set (void) enum language save_language; int save_input_radix; + if (defer_breakpoint_re_setting) + /* When we're adding symbol files in batch, we defer doing + breakpoint re-setting until all symbols files are loaded -- + e.g., we're loading shared libraries. */ + return; + save_language = current_language->la_language; save_input_radix = input_radix; ALL_BREAKPOINTS_SAFE (b, temp) Index: src/gdb/solib.c =================================================================== --- src.orig/gdb/solib.c 2008-08-19 12:17:15.000000000 +0100 +++ src/gdb/solib.c 2008-08-19 12:25:43.000000000 +0100 @@ -668,10 +668,18 @@ libpthread_solib_p (struct so_list *so) FROM_TTY and TARGET are as described for update_solib_list, above. */ +extern int defer_breakpoint_re_setting; + void solib_add (char *pattern, int from_tty, struct target_ops *target, int readsyms) { struct so_list *gdb; + struct cleanup *old_chain; + + /* Defer reparsing breakpoints until after loading all + libraries. */ + old_chain = make_cleanup_restore_integer (&defer_breakpoint_re_setting); + defer_breakpoint_re_setting = 1; if (pattern) { @@ -721,6 +729,8 @@ solib_add (char *pattern, int from_tty, ops->special_symbol_handling (); } } + + do_cleanups (old_chain); } @@ -959,8 +969,17 @@ static void reload_shared_libraries (char *ignored, int from_tty, struct cmd_list_element *e) { + struct cleanup *old_chain; + no_shared_libraries (NULL, from_tty); + + /* Defer reparsing breakpoints until loading all libraries. */ + old_chain = make_cleanup_restore_integer (&defer_breakpoint_re_setting); + defer_breakpoint_re_setting = 1; + solib_add (NULL, from_tty, NULL, auto_solib_add); + + do_cleanups (old_chain); } static void --Boundary-00=_l4tqIv8jPlSiEZ1--