ソースを参照

Kernel: Detach the traced process on process exit

Currently, when a process which has a tracee exits, nothing will happen,
leaving the tracee unable to be attached again. This will call the
stop_tracing function on any process which is traced by the exiting
process and sending the SIGSTOP signal making the traced process wait
for a SIGCONT (just as Linux does)
cbsirb 4 年 前
コミット
8456dc87d8
1 ファイル変更16 行追加0 行削除
  1. 16 0
      Kernel/Process.cpp

+ 16 - 0
Kernel/Process.cpp

@@ -543,6 +543,22 @@ void Process::die()
         return IterationDecision::Continue;
         return IterationDecision::Continue;
     });
     });
 
 
+    {
+        ScopedSpinLock lock(g_processes_lock);
+        for (auto* process = g_processes->head(); process;) {
+            auto* next_process = process->next();
+            if (process->has_tracee_thread(m_pid)) {
+                dbgln_if(PROCESS_DEBUG, "Process {} ({}) is attached by {} ({}) which will exit", process->name(), process->pid(), name(), pid());
+                process->stop_tracing();
+                auto err = process->send_signal(SIGSTOP, this);
+                if (err.is_error())
+                    dbgln("Failed to send the SIGSTOP signal to {} ({})", process->name(), process->pid());
+            }
+
+            process = next_process;
+        }
+    }
+
     kill_all_threads();
     kill_all_threads();
 }
 }