Yao writes:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GDB gets an internal error when it connects to GDBserver started with
'--disable-packet=qC'.
Sending packet: $QNonStop:0#8c...Packet received: OK
Sending packet: $?#3f...Packet received: T0505:00000000;04:00f0ffbf;08:b0c2e44c;thread:p4255.4255;core:1;
Sending packet: $Hc-1#09...Packet received: E01
Sending packet: $qC#b4...Packet received:
Sending packet: $qAttached:a410#bf...Packet received: E01
Packet qAttached (query-attached) is supported
warning: Remote failure reply: E01
Sending packet: $qOffsets#4b...Packet received:
../../../git/gdb/target.c:3248: internal-error: Can't determine the current address space of thread Thread 16981
When start remote, the call chain is as follows,
remote_start_remote
add_current_inferior_and_thread <--[1]
...
start_remote
wait_for_inferior
remote_wait_as
process_stop_reply
get_thread_arch_regcache <--[2]
remote_notice_new_inferior <--[3]
GDB sends packet "qC" in [1] and adds the thread/inferior if the remote
stubs understands "qC". In [2], GDB looks for the inferior to build a
regcache, and notices a new inferior in [3]. As we can see, GDB assumes
that the inferior can be found in [2]. Once the remote stub doesn't
support "qC", GDB can't look for the inferior in [2], and emits an
internal error.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Right after the initial connection, we query the target for its state,
with the ? packet. We store the resulting wait status / stop reply
aside, and query the target for the current thread, using qC, which
fails, so we fake a ptid for the target's thread. We then later,
after the initial setup, end up consuming that set-aside wait status,
parsing the T stop reply, which contains a "thread" "register" (which
was the thread the target would have replied to qC). We get into
trouble because the ptid in that stop reply doesn't match our faked up
ptid in the initial setup, although the target threads are the same...
So we had the T stop reply handy all along. We might as well extract
the thread's ptid from it, and avoid all the resulting issues.
qC is also used after vRun, in order to discover the new process'es
main thread. But, vRun's reply is also a wait status, just like
'?''s, which is quite convenient.
This means that if we have a "Txx thread: ptid" reply, then we don't
really need qC. The patch makes GDB look in the T reply first, and if
not found, try with qC. The packet handling seems to have been added
in gdb-4.18 (1999), and I see that in that same release, "Txx thread:
ptid" didn't exist yet, which probably explains why nobody though of
doing this before.
Regression tested against a gdbserver with qC disabled (and then
enabled), on x86_64 Fedora 17.
2013-01-25 Pedro Alves <palves@redhat.com>
* remote.c (stop_reply_extract_thread): New.
(add_current_inferior_and_thread): New parameter 'wait_status'.
Handle it.
(remote_start_remote): Pass wait status to
add_current_inferior_and_thread.
(extended_remote_run): Update comment.
(extended_remote_create_inferior_1): Pass wait status to
add_current_inferior_and_thread.
Pedro Alves <palves@redhat.com>
PR remote/14786
* remote.c (remote_threads_info): Make a copy of the reply from
qfThreadInfo and use that instead of rs->buf.
Two modifications:
1. The addition of 2013 to the copyright year range for every file;
2. The use of a single year range, instead of potentially multiple
year ranges, as approved by the FSF.
2012-12-15 Yao Qi <yao@codesourcery.com>
* remote.c (getpkt_or_notif_sane): Add one more argument in
its declaration.
(getpkt_or_notif_sane_1): Add one more argument.
(getpkt_sane): Update caller.
(getpkt_or_notif_sane): Likewise. Update call
togetpkt_or_notif_sane_1.
(remote_wait_ns): Update caller.
there is an error inserting hardware breakpoints and use the
error message from the target.
* gdb/breakpoint.c (insert_bp_location, insert_breakpoint_locations):
Catch this exception and print the error message contained within. Do not
print the default hardware error breakpoint message in this case.
* cli/cli-cmds.c (max_user_call_depth): Add 'unsigned'.
(init_cmds): Call add_setshow_uinteger_cmd for command
'max-user-call-depth'.
* cli/cli-script.c (execute_user_command): Add 'unsigned' to the
declaration of 'max_user_call_depth'.
* frame.c (backtrace_limit): Add 'unsigned'.
(_initialize_frame): Call add_setshow_uinteger_cmd for command
'limit'.
* remote.c (remoteaddresssize): Add 'unsigned'.
(remote_address_masked): Change local var 'address_size' to
'unsigned'.
(_initialize_remote): Call add_setshow_uinteger_cmd for
'remoteaddresssize'.
* top.c (history_size): Add 'unsigned'.
(show_commands): Change local variables to 'unsigned'.
(set_history_size_command): Don't check history_size is negative.
Adjust the condition to call unstifle_history and set history_size
to UNIT_MAX.
2012-06-28 Jan Kratochvil <jan.kratochvil@redhat.com>
Pedro Alves <palves@redhat.com>
* gdbthread.h (ALL_THREADS): New macro.
(thread_list): Declare.
* infrun.c (handle_inferior_event) <spurious signal>: Don't keep
going, but instead fall through to the stepping handling.
* linux-nat.c (resume_lwp): New parameter 'signo'. Resume with
the passed in signal. Adjust debug output.
(resume_callback): Rename to ...
(linux_nat_resume_callback): ... this. Pass the thread's last
stop signal, if in "pass" state.
(linux_nat_resume): Adjust to rename.
(stop_wait_callback): New assertion. Don't respawn signals;
instead let the LWP remain with SIGNALLED set.
(linux_nat_wait_1): Remove flushing of pending SIGSTOPs.
* remote.c (append_pending_thread_resumptions): New.
(remote_vcont_resume): Call it.
* target.h (target_resume): Extend comment.
gdb/testsuite/
2012-06-28 Jan Kratochvil <jan.kratochvil@redhat.com>
Pedro Alves <palves@redhat.com>
* gdb.threads/siginfo-threads.exp: New file.
* gdb.threads/siginfo-threads.c: New file.
* gdb.threads/sigstep-threads.exp: New file.
* gdb.threads/sigstep-threads.c: New file.
Hui Zhu <teawater@gmail.com>
Yao Qi <yao@codesourcery.com>
* remote.c (struct remote_state): New field `starting_up'.
(remote_start_remote): Set and clear it.
(remote_can_download_tracepoint): If starting up, return false.
* remote.c (remote_supports_cond_breakpoints): New forward
declaration.
(remote_add_target_side_condition): New function.
(remote_insert_breakpoint): Add target-side breakpoint
conditional if supported.
(remote_insert_hw_breakpoint): Likewise.
(init_remote_ops): Set to_supports_evaluation_of_breakpoint_conditions
hook.
* target.c (update_current_target): Inherit
to_supports_evaluation_of_breakpoint_conditions.
Default to_supports_evaluation_of_breakpoint_conditions to return_zero.
* target.h (struct target_ops)
<to_supports_evaluation_of_breakpoint_conditions>: New field.
(target_supports_evaluation_of_breakpoint_conditions): New #define.
* breakpoint.c (get_first_locp_gte_addr): New forward declaration.
(condition_evaluation_both, condition_evaluation_auto,
condition_evaluation_host, condition_evaluation_target,
condition_evaluation_enums, condition_evaluation_mode_1,
condition_evaluation_mode): New static globals.
(translate_condition_evaluation_mode): New function.
(breakpoint_condition_evaluation_mode): New function.
(gdb_evaluates_breakpoint_condition_p): New function.
(ALL_BP_LOCATIONS_AT_ADDR): New helper macro.
(mark_breakpoint_modified): New function.
(mark_breakpoint_location_modified): New function.
(set_condition_evaluation_mode): New function.
(show_condition_evaluation_mode): New function.
(bp_location_compare_addrs): New function.
(get_first_location_gte_addr): New helper function.
(set_breakpoint_condition): Free condition bytecode if locations
has become unconditional. Call mark_breakpoint_modified (...).
(condition_command): Call update_global_location_list (1) for
breakpoints.
(breakpoint_xfer_memory): Use is_breakpoint (...).
(is_breakpoint): New function.
(parse_cond_to_aexpr): New function.
(build_target_condition_list): New function.
(insert_bp_location): Handle target-side conditional
breakpoints and call build_target_condition_list (...).
(update_inserted_breakpoint_locations): New function.
(insert_breakpoint_locations): Handle target-side conditional
breakpoints.
(bpstat_check_breakpoint_conditions): Add comment.
(bp_condition_evaluator): New function.
(bp_location_condition_evaluator): New function.
(print_breakpoint_location): Print information on where the condition
will be evaluated.
(print_one_breakpoint_location): Likewise.
(init_bp_location): Call mark_breakpoint_location_modified (...) for
breakpoint location.
(force_breakpoint_reinsertion): New functions.
(update_global_location_list): Handle target-side breakpoint
conditions.
Reinsert locations that are already inserted if conditions have
changed.
(bp_location_dtor): Free agent expression bytecode.
(disable_breakpoint): Call mark_breakpoint_modified (...).
Call update_global_location_list (...) with parameter 1 for breakpoints.
(disable_command): Call mark_breakpoint_location_modified (...).
Call update_global_location_list (...) with parameter 1 for breakpoints.
(enable_breakpoint_disp): Call mark_breakpoint_modified (...).
(enable_command): mark_breakpoint_location_modified (...).
(_initialize_breakpoint): Update documentation and add
condition-evaluation breakpoint subcommand.
* breakpoint.h: Include ax.h.
(condition_list): New data structure.
(condition_status): New enum.
(bp_target_info) <cond_list>: New field.
(bp_location) <condition_changed, cond_bytecode>: New fields.
(is_breakpoint): New prototype.
* remote.c (remote_state) <cond_breakpoints>: New field.
(PACKET_ConditionalBreakpoints): New enum.
(remote_cond_breakpoint_feature): New function.
(remote_protocol_features): Add new ConditionalBreakpoints entry.
(remote_supports_cond_breakpoints): New function.
(_initialize_remote): Add new packet configuration for
target-side conditional breakpoints.
2012-02-15 Pedro Alves <palves@redhat.com>
* remote.c (remote_detach_1, extended_remote_attach_1): Tweak
output to be like native targets'.
(remote_pid_to_str): Special case the null ptid.
gdb/testsuite/
2012-02-15 Pedro Alves <palves@redhat.com>
Support extended-remote. Avoid cascading timeouts.
* gdb.base/attach.exp (do_attach_tests): Add expected output for
the extended-remote target. If attaching with no file fails, load
the file manually.
* gdb.server/ext-attach.exp: Adjust expected attach/detach output.
known by gdb. Such monitor commands can take a long time
to execute. An example of this is the "leak_search" monitor
command implemented in the Valgrind gdbserver.
Currently, gdb will timeout on such a monitor command.
The remote stub however will continue to execute the
command and send the output later. Gdb and the remote
stub can then be desynchronised : gdb sends a packet,
and the reply read from the stub is a previous packet.
The change committed uses getpkt_sane to detect a timeout.
In this case, it continues the loop.
A QUIT; is inserted in the loop to allow the user
to stop handling the current command. possibly
still creating a desynchronisation between gdb and the stub
but that will be upon user request.
2012-02-02 Pedro Alves <palves@redhat.com>
* tracepoint.c (cmd_qtminftpilen): Return 0 if there's no current
inferior.
gdb/
2012-02-02 Pedro Alves <palves@redhat.com>
* remote.c (remote_get_min_fast_tracepoint_insn_len): Return 0 if
the current inferior has no execution. Make sure the current
remote process matches gdb's current inferior.
* remote.c (remote_add_inferior): New `fake_pid_p' parameter. Use
it.
(remote_notice_new_inferior): If the remote end doesn't support
the multiprocess extensions, then the PID is fake.
(add_current_inferior_and_thread): New.
(remote_start_remote): Use it.
(extended_remote_attach_1): Adjust.
(extended_remote_create_inferior_1): Use
add_current_inferior_and_thread.
Ulrich Weigand <ulrich.weigand@linaro.org>
ChangeLog:
* remote.c (remote_multi_process_p): Only check for multi-process
protocol feature, do not check for extended protocol.
(remote_supports_multi_process): Check for extended protocol here.
(set_general_process): Likewise.
(extended_remote_kill): Likewise.
(remote_pid_to_str): Likewise.
(remote_query_supported): Always query multiprocess mode.
gdbserver/ChangeLog:
* server.c (handle_v_requests): Only support vAttach and vRun to
start multiple processes when in extended protocol mode.
Ulrich Weigand <ulrich.weigand@linaro.org>
* inferior.h (struct inferior): Add fake_pid_p.
* inferior.c (exit_inferior_1): Clear fake_pid_p.
* remote.c (remote_start_remote): Set fake_pid_p if we have to use
magic_null_ptid since the remote side doesn't provide a real PID.