labath added a comment.

I'm not sure this new functionality is really worth the new packet (or two), 
but if it solves a use case you care about, then I suppose that's fine. One 
alternative could be to just tack on some extra data to the existing vAttach 
family packets  (`vAttachWait;foo;interval:47;duration=74`).

> Lastly, this current implementation has a bug I couldn't figure out, where if 
> we're sending l an error response, lldb loses connection to lldb-server (this 
> happens even if the first thing I do in the handle_jAttachWait function is 
> return an error)

I'm not sure that's a bug (i.e., lldb may be intentionally dropping the 
connection). What would you expect lldb to do when it gets an error response?

> and, also, CTRL+C from lldb doesn't interrupt lldb-server. If anyone know why 
> this might be happening, I'd be glad to hear it.

Seems to work for me (in that I get back to the lldb prompt and the server 
connection is terminated), if I press ^C **twice**.

  $ bin/lldb
  (lldb) process attach --name asdgoijhpweiogjawe -w
  ^C^C
  ... Interrupted.
  (lldb) ^D



================
Comment at: lldb/include/lldb/Target/Process.h:113-114
         m_plugin_name(), m_resume_count(0), m_wait_for_launch(false),
+        m_wait_for_launch_interval(llvm::Optional<uint64_t>()),
+        m_wait_for_launch_duration(llvm::Optional<uint64_t>()),
         m_ignore_existing(true), m_continue_once_attached(false),
----------------
Just delete this, that's the default. If you really want to be explicit, you 
can put ` = llvm::None` in the member declaration.


================
Comment at: lldb/include/lldb/Target/Process.h:223-224
   bool m_wait_for_launch;
+  llvm::Optional<uint64_t> m_wait_for_launch_interval;
+  llvm::Optional<uint64_t> m_wait_for_launch_duration;
   bool m_ignore_existing;
----------------
clayborg wrote:
> Should we attach _usec and sec to these names to make it clear what the units 
> are?
I'd make that std::chrono::(micro)seconds


================
Comment at: lldb/include/lldb/Utility/StringExtractorGDBRemote.h:136
     eServerPacketType_vAttachOrWait,
+    eServerPacketType_jAttachWait,
     eServerPacketType_vAttachName,
----------------
clayborg wrote:
> So we currently have 4 flavors from the old way: vAttach, vAttachWait 
> vAttachOrWait, vAttachName. Do we want to possibly make a "jAttach" that 
> works for all cases? The new "jAttach" could be powerful enough to do it all 
> in one packet if needed. I just worry about attaching the "Wait" to the 
> "jAttachWait" command name in case we want to use it for all of the above 
> cases at a later point. 
> 
> A "jAttach" could implement all of:
> - attach to existing pid
> - attach to by name
>   - unique existing process
>   - wait
>     - allow existing (true/false)
>     - poll interval (time in usec)
>     - wait duration (time in sec)
> 
> Not that we need to add support for all of these flavor with this patch, I'm 
> just trying to forward think about the future in case other attach flags are 
> added to any flavor of attach. 
Sounds like a good idea.


================
Comment at: lldb/include/lldb/lldb-enumerations.h:600-601
   eArgTypeModuleUUID,
+  eArgTypeWaitforInterval,
+  eArgTypeWaitforDuration,
   eArgTypeLastArg // Always keep this entry as the last entry in this
----------------
What's up with this? Though this is the first time I see this table, I suspect 
it is not necessary to create a new command argument....


================
Comment at: 
lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp:261-273
+bool GDBRemoteCommunicationClient::GetJAttachWaitSupported() {
+  if (m_j_attach_wait_reply == eLazyBoolCalculate) {
+    m_j_attach_wait_reply = eLazyBoolNo;
+
+    StringExtractorGDBRemote response;
+    if (SendPacketAndWaitForResponse("qJAttachWaitSupported", response,
+                                     false) == PacketResult::Success) {
----------------
I'm not sure this is really useful. We could infer that the packet is not 
supported by the "unsupported" response to the packet itself...


================
Comment at: 
lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:388
 
+  auto now = std::chrono::system_clock::now();
+  auto target = now;
----------------
I think this ought to be `steady_clock`


================
Comment at: 
lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:394
   ProcessInstanceInfoList loop_process_list;
-  while (true) {
+  while (!timeout.hasValue() || now < target) {
     loop_process_list.clear();
----------------
`<= target` ? In case of a zero timeout, I guess this should loop at least 
once. Or, even better:
```
do {
  ...
} while (std::chrono::steady_clock::now() < target);
```
(At that point it does not matter whether it's `<` or `<=`).


================
Comment at: 
lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:3379-3380
+  StringRef process_name;
+  auto polling_interval = llvm::Optional<uint64_t>();
+  auto polling_duration = llvm::Optional<uint64_t>();
+  bool include_existing = false;
----------------
This is not an approved use of `auto`: 
<https://llvm.org/docs/CodingStandards.html#use-auto-type-deduction-to-make-code-more-readable>.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96176/new/

https://reviews.llvm.org/D96176

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to