Summary: | cannot do background execution in scripts | ||
---|---|---|---|
Product: | gdb | Reporter: | dje |
Component: | gdb | Assignee: | Not yet assigned to anyone <unassigned> |
Status: | NEW --- | ||
Severity: | normal | CC: | pedro |
Priority: | P2 | ||
Version: | HEAD | ||
Target Milestone: | --- | ||
Host: | Target: | ||
Build: | Last reconfirmed: |
Description
dje
2014-08-01 18:12:52 UTC
A potential hacky workaround is to feed the script to stdin. One may need to do "set interactive-mode on". But see pr 17224, currently trying this segvs. Re: "Plus more would be required ..." Plus there's things like the "while" command, etc. Anything that loops processing commands without also processing inferior events. (In reply to dje from comment #1) > A potential hacky workaround is to feed the script to stdin. > One may need to do "set interactive-mode on". > But see pr 17224, currently trying this segvs. As an experiment, I find I can get gdb to process inferior events if I add enough nops to the script. E.g., do "info threads", do some mindless things like "pwd", do another "info threads", etc. and slowly the threads start to appear. In this case stdin is "hogging" the event queue. IWBN, at least in this case, if inferior events hogged the event queue. Are there some cases where we want the former and some where we want the latter? Or can we, for example, keep processing inferior events until there are no more? It may be that some command ("wait" or whatever) that one can put in a script to explicitly process all current inferior events has sufficient utility to warrant adding. Yeah, this is a use case that ideally we'd support. My original attempt to make async work in scripts relied on continuations and the top level event loop. That was turning out to be a rat hole, so we ended up with the interpreter flipping async off. See: https://sourceware.org/ml/gdb/2011-08/msg00069.html > This happens because script execution is done in its own loop that doesn't > check for events (ref: top.c:command_loop). With -x and -ex, it's indeed annoying that those are processed before the top level event loop starts. However, events do get processed, in maybe_wait_sync_command_done, when the command is foreground, or if the command is foreground, they'll be processed at the next command that blocks, or after the script is all run, whichever comes first. Here: run & shell sleep 3 info threads We can also say that the problem is with the "shell" command. It's synchronous, and does it's own blocking "waitpid" instead of going through the event loop. |