- Dec 02, 2015
-
-
GDB Administrator authored
-
H.J. Lu authored
Symbol defined by a linker assignment may have type bfd_link_hash_new or bfd_link_hash_undefined. And h->def_regular is always set. elf_i386_convert_load and elf_x86_64_convert_load should check h->def_regular as well as bfd_link_hash_undefined and bfd_link_hash_new to see if a symbol is defined by a linker script. bfd/ PR ld/19319 * elf32-i386.c (elf_i386_convert_load): Check h->def_regular instead of bfd_link_hash_new. * elf64-x86-64.c (elf_x86_64_convert_load): Likewise. Skip relocation overflow for bfd_link_hash_undefined and bfd_link_hash_new if h->def_regular is set. ld/testsuite/ PR ld/19319 * ld-i386/i386.exp: Run pr19319 test. * ld-x86-64/x86-64.exp: Likewise. * ld-i386/pr19319.dd: New file. * ld-i386/pr19319a.S: Likewise. * ld-i386/pr19319b.S: Likewise. * ld-x86-64/pr19319.dd: Likewise. * ld-x86-64/pr19319a.S: Likewise. * ld-x86-64/pr19319b.S: Likewise.
-
Ulrich Weigand authored
GCC 4.1 gives the following warning: gdb/remote.c: In function 'remote_parse_stop_reply': gdb/remote.c:6549: warning: operation on 'p' may be undefined on this line of code: event->ptid = read_ptid (++p, &p); Since p actually isn't used afterwards anyway, simply use NULL. gdb/ * remote.c (remote_parse_stop_reply): Avoid GCC 4.1 "operation may be undefined" warning.
-
Ulrich Weigand authored
Fix a couple of places where a struct thread_item was added to a vector while the item.name field was uninitialized. gdb/ * remote.c (remote_newthread_step): Initialize item.name. (remote_get_threads_with_qthreadinfo): Likewise.
-
- Dec 01, 2015
-
-
Yao Qi authored
This patch handles target aarch64*-*-linux* for syscall instruction. gdb/testsuite: 2015-12-01 Yao Qi <yao.qi@linaro.org> * gdb.base/disp-step-syscall.exp: Define syscall instruction for aarch64*-*-linux* target.
-
Alan Modra authored
* aoutx.h (adjust_sizes_and_vmas): Remove unused text_size and text_end parameters. Update callers. * aout-tic30.c: Update adjust_sizes_and_vmas callers. * hp300hpux.c: Likewise. * i386lynx.c: Likewise. * libaout.h: Likewise. * netbsd.h: Likewise. * pdp11.c: Likewise. * riscix.c: Likewise.
-
Alan Modra authored
No functional changes here. BTW, some of these headers don't seem to be used anywhere: include/aout/dynix3.h, include/aout/encap.h, include/aout/hp.h, gas/config/aout_gnu.h bfd/ * aout-adobe.c: Invoke aout N_* macros with pointer to struct internal_exec. * aout-arm.c: Likewise. * aout-cris.c: Likewise. * aout-target.h: Likewise. * aout-tic30.c: Likewise. * aoutf1.h: Likewise. * aoutx.h: Likewise. * bout.c: Likewise. * freebsd.h: Likewise. * gen-aout.c: Likewise. * hp300hpux.c: Likewise. * i386aout.c: Likewise. * i386linux.c: Likewise. * i386lynx.c: Likewise. * i386mach3.c: Likewise. * i386os9k.c: Likewise. * libaout.h: Likewise. * m68klinux.c: Likewise. * m88kmach3.c: Likewise. * mipsbsd.c: Likewise. * netbsd.h: Likewise. * pc532-mach.c: Likewise. * pdp11.c: Likewise. * riscix.c: Likewise. * sparclinux.c: Likewise. * sparclynx.c: Likewise. gas/ * config/aout_gnu.h: Invoke aout N_* macros with pointer to struct internal_exec. include/ * bout.h: Invoke aout N_* macros with pointer to struct internal_exec. * os9k.h: Likewise. include/aout/ * adobe.h: Invoke aout N_* macros with pointer to struct internal_exec. * aout64.h: Likewise. * dynix3.h: Likewise. * encap.h: Likewise. * hp.h: Likewise. * hp300hpux.h: Likewise. * sun4.h: Likewise.
-
Alan Modra authored
info->traditional_format is available, or can be easily made available. This relegates BFD_TRADITIONAL_FORMAT to AOUT use only. * coff-rs6000.c (_bfd_xcoff_put_symbol_name): Replace abfd param with info param. Test info->traditional_format rather than BFD_TRADITIONAL_FORMAT flag. * coff64-rs6000.c (_bfd_xcoff64_put_symbol_name): Likewise. * libxcoff.h (struct xcoff_backend_data_rec): Update _xcoff_put_symbol_name prototype. (bfd_xcoff_put_symbol_name): Add info param. * xcofflink.c (xcoff_find_tc0): Update bfd_xcoff_put_symbol_name call. (xcoff_write_global_symbol): Likewise. (xcoff_link_input_bfd): Test info->traditional_format rather than BFD_TRADITIONAL_FORMAT flag. * cofflink.c (_bfd_coff_final_link): Likewise. (_bfd_coff_link_input_bfd, _bfd_coff_write_global_sym): Likewise.
-
Alan Modra authored
Missed from f8c2a965. * configure: Regenerate.
-
Alan Modra authored
* po/SRC-POTFILES.in: Regenerate.
-
Alan Modra authored
* elf32-arc.c (ARC_ELF_HOWTO): Delete. (arc_elf_howto): New function. (bfd_elf32_bfd_reloc_type_lookup): Use it in place of existing init code. (bfd_elf32_bfd_reloc_name_lookup): Use arc_elf_howto. (arc_info_to_howto_rel, elf_arc_relocate_section): Likwise. (elf_arc_check_relocs): Likewise.
-
Alan Modra authored
This initialises howto.dst_mask so that relocations in debug sections are applied by the generic reloc processing used by objdump to display debug sections. * elf32-arc.c (arc_elf_howto_init): Init dst_mask.
-
GDB Administrator authored
-
Antoine Tremblay authored
This patch removes too simple implementations of the breakpoint_reinsert_addr operation. The only reason to keep them around was to support thread events when PTRACE_EVENT_CLONE was not present but this support has been removed in a previous patch. No regressions, tested on ubuntu 14.04 ARMv7 and x86. With gdbserver-{native,extended} / { -marm -mthumb } Also compilation was tested on aarch64, bfin, cris, crisv32, m32r, mips, nios2, ppc, s390, sparc, tic6x, tile, xtensa. gdb/gdbserver/ChangeLog: * linux-arm-low.c (arm_reinsert_addr): Remove function. (struct linux_target_ops <breakpoint_reinsert_addr>: Set to NULL. * linux-cris-low.c (cris_reinsert_addr> Remove function. (struct linux_target_ops) <breakpoint_reinsert_addr>: Set to NULL. * linux-crisv32-low.c (cris_reinsert_addr): Remove function. (struct linux_target_ops) <breakpoint_reinsert_addr>: Set to NULL. * linux-mips-low.c (mips_reinsert_addr): Remove function. (struct linux_target_ops) <breakpoint_reinsert_addr>: Set to NULL. * linux-nios2-low.c (nios2_reinsert_addr): Remove function. (struct linux_target_ops) <breakpoint_reinsert_addr>: Set to NULL. * linux-sparc-low.c (sparc_reinsert_addr): Remove function. (struct linux_target_ops) <breakpoint_reinsert_addr>: Set to NULL. -
Antoine Tremblay authored
This patch removes support for thread events if PTRACE_EVENT_CLONE is not supported in GDBServer. Before, on systems that did not support PTRACE_EVENT_CLONE, both GDB and GDBServer coordinated with libthread_db.so to insert breakpoints at magic locations in libpthread.so, in order to break at thread creation and thread death. Simple software single stepping support was implemented to step over these breakpoints in case there was no hardware single stepping support. However, these simple software single stepping implementations were not fit for any other use as discussed in : https://sourceware.org/ml/gdb-patches/2015-04/msg01110.html These too simple implementations conflict with ongoing work to make proper implementations of software single stepping in GDBServer. The problem is that if some implementations are correct and others are not and only there for the thread magic breakpoint, we can't enable features based solely software single step support since some would be broken. To keep the incorrect implementations and allow the new proper ones at the same time we would need to implement fallback code and it quickly becomes ugly and confusing with multiple checks for legacy software single step or proper software single step. However, PTRACE_EVENT_CLONE was first introduced in Linux 2.5.46, released in November 2002. So I think it's reasonable to just remove support for kernels that don't support PTRACE_EVENT_CLONE, and sidestep the libthread_db breakpoints issues entirely. This thread on the mailling list discusses the issue : https://sourceware.org/ml/gdb/2015-10/msg00078.html No regressions, tested on ubuntu 14.04 ARMv7 and x86. With gdbserver-{native,extended} / { -marm -mthumb } gdb/gdbserver/ChangeLog: * linux-low.c (linux_look_up_symbols): Don't call linux_supports_traceclone. * linux-low.h (thread_db_init): Remove use_events argument. * thread-db.c (thread_db_use_event): Remove global variable. (struct thread_db) <td_thr_event_enable_p>: Remove field. (struct thread_db) <td_create_bp>: Remove field. (thread_db_create_event): Remove function. (thread_db_enable_reporting): Likewise. (find_one_thread): Don't check for thread_db_use_events. (attach_thread): Likewise. (thread_db_load_search): Remove td_thr_event_enable_p initialization. (try_thread_db_load_1): Don't check for thread_db_use_events. (thread_db_init): Remove use_events argument and thread events handling. (remove_thread_event_breakpoints): Remove function. (thread_db_detach): Remove call to remove_thred_event_breakpoints.
-
Antoine Tremblay authored
Before this patch there was only one call: can_hardware_single_step. Its implementation was a check on breakpoint_reinsert_addr if NULL it assumed that the target could hardware single step. This patch prepares for the case where this is not true anymore. In order to improve software single stepping in GDBServer the breakpoint_reinsert_addr operation of targets that had a very simple software implementation used only for stepping over thread creation events will be removed. This will create a case where a target does not support hardware single step and has the operation breakpoint_reinsert_addr set to NULL, thus can_hardware_single_step needs to be implemented another way. A new target operation supports_hardware_single_step is introduced and is to return true if the target does support such a feature, support for the feature is manually hardcoded. Note that the hardware single step support was enabled as per the current behavior, I did not check if tile for example really has ptrace singlestep support but since the current implementation assumed it had, I kept it that way. No regressions on Ubuntu 14.04 on ARMv7 and x86. With gdbserver-{native,extended} / { -marm -mthumb } Compilation tested on: aarch64,arm,bfind,crisv32,m32r,ppc,s390,tic6x,tile, xtensa. Not tested : sh. gdb/gdbserver/ChangeLog: * linux-aarch64-low.c (aarch64_supports_hardware_single_step): New function. (struct linux_target_ops) <supports_hardware_single_step>: Initialize. * linux-arm-low.c (arm_supports_hardware_single_step): New function. (struct linux_target_ops) <supports_hardware_single_step>: Initialize. * linux-bfin-low.c (bfin_supports_hardware_single_step): New function. (struct linux_target_ops) <bfin_supports_hardware_single_step>: Initialize. * linux-crisv32-low.c (cris_supports_hardware_single_step): New function. (struct linux_target_ops) <supports_hardware_single_step>: Initialize. * linux-low.c (can_hardware_single_step): Use supports_hardware_single_step. (can_software_single_step): New function. (start_step_over): Call can_software_single_step. (linux_supports_hardware_single_step): New function. (struct target_ops) <supports_software_single_step>: Initialize. * linux-low.h (struct linux_target_ops) <supports_hardware_single_step>: Initialize. * linux-m32r-low.c (m32r_supports_hardware_single_step): New function. (struct linux_target_ops) <supports_hardware_single_step>: Initialize. * linux-ppc-low.c (ppc_supports_hardware_single_step): New function. (struct linux_target_ops) <supports_hardware_single_step> Initialize. * linux-s390-low.c (s390_supports_hardware_single_step): New function. (struct linux_target_ops) <supports_hardware_single_step>: Initialize. * linux-sh-low.c (sh_supports_hardware_single_step): New function. (struct linux_target_ops) <supports_hardware_single_step>: Initialize. * linux-tic6x-low.c (tic6x_supports_hardware_single_step): New function. (struct linux_target_ops) <tic6x_supports_hardware_single_step>: Initialize. * linux-tile-low.c (tile_supports_hardware_single_step): New function. (struct linux_target_ops) <tile_supports_hardware_single_step>: Initialize. * linux-x86-low.c (x86_supports_hardware_single_step) New function. (struct linux_target_ops) <supports_hardware_single_step>: Initialize. * linux-xtensa-low.c (xtensa_supports_hardware_single_step): New function. (struct linux_target_ops) <supports_hardware_single_step>: Initialize. * target.h (struct target_ops): <supports_software_single_step>: New field. (target_supports_software_single_step): New macro. -
Antoine Tremblay authored
Without this patch, when doing a software single step, with for example a conditional breakpoint, gdbserver would wrongly avance the pc of breakpoint_len and skips an instruction. This is due to gdbserver assuming that it's hardware single stepping. When it resumes from the breakpoint address it expects the trap to be caused by ptrace and if it's rather caused by a software breakpoint it assumes this is a permanent breakpoint and that it needs to skip over it. However when software single stepping, this breakpoint is legitimate as it's the reinsert breakpoint gdbserver has put in place to break at the next instruction. Thus gdbserver wrongly advances the pc and skips an instruction. This patch fixes this behavior so that gdbserver checks if it is a reinsert breakpoint from software single stepping. If it is it won't advance the pc. And if there's no reinsert breakpoint there we assume then that it's a permanent breakpoint and advance the pc. Here's a commented log of what would happen before and after the fix on gdbserver : /* Here there is a conditional breakpoint at 0x10428 that needs to be stepped over. */ Need step over [LWP 11204]? yes, found breakpoint at 0x10428 ... /* e7f001f0 is a breakpoint instruction on arm Here gdbserver writes the software breakpoint we would like to hit */ Writing e7f001f0 to 0x0001042c in process 11204 ... Resuming lwp 11220 (continue, signal 0, stop not expected) pending reinsert at 0x10428 stop pc is 00010428 continue from pc 0x10428 ... /* Here gdbserver hit the software breakpoint that was in place for the step over */ stop pc is 0001042c pc is 0x1042c step-over for LWP 11220.11220 executed software breakpoint Finished step over. Could not find fast tracepoint jump at 0x10428 in list (reinserting). /* Here gdbserver writes back the original instruction */ Writing e50b3008 to 0x0001042c in process 11220 Step-over finished. Need step over [LWP 11220]? No /* Here because gdbserver assumes this is a permenant breakpoint it advances the pc of breakpoint_len, in this case 4 bytes, so we have just skipped the instruction that was written back here : Writing e50b3008 to 0x0001042c in process 11220 */ stop pc is 00010430 pc is 0x10430 Need step over [LWP 11220]? No, no breakpoint found at 0x10430 Proceeding, no step-over needed proceed_one_lwp: lwp 11220 stop pc is 00010430 This patch fixes this situation and we get the right behavior : Writing e50b3008 to 0x0001042c in process 11245 Hit a gdbserver breakpoint. Hit a gdbserver breakpoint. Step-over finished. proceeding all threads. Need step over [LWP 11245]? No stop pc is 0001042c pc is 0x1042c Need step over [LWP 11245]? No, no breakpoint found at 0x1042c Proceeding, no step-over needed proceed_one_lwp: lwp 11245 stop pc is 0001042c pc is 0x1042c Resuming lwp 11245 (continue, signal 0, stop not expected) stop pc is 0001042c continue from pc 0x1042c It also works if the value at 0x0001042c is a permanent breakpoint. If so gdbserver will finish the step over, remove the reinserted breakpoint, resume at that location and on the next SIGTRAP gdbserver will trigger the advance PC condition as reinsert_breakpoint_inserted_here will be false. I also tested this against bp-permanent.exp on arm (with a work in progress software single step patchset) without any regressions. It's also tested against x86 bp-permanent.exp without any regression. So both software and hardware single step are tested. No regressions on Ubuntu 14.04 on ARMv7 and x86. With gdbserver-{native,extended} / { -marm -mthumb } gdb/gdbserver/ChangeLog: * linux-low.c (linux_wait_1): Fix pc advance condition. * mem-break.c (reinsert_breakpoint_inserted_here): New function. * mem-break.h (reinsert_breakpoint_inserted_here): New declaration. -
Antoine Tremblay authored
When manually stepping over a permanent breakpoint on ARM we need to fetch the right breakpoint size based on the current instruction set used. Since this is not encoded in the stop_pc, the instruction mode needs to be fetched from the CPSR register. This is done by introducing a new target operation called : breakpoint_kind_from_current_state. For other targets that do not need this, breakpoint_kind_from_pc is used. No regressions, tested on ubuntu 14.04 ARMv7 and x86. With gdbserver-{native,extended} / { -marm -mthumb } gdb/gdbserver/ChangeLog: * linux-arm-low.c (arm_is_thumb_mode): New function. (arm_breakpoint_at): Use arm_is_thumb_mode. (arm_breakpoint_kind_from_current_state): New function. (struct linux_target_ops) <breakpoint_kind_from_current_state>: Initialize. * linux-low.c (linux_wait_1): Call breakpoint_kind_from_current_state. (linux_breakpoint_kind_from_current_state): New function. (struct target_ops <breakpoint_kind_from_current_state>: Initialize. * linux-low.h (struct linux_target_ops) <breakpoint_kind_from_current_state>: New field. * target.h (struct target_ops): Likewise. (target_breakpoint_kind_from_current_state): New macro. -
Pedro Alves authored
When testing with "target remote" with "maint set target-non-stop on", we regressions like this: Running /home/pedro/gdb/mygit/build/../src/gdb/testsuite/gdb.threads/continue-pending-after-query.exp ... FAIL: gdb.threads/continue-pending-after-query.exp: iter 4: continue until exit FAIL: gdb.threads/continue-pending-after-query.exp: iter 6: continue until exit FAIL: gdb.threads/continue-pending-after-query.exp: iter 10: continue until exit === gdb Summary === # of expected passes 28 # of unexpected failures 3 where gdb.log shows: continue Continuing. Remote communication error. Target disconnected.: Connection reset by peer. (gdb) FAIL: gdb.threads/continue-pending-after-query.exp: iter 4: continue until exit Enabling gdb + gdbserver debug logs we see: gdbserver: <<<< exiting linux_wait_1 gdbserver: handling possible serial event gdbserver: Writing resume reply for LWP 11089.11089:0 gdbserver: handling possible serial event gdbserver: GDBserver exiting GDB: Packet received: OK GDB: infrun: prepare_to_wait GDB: Sending packet: $vStopped#55...Packet received: W0;process:2b51 GDB: Sending packet: $vStopped#55...Packet received: OK GDB: infrun: target_wait (-1.0.0, status) = GDB: infrun: -1.0.0 [Thread 0], GDB: infrun: status->kind = no-resumed GDB: Sending packet: $Hgp2b51.2b51#41...Remote connection closed (gdb) FAIL: gdb.threads/continue-pending-after-query.exp: iter 1: continue until exit Notice the "Packet received: W0;process:2b51" followed by vStopped->OK. That means the process exit notification was successfully sent to GDB and GDB fetched it. That makes gdbserver exit, in server.c:process_serial_event: if (!extended_protocol && have_ran && !target_running ()) { /* In non-stop, defer exiting until GDB had a chance to query the whole vStopped list (until it gets an OK). */ if (QUEUE_is_empty (notif_event_p, notif_stop.queue)) { /* Be transparent when GDB is connected through stdio -- no need to spam GDB's console. */ if (!remote_connection_is_stdio ()) fprintf (stderr, "GDBserver exiting\n"); remote_close (); exit (0); } } However, GDB is still busy processing an earlier "no-resumed" event, and sends a "Hg" packet, which errors out with "Remote connection closed". IOW, it's not enough to wait for GDB to query the whole vStopped list, gdbserver needs to wait until the exit event is really processed. The fix is to make gdbserver not disconnect until gdb does. Tested on x86_64 Fedora, native gdbserver, remote + extended-remote + with and without "maint set target-non-stop on". gdb/gdbserver/ChangeLog: 2015-10-14 Pedro Alves <palves@redhat.com> * remote-utils.c (readchar): Don't print "Got EOF" unless debugging gdbserver. * server.c (captured_main): Exit gdbserver if gdb disconnects when in "target remote" mode and there are no processes left to debug. (process_serial_event): Remove 'have_ran' static local and remove logic that exits gdbserver in "target remote" mode. -
Pedro Alves authored
Running killed-outside.exp in with "maint set target-non-stop on" hangs currently. This test has the inferior process die with a SIGKILL while stopped. gdbserver gets a SIGCHLD and reacts by retrieveing the SIGKILL events out of waitpid. But because the process is not resumed from GDB's perspective, the event is left pending. When GDB resumes the process afterwards, the process is not really resumed because it already has the event pending. But nothing wakes up the event loop to consume the event. Handle this in the same way nat/linux-nat.c:linux_nat_resume handles this. gdb/gdbserver/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * linux-low.c (linux_resume): Wake up the event loop before returning.
-
Pedro Alves authored
Say GDB wants to access the inferior process's memory. The current remote general thread is 3, but GDB's switched to thread 2. Because both threads are of the same process, GDB skips making the remote thread be thread 2 as well (sending an Hg packet) before accessing memory (remote.c:set_general_process). However, if thread 3 has exited meanwhile, thread 3 no longer exists on the server and gdbserver points current_thread to NULL. The result is the memory access fails, even through the process still exists. Fix this by making prepare_to_access memory select the thread to access memory through. gdb/gdbserver/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * mem-break.c (check_gdb_bp_preconditions): Remove current_thread check. (set_gdb_breakpoint): If prepare_to_access_memory fails, set *ERR to -1. * target.c (struct thread_search): New structure. (thread_search_callback): New function. (prev_general_thread): New global. (prepare_to_access_memory, done_accessing_memory): New functions. * target.h (prepare_to_access_memory, done_accessing_memory): Replace macros with function declarations.
-
Pedro Alves authored
Testing with "maint set target-non-stop on" causes regressions in tests that rely on TARGET_WAITKIND_NO_RESUMED, which isn't modelled on the RSP. In real all-stop, gdbserver detects the situation and reporst error to GDB, and so the tests (e.g., gdb.threads/no-unwaited-for-left.exp) at fail quickly. But with "maint set target-non-stop on", GDB instead hangs forever waiting for a stop reply that never comes, and so the tests take longer to time out. This adds a new "N" stop reply packet that maps 1-1 to TARGET_WAITKIND_NO_RESUMED. gdb/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> PR 14618 * NEWS (New remote packets): Mention the N stop reply. * remote.c (remote_protocol_features): Add "no-resumed" entry. (remote_query_supported): Report no-resumed+ support. (remote_parse_stop_reply): Handle 'N'. (process_stop_reply): Handle TARGET_WAITKIND_NO_RESUMED. (remote_wait_as): Handle 'N' / TARGET_WAITKIND_NO_RESUMED. (_initialize_remote): Register "set/show remote no-resumed-stop-reply" commands. gdb/doc/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> PR 14618 * gdb.texinfo (Stop Reply Packets): Document the N stop reply. (Remote Configuration): Add the "set/show remote no-resumed-stop-reply" to the available settings table. (General Query Packets): Document the "no-resumed" qSupported feature. gdb/gdbserver/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> PR 14618 * linux-low.c (linux_wait_1): If the last resumed thread is gone, report TARGET_WAITKIND_NO_RESUMED. * remote-utils.c (prepare_resume_reply): Handle TARGET_WAITKIND_NO_RESUMED. * server.c (report_no_resumed): New global. (handle_query) <qSupported>: Handle "no-resumed+". Report "no-resumed+" support. (resume): When the target reports TARGET_WAITKIND_NO_RESUMED, only return error if the client doesn't support no-resumed events. (push_stop_notification): New function. (handle_target_event): Use it. Report TARGET_WAITKIND_NO_RESUMED events if the client supports them. gdb/testsuite/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * gdb.threads/no-unwaited-for-left.exp: Remove setup_kfail calls.
-
Pedro Alves authored
Running the testsuite against gdbserver with "maint set target-non-stop on" stumbled on a set of problems. See code comments for details. This handles my concerns expressed in PR14618. gdb/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> PR 14618 * infrun.c (handle_no_resumed): New function. (handle_inferior_event_1) <TARGET_WAITKIND_NO_RESUMED>: Defer to handle_no_resumed.
-
Pedro Alves authored
The range-stepping tests fail with "maint set target-non-stop on" mode because exec_cmd_expect_vCont_count doesn't know that in non-stop mode, vCont's reply is simply "OK". gdb/testsuite/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * lib/range-stepping-support.exp (exec_cmd_expect_vCont_count): Handle non-stop mode vCont replies.
-
Pedro Alves authored
killed-outside.exp regresses with "maint set target-non-stop on". The logs show: (gdb) continue Continuing. infrun: clear_proceed_status_thread (Thread 9028.9028) infrun: proceed (addr=0xffffffffffffffff, signal=GDB_SIGNAL_DEFAULT) infrun: proceed: resuming Thread 9028.9028 Sending packet: $Z0,3615a03966,1#4b... Notification received: Stop:X9;process:2344 Packet received: E01 Sending packet: $Z0,3615a13970,1#47...Packet received: E01 Sending packet: $Z0,3615a14891,1#4a...Packet received: E01 infrun: resume (step=0, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 9028.9028] at 0x4005e4 Sending packet: $vCont;c:p2344.2344#1a...Packet received: E.target not running. Sending packet: $qXfer:threads:read::0,fff#03...Packet received: l<threads>\n</threads>\n Sending packet: $vStopped#55...Packet received: OK Unexpected vCont reply in non-stop mode: E.target not running. (gdb) remote_async_inferior_event_handler infrun: target_wait (-1.0.0, status) = infrun: 9028.0.0 [process 9028], infrun: status->kind = signalled, signal = GDB_SIGNAL_KILL infrun: TARGET_WAITKIND_SIGNALLED Program terminated with signal SIGKILL, Killed. The program no longer exists. infrun: stop_waiting infrun: clear_step_over_info infrun: stop_all_threads remote_thread_exit_events(1) Note the "Unexpected vCont reply" error. I traced it to a problem in status_pending_p_callback. It resumes an LWP when it shouldn't. gdb/gdbserver/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * linux-low.c (thread_still_has_status_pending_p): Don't check vCont;t here. (lwp_resumed): New function. (status_pending_p_callback): Return early if the LWP is not supposed to be resumed.
-
Pedro Alves authored
When testing with "maint set target-non-stop on", a few threading-related tests expose an issue that requires new RSP packets. Say there are 3 threads running, 1-3. If GDB tries to stop thread 1, 2 and 3, and then waits for their stops, but meanwhile say, thread 2 exits, GDB hangs forever waiting for a stop for thread 2 that won't ever happen. This patch fixes the issue by adding support for thread exit events to the protocol. However, we don't want these always enabled, as they're useless most of the time, and would slow down remote debugging. So I made it so that GDB can enable/disable them, and then made gdb do that around the cases that need it, which currently is only infrun.c:stop_all_threads. In turn, if we have thread exit events, then the extra "thread x exited" traffic slows down attach-many-short-lived-threads.exp enough that gdb has trouble keeping up with new threads that are spawned while gdb tries to stop existing ones. To fix that I added support for the counterpart thread created events too. Enabling those when we try to stop threads ensures that new threads never get a chance to themselves start new threads, killing the race. gdb/doc/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * gdb.texinfo (Remote Configuration): List "set/show remote thread-events" command in configuration table. (Stop Reply Packets): Document "T05 create" stop reason and 'w' stop reply. (General Query Packets): Document QThreadEvents packet. Document QThreadEvents qSupported feature. gdb/gdbserver/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * linux-low.c (handle_extended_wait): Assert that the LWP's waitstatus is TARGET_WAITKIND_IGNORE. If GDB wants to hear about thread create events, leave the new child's status pending. (linux_low_filter_event): If GDB wants to hear about thread exit events, leave the LWP marked dead and don't delete it. (linux_wait_for_event_filtered): Don't check for thread exit. (filter_exit_event): New function. (linux_wait_1): Use it, when returning an exit event. (linux_resume_one_lwp_throw): Assert that the LWP's waitstatus is TARGET_WAITKIND_IGNORE. * remote-utils.c (prepare_resume_reply): Handle TARGET_WAITKIND_THREAD_CREATED and TARGET_WAITKIND_THREAD_EXITED. * server.c (report_thread_events): New global. (handle_general_set): Handle QThreadEvents. (handle_query) <qSupported>: Handle and report QThreadEvents+; (handle_target_event): Handle TARGET_WAITKIND_THREAD_CREATED and TARGET_WAITKIND_THREAD_EXITED. * server.h (report_thread_events): Declare. gdb/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * NEWS (New commands): Mention "set/show remote thread-events" commands. (New remote packets): Mention thread created/exited stop reasons and QThreadEvents packet. * infrun.c (disable_thread_events): New function. (stop_all_threads): Disable/enable thread create/exit events. Handle TARGET_WAITKIND_THREAD_EXITED. (handle_inferior_event_1): Handle TARGET_WAITKIND_THREAD_CREATED and TARGET_WAITKIND_THREAD_EXITED. * remote.c (remove_child_of_pending_fork): Also remove threads of threads that have TARGET_WAITKIND_THREAD_EXITED events. (remote_parse_stop_reply): Handle "create" magic register. Handle 'w' stop reply. (initialize_remote): Install remote_thread_events as to_thread_events target hook. (remote_thread_events): New function. * target-delegates.c: Regenerate. * target.c (target_thread_events): New function. * target.h (struct target_ops) <to_thread_events>: New field. (target_thread_events): Declare. * target/waitstatus.c (target_waitstatus_to_string): Handle TARGET_WAITKIND_THREAD_CREATED and TARGET_WAITKIND_THREAD_EXITED. * target/waitstatus.h (enum target_waitkind) <TARGET_WAITKIND_THREAD_CREATED, TARGET_WAITKIND_THREAD_EXITED): New values.
-
Pedro Alves authored
Testing with the extended-remote board with "maint set target-non-stop on" shows a dprintf-non-stop.exp regression. The issue is simply that the test is expecting output that is only valid for the native target: native: [process 8676] #1 stopped. remote: [Thread 8900.8900] #1 stopped. In order to expose this without "maint set target-non-stop on", this restarts gdb with non-stop mode already enabled. gdb/testsuite/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * gdb.base/dprintf-non-stop.exp: Use build_executable instead of prepare_for_testing. Start gdb with "set non-stop on" appended to GDBFLAGS. Lax expected stop output.
-
Pedro Alves authored
Running attach-many-short-lived-threads.exp with the extended-remote board with "maint set target-non-stop on" times out -- the attach never completes. Enabling infrun debug logs, we see that GDB is stuck stopping all threads: infrun: target_wait (-1.0.0, status) = infrun: 1639.22213.0 [Thread 1639.22213], infrun: status->kind = stopped, signal = GDB_SIGNAL_0 infrun: Thread 1639.22260 not executing infrun: Thread 1639.22256 not executing infrun: Thread 1639.22258 not executing infrun: Thread 1639.22257 not executing infrun: Thread 1639.22259 not executing infrun: Thread 1639.22255 not executing infrun: Thread 1639.22253 executing, already stopping infrun: Thread 1639.22251 executing, already stopping infrun: Thread 1639.22252 executing, already stopping infrun: Thread 1639.22250 executing, already stopping infrun: Thread 1639.22254 executing, already stopping infrun: Thread 1639.22247 executing, already stopping infrun: Thread 1639.22213 not executing infrun: Thread 1639.22207 not executing infrun: Thread 1639.22201 not executing infrun: Thread 1639.22219 not executing infrun: Thread 1639.1639 not executing ** HANG HERE ** GDB is waiting for the stop replies of any of those "already stopping" threads. Take 22253 for example. On the gdbserver logs we see: ... resume_stop request for LWP 22253 stopping LWP 22253 Sending sigstop to lwp 22253 linux_resume done ... and: my_waitpid (-1, 0x40000001) my_waitpid (-1, 0x80000001): status(3057f), 22253 LWFE: waitpid(-1, ...) returned 22253, ERRNO-OK LLW: waitpid 22253 received Trace/breakpoint trap (stopped) pc is 0x3615ef4ce1 HEW: Got clone event from LWP 22253, new child is LWP 22259 but from here on, we never see any other event for LWP 22253. In particular, we never see the expected SIGSTOP (from "Sending sigstop" above). The issue is that linux_resume_stopped_resumed_lwps never re-resumes the 22253 after the clone event. gdb/gdbserver/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * linux-low.c (resume_stopped_resumed_lwps): Don't check whether the thread's last_resume_kind was resume_stop.
-
Pedro Alves authored
With "maint set target-non-stop on", the attach tests occasionally crash gdbserver. Basically, gdb attaches with vAttach;PID, and then shortly after reads the xml target description for that process, to figure out the process' architecture. On the gdbserver side, the target description is only filled in when the first process/thread in the thread group reports its initial PTRACE_ATTACH SIGSTOP. So if GDB is fast enough, it can read the target description _before_ that initial stop, and then gdbserver dies dereferencing a NULL tdesc pointer. gdb/gdbserver/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * linux-low.c (linux_attach): In non-stop mode, wait for one stop before returning.
-
Pedro Alves authored
There's currently no non-stop equivalent of the all-stop ^C (\003) "packet" that GDB sends when a ctrl-c is pressed while a foreground command is active. There's vCont;t, but that's defined to cause a "signal 0" stop. This fixes many tests that type ^C, when testing with extended-remote with "maint set target-non-stop on". E.g.: Continuing. talk to me baby PASS: gdb.base/interrupt.exp: process is alive a a PASS: gdb.base/interrupt.exp: child process ate our char ^C [Thread 22730.22730] #1 stopped. 0x0000003615ee6650 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:81 81 T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS) (gdb) FAIL: gdb.base/interrupt.exp: send_gdb control C p func1 () gdb/ 2015-11-30 Pedro Alves <palves@redhat.com> * NEWS (New remote packets): Mention vCtrlC. * remote.c (PACKET_vCtrlC): New enum value. (async_remote_interrupt): Call target_interrupt instead of target_stop. (remote_interrupt_as): Remove 'ptid' parameter. (remote_interrupt_ns): New function. (remote_stop): Adjust. (remote_interrupt): If the target is in non-stop mode, try interrupting with vCtrlC. (initialize_remote): Install set remote ctrl-c packet. gdb/doc/ 2015-11-30 Pedro Alves <palves@redhat.com> * gdb.texinfo (Bootstrapping): Add "interrupting remote targets" anchor. (Packets): Document vCtrlC. gdb/gdbserver/ 2015-11-30 Pedro Alves <palves@redhat.com> * server.c (handle_v_requests): Handle vCtrlC.
-
Pedro Alves authored
Running local-watch-wrong-thread.exp with "maint set target-non-stop on" exposes that gdb/remote.c only records whether the target stopped for a breakpoint/watchpoint plus the watchpoint data address *for the last reported remote event*. But in non-stop mode, we need to keep that info per-thread, as each thread can end up with its own last-status pending. gdb/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * remote.c (struct remote_state) <remote_watch_data_address, stop_reason>: Delete fields. (struct private_thread_info) <stop_reason, watch_data_address>: New fields. (resume_clear_thread_private_info): New function. (append_pending_thread_resumptions): Call it. (remote_resume): Clear all threads' private info. (process_stop_reply): Adjust. (remote_wait_as): Don't reference remote_state's stop_reason field. (remote_stopped_by_sw_breakpoint) (remote_stopped_by_hw_breakpoint, remote_stopped_by_watchpoint) (remote_stopped_data_address): Adjust to refer get data from the current thread.
-
Pedro Alves authored
This fixes a gdbserver crash when running gdb.threads/non-ldr-exc-1.exp with "maint set target-non-stop on". The problem is that qSymbol is called when gdbserver has current_thread == NULL. gdb/gdbserver/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * gdbthread.h (find_any_thread_of_pid): Declare. * inferiors.c (thread_of_pid, find_any_thread_of_pid): New functions. * server.c (handle_query): If current_thread is NULL, look for another thread of the selected process.
-
Pedro Alves authored
When running with "maint set target-non-stop on", and in all-stop mode, nothing is stopping all threads after attaching. vAttach in non-stop can leave all threads running and GDB has to explicitly pause them. This is not visible with the native target, as in that case, attach always stops all threads (the core re-resumes them in case of "attach&"). In addition, it's not defined which thread manages to report the initial attach stop, so always pick the lowest one (otherwise multi-attach.exp regresses). gdb/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * infcmd.c (attach_post_wait): If the target is always in non-stop mode, and the UI is in all-stop mode, stop all threads and pick the one with lowest number as current.
-
Pedro Alves authored
This is the first pass at implementing support for all-stop mode running against the remote target using the non-stop variant of the protocol. The trickiest part here is the initial connection setup/synching. We need to fetch all inferiors' target descriptions etc. before stopping threads, because stop_all_threads needs to read the threads' registers (to record each thread's stop_pc). But OTOH, the initial inferior setup (target_post_attach, post_create_inferior, etc.), only works correctly if the inferior is stopped... So I've split that initial setup part from attach_command_post_wait to a separate function, and added a "still needs setup" flag to the inferior structure. This is similar to gdbserver/linux-low.c's handling of discovering the process's target description). Then if on connection all threads of the remote inferior are running, when we go about stopping them, as soon as they stop we call setup_inferior, from within stop_all_threads. Also, in all-stop, we need to process all the initial stop replies to learn about all the pending signal the threads may already be stopped for, and pick the one to report as current. This is exposed by gdb.threads/reconnect-signal.exp. gdb/ 2015-11-30 Pedro Alves <palves@redhat.com> * gdbthread.h (switch_to_thread_no_regs): Declare. * infcmd.c (setup_inferior): New function, factored out from ... (attach_command_post_wait): ... this. Rename to ... (attach_post_wait): ... this. Replace parameter async_exec with attach_post_wait_mode parameter. Adjust. (enum attach_post_wait_mode): New enum. (struct attach_command_continuation_args): Replace 'async_exec' field with 'mode' field. (attach_command_continuation): Adjust. (attach_command): Add comment. Mark the inferior as needing setup. Adjust to use enum attach_post_wait_mode. (notice_new_inferior): Use switch_to_thread_no_regs. Adjust to use enum attach_post_wait_mode. * inferior.h (setup_inferior): Declare. (struct inferior) <needs_setup>: New field. * infrun.c (set_last_target_status): Make extern. (stop_all_threads): Make extern. Setup inferior, if necessary. * infrun.h (set_last_target_status, stop_all_threads): Declare. * remote-notif.c (remote_async_get_pending_events_handler) (handle_notification): Replace non_stop checks with target_is_non_stop_p() checks. * remote.c (remote_notice_new_inferior): Remove non_stop check. (remote_update_thread_list): Replace non_stop check with target_is_non_stop_p() check. (print_one_stopped_thread): New function. (process_initial_stop_replies): New 'from_tty' parameter. "Notice" all new live inferiors after storing initial stops as pending status in each corresponding thread. If all-stop, stop all threads, try picking a signalled thread as current, and print the status of that one thread. Record the last target status. (remote_start_remote): Replace non_stop checks with target_is_non_stop_p() checks. Don't query for the remote current thread of use qOffsets here. Pass from_tty to process_initial_stop_replies. (extended_remote_attach): Replace non_stop checks with target_is_non_stop_p() checks. (extended_remote_post_attach): Send qOffsets here. (remote_vcont_resume, remote_resume, remote_stop) (remote_interrupt, remote_parse_stop_reply, remote_wait): Replace non_stop checks with target_is_non_stop_p() checks. (remote_async): If target is non-stop, mark/clear the pending events token. * thread.c (switch_to_thread_no_regs): New function.
-
Pedro Alves authored
Testing with "maint set target-non-stop on" makes mi-nonstop.exp run with the extended-remote board. That reveals that mi-nonstop.exp is using the wrong predicate to check for "using remote protocol". This is not visible today because non-stop tests all fail to run with extended-remote board, because they spawn gdb and then do "set non-stop on". However, with that board, gdb connects to the gdbserver from within mi_gdb_start, and changing non-stop when already connected doesn't work. Fix that by instead enabling non-stop mode on gdb's command line. gdb/testsuite/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * gdb.mi/mi-nonstop.exp: Append "set non-stop on" to GDBFLAGS instead of issuing "-gdb-set non-stop 1" after starting gdb. Use mi_is_target_remote instead of checking "is_remote target". * lib/gdb.exp (gdb_is_target_remote): Rename to ... (gdb_is_target_remote_prompt): ... this, and add 'prompt_regexp' parameter. (gdb_is_target_remote): Reimplement. * lib/mi-support.exp (mi_is_target_remote): New procedure.
-
Pedro Alves authored
There should be only one date in multi-author entries.
-
- Nov 30, 2015
-
-
Andrew Burgess authored
When the DWARF address size is 32-bit, but the host machine is 64-bit, objdump fails to spot base addresses specified in the .debug_ranges and .debug_loc lists. As an example, here is the output when dumping an example .debug_ranges section with the pre-patched objdump: Contents of the .debug_ranges section: Offset Begin End 00000000 ffffffff 00000004 (start > end) 00000000 00000000 00000004 00000000 ffffffff 00000008 (start > end) 00000000 00000000 00000004 00000000 <End of list> And this is what the same section looks like when dumped with the patched version of objdump: Contents of the .debug_ranges section: Offset Begin End 00000000 ffffffff 00000004 (base address) 00000000 00000004 00000008 00000000 ffffffff 00000008 (base address) 00000000 00000008 0000000c 00000000 <End of list> binutils/ChangeLog: * dwarf.c (is_max_address): New function. (display_loc_list): Remove out of date comment, use is_max_address. (display_debug_ranges): Likewise. binutils/testsuite/ChangeLog: * binutils-all/objdump.exp: Add test for .debug_ranges decode. * binutils-all/dw2-ranges.S: New file. * binutils-all/dw2-ranges.W: New file. -
GDB Administrator authored
-
- Nov 29, 2015
-
-
Cary Coutant authored
binutils/ * MAINTAINERS: Update my email address.
-
GDB Administrator authored
-