]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Windows gdb: extra thread info => show exiting
authorPedro Alves <pedro@palves.net>
Tue, 22 Apr 2025 10:28:11 +0000 (11:28 +0100)
committerPedro Alves <pedro@palves.net>
Mon, 9 Jun 2025 17:09:17 +0000 (18:09 +0100)
Now that we have easy access to each thread's last event, we can
easily include some extra info in "info threads" output related to
each thread's last event.

This patch makes us show whether the thread is exiting, or causing a
whole-process exit.  This is useful when multiple threads hit events
at the same time, and the thread/process exit events are still pending
until the user re-resumes the program.

This is similar to how linux-thread-db.c also shows "Exiting" in its
target_extra_thread_info implementation.

This will be relied on by the testcase added by the following patch.

Change-Id: I493b7ea3e14574dc972b1341eb5062fbbfda1521

gdb/windows-nat.c

index 2d8b5582dc0b3f55741ad34fb362ddbaa6dcaf4a..fa3c5688bfb13210012dfa93c7c912239d856b24 100644 (file)
@@ -527,6 +527,8 @@ struct windows_nat_target final : public x86_nat_target<inf_child_target>
 
   bool thread_alive (ptid_t ptid) override;
 
+  const char *extra_thread_info (thread_info *info) override;
+
   std::string pid_to_str (ptid_t) override;
 
   void interrupt () override;
@@ -4089,6 +4091,26 @@ windows_nat_target::thread_name (struct thread_info *thr)
   return th->thread_name ();
 }
 
+/* Implementation of the target_ops::extra_thread_info method.  */
+
+const char *
+windows_nat_target::extra_thread_info (thread_info *info)
+{
+  windows_thread_info *th = windows_process.find_thread (info->ptid);
+
+  if (!th->suspended)
+    return nullptr;
+
+  if (th->pending_status.kind () == TARGET_WAITKIND_THREAD_EXITED
+      || th->last_event.dwDebugEventCode == EXIT_THREAD_DEBUG_EVENT)
+    return "exiting";
+  else if (th->pending_status.kind () == TARGET_WAITKIND_EXITED
+          || th->pending_status.kind () == TARGET_WAITKIND_SIGNALLED
+          || th->last_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
+    return "exiting process";
+
+  return nullptr;
+}
 
 /* Implementation of the target_ops::supports_non_stop method.  */