4082afcc3d
For several RSP packets, there's a corresponding "set remote foo-packet on/off/auto" command that one can use do bypass auto-detection of support for the packet or feature. However, I noticed that setting several of these commands to 'on' or 'off' doesn't actually have any effect. These are, at least: set remote breakpoint-commands-packet set remote conditional-breakpoints-packet set remote fast-tracepoints-packet set remote static-tracepoints-packet set remote install-in-trace-packet These are commands that control a remote protocol feature that doesn't have a corresponding regular packet, and because of that we cache the knowledge of the remote side support as returned by the qSupported packet in the remote_state object. E.g., in the case of the 'set remote breakpoint-commands-packet' command, whether the feature is supported is recorded in the 'breakpoint_commands' field of the remote_state object. Whether to bypass packet support auto-detection or not is controlled by the 'detect' field of the corresponding packet's packet_config structure. That field is the variable associated directly with the "set remote foo-packet" command. Actual remote stub support for the packet (or feature) is recorded in the 'support' field of the same structure. However, when the user toggles the command, the 'support' field is also correspondingly updated to PACKET_ENABLE/DISABLE/SUPPORT_UNKNOWN, discarding the knowledge of whether the target actually supports the feature. If one toggles back to 'auto', it's no big issue for real packets, as they'll just end up re-probed the next time they might be necessary. But features whose support is only reported through qSupported don't get their corresponding (manually added/maintained) fields in remote_state objected updated. As we lost the actual status of the target support for the feature, GDB would need to probe the qSupported features again, which GDB doesn't do. But we can avoid that extra traffic, and clean things up, IMO. Instead of going in that direction, this patch completely decouples struct packet_config's 'detect' and 'support' fields. E.g., when the user does "set remote foo-packet off", instead of setting the packet config's 'support' field to PACKET_DISABLE, the 'support' field is not touched at all anymore. That is, we end up respecting this simple table: | packet_config->detect | packet_config->support | should use packet/feature? | |-----------------------+------------------------+----------------------------| | auto | PACKET_ENABLE | PACKET_ENABLE | | auto | PACKET_DISABLE | PACKET_DISABLE | | auto | PACKET_UNKNOWN | PACKET_UNKNOWN | | yes | don't care | PACKET_ENABLE | | no | don't care | PACKET_DISABLE | This is implemented by the new packet_support function. With that, we need to update this pattern throughout: if (remote_protocol_packets[PACKET_foo].support == PACKET_DISABLE) to do this instead: if (packet_support (PACKET_qAttached) == PACKET_DISABLE) where as mentioned, the packet_support function takes struct packet_config's 'detect' field into account, like in the table above. As when the packet is force-disabled or force-enabled, the 'support' field is just ignored, if the command is set back to auto, we'll resume respecting whatever the target said it supports. IOW, the end result is that the 'support' field always represents whether the target actually supports the packet or not. After all that, the manually maintained breakpoint_commands and equivalent fields of struct remote_state can then be eliminated, with references replaced by checking the result of calling the packet_support function on the corresponding packet or feature. This required adding new PACKET_foo enum values for several features that didn't have it yet. (The patch does not add corresponding "set remote foo-packet" style commands though, focusing only on bug fixing and laying the groundwork). Tested on x86_64 Fedora 17, native GDBserver. The new tests all fail without this patch. gdb/ 2014-04-25 Pedro Alves <palves@redhat.com> * remote.c (struct remote_state): Remove multi_process_aware, non_stop_aware, cond_tracepoints, cond_breakpoints, breakpoint_commands, fast_tracepoints, static_tracepoints, install_in_trace, disconnected_tracing, enable_disable_tracepoints, string_tracing, and augmented_libraries_svr4_read fields. (remote_multi_process_p): Move further below in the file. (struct packet_config): Add comments. (update_packet_config): Delete function. (show_packet_config_cmd): Use packet_config_support. (add_packet_config_cmd): Use NULL as set callback. (packet_ok): "set remote foo-packet"-style commands no longer change config->supported -- adjust. (PACKET_ConditionalTracepoints, PACKET_ConditionalBreakpoints) (PACKET_BreakpointCommands, PACKET_FastTracepoints) (PACKET_StaticTracepoints, PACKET_InstallInTrace): Add comments. (PACKET_QNonStop, PACKET_multiprocess_feature) (PACKET_EnableDisableTracepoints_feature, PACKET_tracenz_feature) (PACKET_DisconnectedTracing_feature) (PACKET_augmented_libraries_svr4_read_feature): New enum values. (set_remote_protocol_packet_cmd): Delete function. (packet_config_support, packet_support): New functions. (set_remote_protocol_Z_packet_cmd): Don't call update_packet_config. (remote_query_attached, remote_pass_signals) (remote_program_signals, remote_threads_info) (remote_threads_extra_info, remote_start_remote): Use packet_support. (remote_start_remote): Use packet_config_support and packet_support. (init_all_packet_configs): Set all packets to unknown support, instead of calling update_packet_config. (remote_check_symbols): Use packet_support. (remote_supported_packet): Unconditionally set the packet config's support status. (remote_multi_process_feature, remote_non_stop_feature) (remote_cond_tracepoint_feature, remote_cond_breakpoint_feature) (remote_breakpoint_commands_feature) (remote_fast_tracepoint_feature, remote_static_tracepoint_feature) (remote_install_in_trace_feature) (remote_disconnected_tracing_feature) (remote_enable_disable_tracepoint_feature) (remote_string_tracing_feature) (remote_augmented_libraries_svr4_read_feature): Delete functions. (remote_protocol_features): Adjust to use remote_supported_packet for "augmented-libraries-svr4-read", "multiprocess", "QNonStop", "ConditionalTracepoints", "ConditionalBreakpoints", "BreakpointCommands", "FastTracepoints", "StaticTracepoints", "InstallInTrace", "DisconnectedTracing", "DisconnectedTracing", "EnableDisableTracepoints", and "tracenz". (remote_query_supported): Use packet_support. (remote_open_1): Adjust. (extended_remote_attach_1): Use packet_support. Switch on the result of packet_ok instead of checking whether the packet ended up disabled. (remote_vcont_resume): Use packet_support. (remote_resume, remote_stop_ns, fetch_register_using_p) (remote_prepare_to_store, store_register_using_P) (check_binary_download, remote_write_bytes): Use packet_support. (remote_vkill): Use packet_support. Switch on the result of packet_ok instead of checking whether the packet ended up disabled. (extended_remote_supports_disable_randomization): Use packet_support. (extended_remote_run): Switch on the result of packet_ok instead of checking whether the packet ended up disabled. (remote_insert_breakpoint, remote_remove_breakpoint) (remote_insert_watchpoint, remote_remove_watchpoint) (remote_insert_hw_breakpoint, remote_remove_hw_breakpoint): Use packet_support. (remote_search_memory): Use packet_config_support. (remote_get_thread_local_address, remote_get_tib_address) (remote_hostio_send_command, remote_can_execute_reverse): Use packet_support. (remote_supports_cond_tracepoints) (remote_supports_cond_breakpoints) (remote_supports_fast_tracepoints) (remote_supports_static_tracepoints) (remote_supports_install_in_trace) (remote_supports_enable_disable_tracepoint) (remote_supports_string_tracing) (remote_can_run_breakpoint_commands): Rewrite, checking whether the packet config says the feature is enabled or disabled. (remote_download_tracepoint, remote_trace_set_readonly_regions) (remote_get_trace_status): Use packet_support. (remote_set_disconnected_tracing): Adjust to check whether the feature is enabled with packet_support. (remote_set_trace_buffer_size, remote_use_agent) (remote_can_use_agent, remote_supports_btrace): Use packet_support. (remote_enable_btrace, remote_disable_btrace, remote_read_btrace): Use packet_config_support. (remote_augmented_libraries_svr4_read): Rewrite, checking whether the packet config says the feature is enabled or disabled. (set_range_stepping): Use packet_support. gdb/testsuite/ 2014-04-25 Pedro Alves <palves@redhat.com> * gdb.base/cond-eval-mode.exp (warning): Move trailing \r\n to user. (top level): Test that "set remote conditional-breakpoints-packet off" works as intended. * gdb.base/dprintf.exp: Test that "set remote breakpoint-commands-packet off" works as intended. * gdb.trace/change-loc.exp (tracepoint_install_in_trace_disabled): New function. (top level): Call it. * gdb.trace/ftrace.exp (test_fast_tracepoints): Test that "set remote fast-tracepoints-packet off" works as intended. * gdb.trace/qtro.exp (gdb_is_target_remote): Moved ... * lib/gdb.exp (gdb_is_target_remote): ... here.
165 lines
4.9 KiB
Text
165 lines
4.9 KiB
Text
# Copyright (C) 2012-2014 Free Software Foundation, Inc.
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
if { [prepare_for_testing dprintf.exp "dprintf" {} {debug}] } {
|
|
return -1
|
|
}
|
|
|
|
set srcfile dprintf.c
|
|
|
|
set bp_location1 [gdb_get_line_number "set breakpoint 1 here"]
|
|
set dp_location1 [gdb_get_line_number "set dprintf 1 here"]
|
|
|
|
if ![runto main] {
|
|
return -1
|
|
}
|
|
|
|
gdb_test "dprintf" "Format string required"
|
|
|
|
gdb_test "dprintf foo" "Format string required"
|
|
|
|
gdb_test "dprintf 29" "Format string required"
|
|
|
|
delete_breakpoints
|
|
|
|
gdb_breakpoint "main"
|
|
|
|
gdb_test "dprintf foo,\"At foo entry\\n\"" \
|
|
"Dprintf .*"
|
|
|
|
gdb_test "ignore \$bpnum 1" ".*Will ignore next crossing of breakpoint.*"
|
|
|
|
gdb_test "dprintf $dp_location1,\"arg=%d, g=%d\\n\", arg, g" \
|
|
"Dprintf .*"
|
|
|
|
gdb_test_sequence "info breakpoints" "dprintf info 1" {
|
|
"\[\r\n\]Num Type Disp Enb Address +What"
|
|
"\[\r\n\]2 breakpoint"
|
|
"\[\r\n\]3 dprintf"
|
|
"\[\r\n\] printf \"At foo entry\\\\n\""
|
|
"\[\r\n\]4 dprintf"
|
|
"\[\r\n\] printf \"arg=%d, g=%d\\\\n\", arg, g"
|
|
}
|
|
|
|
gdb_test "break $bp_location1" \
|
|
"Breakpoint .*"
|
|
|
|
gdb_run_cmd
|
|
|
|
gdb_test "" "Breakpoint"
|
|
|
|
gdb_test "continue" "arg=1234, g=1234.*" "1st dprintf, gdb"
|
|
|
|
gdb_test "continue" "At foo entry.*arg=1235, g=2222.*" "2nd dprintf, gdb"
|
|
|
|
# The "call" style depends on having I/O functions available, so test.
|
|
|
|
if ![target_info exists gdb,noinferiorio] {
|
|
|
|
# Now switch styles and rerun; in the absence of redirection the
|
|
# output should be the same.
|
|
|
|
gdb_test_no_output "set dprintf-style call" "Set dprintf style to call"
|
|
|
|
gdb_run_cmd
|
|
|
|
gdb_test "" "Breakpoint"
|
|
|
|
gdb_test "continue" "At foo entry.*arg=1234, g=1234.*" "1st dprintf, call"
|
|
|
|
gdb_test "continue" "At foo entry.*arg=1235, g=2222.*" "2nd dprintf, call"
|
|
|
|
gdb_test_no_output "set dprintf-function fprintf" "Set dprintf function"
|
|
gdb_test_no_output "set dprintf-channel stderr" "Set dprintf channel"
|
|
|
|
gdb_run_cmd
|
|
|
|
gdb_test "" "Breakpoint"
|
|
|
|
gdb_test "continue" "At foo entry.*arg=1234, g=1234.*" \
|
|
"1st dprintf, fprintf"
|
|
|
|
gdb_test "continue" "At foo entry.*arg=1235, g=2222.*" \
|
|
"2nd dprintf, fprintf"
|
|
}
|
|
|
|
# Now test the "agent" style.
|
|
|
|
set target_can_dprintf 1
|
|
set msg "set dprintf style to agent"
|
|
gdb_test_multiple "set dprintf-style agent" $msg {
|
|
-re "warning: Target cannot run dprintf commands.*\r\n$gdb_prompt $" {
|
|
|
|
# The target reports that it doesn't support target side
|
|
# commands at all.
|
|
set target_can_dprintf 0
|
|
unsupported "$msg"
|
|
}
|
|
-re ".*$gdb_prompt $" {
|
|
pass "$msg"
|
|
}
|
|
}
|
|
|
|
if $target_can_dprintf {
|
|
gdb_run_cmd
|
|
|
|
gdb_test "" "Breakpoint"
|
|
|
|
# Even if the the target reports that it does support target side
|
|
# commands, we can only tell that it supports them in combination
|
|
# with a particular breakpoint type (Z0, Z1, etc.) when we try to
|
|
# insert the breakpoint. When "set breakpoint always-inserted is
|
|
# off", that'll be on next continue.
|
|
set msg "1st dprintf, agent"
|
|
gdb_test_multiple "continue" $msg {
|
|
-re "Warning:.*Target doesn't support breakpoints that have target side commands.*\r\n$gdb_prompt $" {
|
|
set target_can_dprintf 0
|
|
unsupported "$msg"
|
|
}
|
|
-re "Breakpoint \[0-9\]+, foo .*$gdb_prompt $" {
|
|
pass "$msg"
|
|
}
|
|
}
|
|
|
|
if $target_can_dprintf {
|
|
gdb_test "continue" "Breakpoint \[0-9\]+, foo .*" "2nd dprintf, agent"
|
|
|
|
gdb_test_sequence "info breakpoints" "dprintf info 2" {
|
|
"\[\r\n\]Num Type Disp Enb Address +What"
|
|
"\[\r\n\]2 breakpoint"
|
|
"\[\r\n\]\tbreakpoint already hit 2 times"
|
|
"\[\r\n\]3 dprintf"
|
|
"\[\r\n\]\tbreakpoint already hit 2 times"
|
|
"\[\r\n\] agent-printf \"At foo entry\\\\n\""
|
|
"\[\r\n\]4 dprintf"
|
|
"\[\r\n\]\tbreakpoint already hit 2 times"
|
|
"\[\r\n\] agent-printf \"arg=%d, g=%d\\\\n\", arg, g"
|
|
}
|
|
}
|
|
}
|
|
|
|
gdb_test "set dprintf-style foobar" "Undefined item: \"foobar\"." \
|
|
"Set dprintf style to an unrecognized type"
|
|
|
|
# Test that force-disabling the BreakpointCommands RSP feature works
|
|
# as expected. dprintf relies on support for target-side breakpoint
|
|
# commands --- use it as proxy.
|
|
if [gdb_is_target_remote] {
|
|
gdb_test_no_output "set remote breakpoint-commands-packet off"
|
|
gdb_test "set dprintf-style agent" \
|
|
"warning: Target cannot run dprintf commands.*" \
|
|
"set dprintf-style agent, with feature disabled"
|
|
}
|