aboutsummaryrefslogtreecommitdiff
path: root/gdb/NEWS
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2022-10-07 12:39:07 +0100
committerAndrew Burgess <aburgess@redhat.com>2024-03-25 17:25:06 +0000
commit29f7ef927ad1ead740c7f4e3ae1375bff7e9a7e4 (patch)
tree5076925151d8467262c29ac2ddccfe6ce27fb6da /gdb/NEWS
parent3df7843699ff3610f89ac880685396b531d8ec1b (diff)
downloadgdb-29f7ef927ad1ead740c7f4e3ae1375bff7e9a7e4.zip
gdb-29f7ef927ad1ead740c7f4e3ae1375bff7e9a7e4.tar.gz
gdb-29f7ef927ad1ead740c7f4e3ae1375bff7e9a7e4.tar.bz2
gdb: add timeouts for inferior function calls
In the previous commits I have been working on improving inferior function call support. One thing that worries me about using inferior function calls from a conditional breakpoint is: what happens if the inferior function call fails? If the failure is obvious, e.g. the thread performing the call crashes, or hits a breakpoint, then this case is already well handled, and the error is reported to the user. But what if the thread performing the inferior call just deadlocks? If the user made the call from a 'print' or 'call' command, then the user might have some expectation of when the function call should complete, and, when this time limit is exceeded, the user will (hopefully) interrupt GDB and regain control of the debug session. But, when the inferior function call is from a breakpoint condition it is much harder to understand that GDB is deadlocked within an inferior call. Maybe the breakpoint hasn't been hit yet? Or maybe the condition was always false? Or maybe GDB is deadlocked in an inferior call? The only way to know for sure is for the user to periodically interrupt the inferior, check on the state of all the threads, and then continue. Additionally, the focus of the previous commit was inferior function calls, from a conditional breakpoint, in a multi-threaded inferior. This opens up a whole new set of potential failure conditions. For example, what if the function called relies on interaction with some other thread, and the other thread crashes? Or hits a breakpoint? Given how inferior function calls work (in a synchronous manner), a stop event in some other thread is going to be ignored while the inferior function call is being executed as part of a breakpoint condition, and this means that GDB could get stuck waiting for the original condition thread, which will now never complete. In this commit I propose a solution to this problem. A timeout. For targets that support async-mode we can install an event-loop timer before starting the inferior function call. When the timer expires we will stop the thread performing the inferior function call. With this mechanism in place a user can be sure that any inferior call they make will either complete, or timeout eventually. Adding a timer like this is obviously a change in behaviour for the more common 'call' and 'print' uses of inferior function calls, so, in this patch, I propose having two different timers. One I call the 'direct-call-timeout', which is used for 'call' and 'print' commands. This timeout is by default set to unlimited, which, not surprisingly, means there is no timeout in place. A second timer, which I've called 'indirect-call-timeout', is used for inferior function calls from breakpoint conditions. This timeout has a default value of 30 seconds. This is a reasonably long time to wait, and hopefully should be enough in most cases to allow the inferior call to complete. An inferior call that takes more than 30 seconds, which is installed on a breakpoint condition is really going to slow down the debug session, so hopefully this is not a common use case. The user is, of course, free to reduce, or increase the timeout value, and can always use Ctrl-c to interrupt an inferior function call, but this timeout will ensure that GDB will stop at some point. The new commands added by this commit are: set direct-call-timeout SECONDS show direct-call-timeout set indirect-call-timeout SECONDS show indirect-call-timeout These new timeouts do depend on async-mode, so, if async-mode is disabled (maint set target-async off), or not supported (e.g. target sim), then the timeout is treated as unlimited (that is, no timeout is set). For targets that "fake" non-async mode, e.g. Linux native, where non-async mode is really just async mode, but then we park the target in a sissuspend, we could easily fix things so that the timeouts still work, however, for targets that really are not async aware, like the simulator, fixing things so that timeouts work correctly would be a much bigger task - that effort would be better spent just making the target async-aware. And so, I'm happy for now that this feature will only work on async targets. The two new show commands will display slightly different text if the current target is a non-async target, which should allow users to understand what's going on. There's a somewhat random test adjustment needed in gdb.base/help.exp, the test uses a regexp with the apropos command, and expects to find a single result. Turns out the new settings I added also matched the regexp, which broke the test. I've updated the regexp a little to exclude my new settings. Reviewed-By: Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> Reviewed-By: Eli Zaretskii <eliz@gnu.org> Tested-By: Luis Machado <luis.machado@arm.com> Tested-By: Keith Seitz <keiths@redhat.com>
Diffstat (limited to 'gdb/NEWS')
-rw-r--r--gdb/NEWS18
1 files changed, 18 insertions, 0 deletions
diff --git a/gdb/NEWS b/gdb/NEWS
index d1d25e4..a41a72b 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -54,6 +54,24 @@ set remote thread-options-packet
show remote thread-options-packet
Set/show the use of the thread options packet.
+set direct-call-timeout SECONDS
+show direct-call-timeout
+set indirect-call-timeout SECONDS
+show indirect-call-timeout
+ These new settings can be used to limit how long GDB will wait for
+ an inferior function call to complete. The direct timeout is used
+ for inferior function calls from e.g. 'call' and 'print' commands,
+ while the indirect timeout is used for inferior function calls from
+ within a conditional breakpoint expression.
+
+ The default for the direct timeout is unlimited, while the default
+ for the indirect timeout is 30 seconds.
+
+ These timeouts will only have an effect for targets that are
+ operating in async mode. For non-async targets the timeouts are
+ ignored, GDB will wait indefinitely for an inferior function to
+ complete, unless interrupted by the user using Ctrl-C.
+
* New features in the GDB remote stub, GDBserver
** The --remote-debug and --event-loop-debug command line options