mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
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.
167 lines
4.1 KiB
Plaintext
167 lines
4.1 KiB
Plaintext
# Copyright 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/>.
|
|
|
|
# Test 'set breakpoint condition-evaluation' settings
|
|
|
|
standard_testfile
|
|
|
|
if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
|
|
return -1
|
|
}
|
|
|
|
if ![runto_main] then {
|
|
fail "Can't run to main"
|
|
return 0
|
|
}
|
|
|
|
set test_host "set breakpoint condition-evaluation host"
|
|
set test_auto "set breakpoint condition-evaluation auto"
|
|
set test_target "set breakpoint condition-evaluation target"
|
|
|
|
gdb_test_no_output $test_host
|
|
gdb_test_no_output $test_auto
|
|
|
|
# If target-side condition evaluation is not supported, this warning will be
|
|
# displayed.
|
|
set warning "warning: Target does not support breakpoint condition evaluation.\r\nUsing host evaluation mode instead."
|
|
|
|
gdb_test_multiple $test_target $test_target {
|
|
-re "$warning\r\n$gdb_prompt $" {
|
|
unsupported $test_target
|
|
return -1
|
|
}
|
|
|
|
-re "^$test_target\r\n$gdb_prompt $" {
|
|
pass $test_target
|
|
}
|
|
}
|
|
|
|
# We now know that the target supports target-side conditional
|
|
# evaluation. Now make sure we can force-disable the
|
|
# ConditionalBreakpoints RSP feature.
|
|
if [gdb_is_target_remote] {
|
|
gdb_test_no_output "set remote conditional-breakpoints-packet off"
|
|
|
|
gdb_test $test_target "$warning" \
|
|
"set breakpoint condition-evaluation target, with support disabled"
|
|
|
|
# Confirm we can re-enable it.
|
|
gdb_test_no_output "set remote conditional-breakpoints-packet on"
|
|
gdb_test_no_output $test_target "restore $test_target"
|
|
}
|
|
|
|
# Test setting a condition in a breakpoint. BREAK_COMMAND is the
|
|
# break/hwatch command to test.
|
|
#
|
|
proc test_break { break_command } {
|
|
global gdb_prompt
|
|
|
|
with_test_prefix "$break_command" {
|
|
delete_breakpoints
|
|
|
|
gdb_test "$break_command foo" "reakpoint.* at .*"
|
|
|
|
# A condition that evals true.
|
|
gdb_test "condition \$bpnum cond_global==0" ".*"
|
|
|
|
set can_do_cmd 0
|
|
|
|
set test "continue"
|
|
gdb_test_multiple $test $test {
|
|
-re "You may have requested too many.*$gdb_prompt $" {
|
|
pass $test
|
|
}
|
|
-re "Breakpoint .*, foo .*$gdb_prompt $" {
|
|
pass $test
|
|
set can_do_cmd 1
|
|
}
|
|
}
|
|
|
|
if { !$can_do_cmd } {
|
|
unsupported "no target support"
|
|
return
|
|
}
|
|
|
|
delete_breakpoints
|
|
|
|
gdb_test "$break_command foo" ".*reakpoint .* at .*"
|
|
|
|
# A condition that evals false.
|
|
gdb_test "condition \$bpnum cond_global==1" ".*"
|
|
|
|
gdb_test "b bar" "Breakpoint .* at .*"
|
|
|
|
gdb_test "continue" "Breakpoint .*, bar .*"
|
|
}
|
|
}
|
|
|
|
# Test setting conditions in watchpoints. WATCH_COMMAND is the watch
|
|
# command to test.
|
|
#
|
|
proc test_watch { watch_command } {
|
|
global gdb_prompt
|
|
|
|
with_test_prefix "$watch_command" {
|
|
if [target_info exists gdb,no_hardware_watchpoints] {
|
|
unsupported "no target support"
|
|
return
|
|
}
|
|
|
|
delete_breakpoints
|
|
|
|
gdb_test "$watch_command global" ".*atchpoint .*: global.*"
|
|
|
|
# A condition that evals true.
|
|
gdb_test "condition \$bpnum cond_global==0" ".*"
|
|
|
|
set can_do_cmd 0
|
|
|
|
set test "continue"
|
|
gdb_test_multiple $test $test {
|
|
-re "You may have requested too many.*$gdb_prompt $" {
|
|
pass $test
|
|
}
|
|
-re "atchpoint .*: global.*$gdb_prompt $" {
|
|
pass $test
|
|
set can_do_cmd 1
|
|
}
|
|
}
|
|
|
|
if { !$can_do_cmd } {
|
|
unsupported "no target support"
|
|
return
|
|
}
|
|
|
|
delete_breakpoints
|
|
|
|
gdb_test "$watch_command global" ".*atchpoint .*: global.*"
|
|
|
|
# A condition that evals false.
|
|
gdb_test "condition \$bpnum cond_global==1" ".*"
|
|
|
|
gdb_test "b bar" "Breakpoint .* at .*"
|
|
|
|
gdb_test "continue" "Breakpoint .*, bar .*"
|
|
}
|
|
}
|
|
|
|
foreach break_command { "break" "hbreak" } {
|
|
test_break $break_command
|
|
}
|
|
|
|
foreach watch_command { "watch" "rwatch" "awatch" } {
|
|
test_watch $watch_command
|
|
}
|