mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-14 17:28:07 +00:00
use PID to find and kill running debugger after tests, and add automatic
kill on when torture crashes
This commit is contained in:
committed by
Ryan Fleury
parent
7289338d53
commit
5d8c568d82
+35
-13
@@ -6,7 +6,7 @@
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
// IPC Controller
|
// IPC Controller
|
||||||
|
|
||||||
internal OS_Handle g_dbg_handle;
|
internal U32 g_dbg_pid;
|
||||||
|
|
||||||
internal B32
|
internal B32
|
||||||
t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *reply_out)
|
t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *reply_out)
|
||||||
@@ -14,16 +14,9 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *rep
|
|||||||
Temp scratch = scratch_begin(&reply_arena, 1);
|
Temp scratch = scratch_begin(&reply_arena, 1);
|
||||||
B32 is_sent = 0;
|
B32 is_sent = 0;
|
||||||
|
|
||||||
#if OS_WINDOWS
|
|
||||||
U32 dbg_pid = GetProcessId((HANDLE)g_dbg_handle.u64[0]);
|
|
||||||
#elif OS_LINUX
|
|
||||||
U32 dbg_pid = safe_cast_u32(handle.u64[0]);
|
|
||||||
#else
|
|
||||||
# error NotImplemented
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// send command
|
// send command
|
||||||
String8 cmdline = str8f(scratch.arena, "--gen_crash_dump --ipc --pid:%u %S", dbg_pid, cmd);
|
String8 cmdline = str8f(scratch.arena, "--gen_crash_dump --ipc --pid:%u %S", g_dbg_pid, cmd);
|
||||||
if (t_invoke(t_raddbg_path(), cmdline, timeout_us) == 0) { goto exit; }
|
if (t_invoke(t_raddbg_path(), cmdline, timeout_us) == 0) { goto exit; }
|
||||||
|
|
||||||
B32 has_reply = 1;
|
B32 has_reply = 1;
|
||||||
@@ -269,9 +262,29 @@ t_dbg_launch(String8 cmdline, U64 timeout_us)
|
|||||||
.cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline),
|
.cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline),
|
||||||
};
|
};
|
||||||
str8_list_push_front(scratch.arena, &launch_opts.cmd_line, t_raddbg_path());
|
str8_list_push_front(scratch.arena, &launch_opts.cmd_line, t_raddbg_path());
|
||||||
g_dbg_handle = os_process_launch(&launch_opts);
|
OS_Handle dbg_handle = os_process_launch(&launch_opts);
|
||||||
if (os_handle_match(g_dbg_handle, os_handle_zero())) { AssertAlways(0 && "failed to launch debugger"); goto exit; }
|
if (os_handle_match(dbg_handle, os_handle_zero())) { AssertAlways(0 && "failed to launch debugger"); goto exit; }
|
||||||
os_process_join(g_dbg_handle, 0, 0);
|
|
||||||
|
#if OS_WINDOWS
|
||||||
|
// automatically close child processes on exit
|
||||||
|
{
|
||||||
|
HANDLE job_handle = CreateJobObjectA(0, 0);
|
||||||
|
AssertAlways(job_handle != 0);
|
||||||
|
JOBOBJECT_EXTENDED_LIMIT_INFORMATION job_info = { .BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE };
|
||||||
|
AssertAlways(SetInformationJobObject(job_handle, JobObjectExtendedLimitInformation, &job_info, sizeof(job_info)));
|
||||||
|
AssertAlways(AssignProcessToJobObject(job_handle, GetCurrentProcess()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// cache debugger PID
|
||||||
|
g_dbg_pid = GetProcessId((HANDLE)dbg_handle.u64[0]);
|
||||||
|
#elif OS_LINUX
|
||||||
|
g_dbg_pid = safe_cast_u32(handle.u64[0]);
|
||||||
|
#else
|
||||||
|
# error NotImplemented
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// close debugger handle
|
||||||
|
os_process_join(dbg_handle, 0, 0);
|
||||||
|
|
||||||
// now wait for debugger to init
|
// now wait for debugger to init
|
||||||
U64 t = ENDT_US(timeout_us);
|
U64 t = ENDT_US(timeout_us);
|
||||||
@@ -643,7 +656,16 @@ T_RunSig(dbg_script_runner)
|
|||||||
t_dbg_script_invoke(&script, ENDT_SEC(60*3));
|
t_dbg_script_invoke(&script, ENDT_SEC(60*3));
|
||||||
|
|
||||||
// clean up
|
// clean up
|
||||||
os_process_kill(g_dbg_handle);
|
#if OS_WINDOWS
|
||||||
|
HANDLE dbg_handle = OpenProcess(PROCESS_ALL_ACCESS, 0, g_dbg_pid);
|
||||||
|
if (dbg_handle != 0) {
|
||||||
|
TerminateProcess(dbg_handle, 1);
|
||||||
|
CloseHandle(dbg_handle);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
kill(g_dbg_pid, SIGKILL);
|
||||||
|
#endif
|
||||||
|
g_dbg_pid = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
|
|||||||
Reference in New Issue
Block a user