mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-14 09:18:09 +00:00
gen crash dumps
This commit is contained in:
committed by
Ryan Fleury
parent
3ec7ae6746
commit
5a3741a264
@@ -65,7 +65,18 @@ jobs:
|
||||
for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v
|
||||
if "${{matrix.compiler}}" == "clang" set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;%PATH%
|
||||
|
||||
call build meta raddbg_non_graphical || exit /b 1
|
||||
call build asan meta torture radlink radbin mule_main mule_module "${{matrix.mode}}" "${{matrix.compiler}}" || exit /b 1
|
||||
cd build
|
||||
torture || exit /b 1
|
||||
torture --gen_crash_dump || exit /b 1
|
||||
- name: upload torture crash dumps
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: torture-crash-dumps-${{ matrix.compiler }}-${{ matrix.mode }}
|
||||
path: |
|
||||
build/*.dmp
|
||||
build/*.exe
|
||||
build/*.pdb
|
||||
if-no-files-found: ignore
|
||||
|
||||
|
||||
@@ -395,6 +395,18 @@ str8_match_wildcard(String8 string, String8 pattern, StringMatchFlags flags)
|
||||
return matched;
|
||||
}
|
||||
|
||||
internal B32
|
||||
str8_starts_with(String8 string, String8 expected_prefix)
|
||||
{
|
||||
return str8_match(str8_prefix(string, expected_prefix.size), expected_prefix, 0);
|
||||
}
|
||||
|
||||
internal B32
|
||||
str8_starts_withi(String8 string, String8 expected_prefix)
|
||||
{
|
||||
return str8_match(str8_prefix(string, expected_prefix.size), expected_prefix, StringMatchFlag_CaseInsensitive);
|
||||
}
|
||||
|
||||
internal U64
|
||||
str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags)
|
||||
{
|
||||
|
||||
@@ -202,6 +202,8 @@ internal String8 backslashed_from_str8(Arena *arena, String8 string);
|
||||
internal B32 str8_match(String8 a, String8 b, StringMatchFlags flags);
|
||||
#define str8_matchi(a, b) str8_match(a, b, StringMatchFlag_CaseInsensitive)
|
||||
internal B32 str8_match_wildcard(String8 string, String8 pattern, StringMatchFlags flags);
|
||||
internal B32 str8_starts_with(String8 string, String8 expected_prefix);
|
||||
internal B32 str8_starts_withi(String8 string, String8 expected_prefix);
|
||||
internal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags);
|
||||
internal U64 str8_find_needle_reverse(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags);
|
||||
internal B32 str8_is_before(String8 a, String8 b);
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
// Copyright (c) Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
internal B32
|
||||
str8_starts_with(String8 string, String8 expected_prefix)
|
||||
{
|
||||
return str8_match(str8_prefix(string, expected_prefix.size), expected_prefix, 0);
|
||||
}
|
||||
|
||||
internal U64
|
||||
str8_array_bsearch(String8Array arr, String8 value)
|
||||
{
|
||||
|
||||
@@ -3,6 +3,4 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
internal B32 str8_starts_with(String8 string, String8 expected_prefix);
|
||||
|
||||
internal U64 str8_array_bsearch(String8Array arr, String8 value);
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -499,7 +499,7 @@ internal void
|
||||
entry_point(CmdLine *cmd_line)
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
|
||||
|
||||
//- rjf: unpack command line arguments
|
||||
ExecMode exec_mode = ExecMode_Normal;
|
||||
B32 auto_run = 0;
|
||||
@@ -860,7 +860,12 @@ entry_point(CmdLine *cmd_line)
|
||||
"--quit_after_success (or -q)\n"
|
||||
"This will close the debugger automatically after all processes exit, if they all exited successfully (with code 0), and ran with no interruptions.\n\n"
|
||||
"--ipc <command>\n"
|
||||
"This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n"));
|
||||
"This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n"
|
||||
"--gen_crash_dump\n"
|
||||
"Bypass crash prompt and write dump to --crash_dump_path.\n\n"
|
||||
"--crash_dump_path:<path>\n"
|
||||
"Sets crash dump file path.\n\n"
|
||||
));
|
||||
}break;
|
||||
}
|
||||
|
||||
|
||||
@@ -473,6 +473,10 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us)
|
||||
wait_ms = now_us < endt_us ? ClampTop((endt_us - now_us + 999) / 1000, max_U32-1) : 0;
|
||||
}
|
||||
|
||||
if (wait_ms == 0) {
|
||||
DebugBreakProcess((HANDLE)process_handle.u64[0]);
|
||||
}
|
||||
|
||||
// wait on process and read pipes
|
||||
DWORD wait_result = WaitForMultipleObjects(wait_handle_count, wait_handles, 0, wait_ms);
|
||||
|
||||
@@ -577,6 +581,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us)
|
||||
exit:;
|
||||
for EachElement(i, read_capture_handles) { file_close(read_capture_handles[i]); }
|
||||
for EachElement(i, write_capture_handles) { file_close(write_capture_handles[i]); }
|
||||
AssertAlways(is_ok);
|
||||
scratch_end(scratch);
|
||||
return is_ok;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *rep
|
||||
#endif
|
||||
|
||||
// send command
|
||||
String8 cmdline = str8f(scratch.arena, "--ipc --pid:%u %S", dbg_pid, cmd);
|
||||
String8 cmdline = str8f(scratch.arena, "--gen_crash_dump --ipc --pid:%u %S", dbg_pid, cmd);
|
||||
if (t_invoke(t_raddbg_path(), cmdline, timeout_us) == 0) { goto exit; }
|
||||
|
||||
B32 has_reply = 1;
|
||||
@@ -242,6 +242,7 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us)
|
||||
printf(" Column: %lld\n", loc.pt.column);
|
||||
printf(" Run Gen: %llu\n", status.run_gen);
|
||||
printf(" Stop Cause: \"%.*s\"\n", str8_varg(last_stop.stop_cause));
|
||||
fflush(stdout);
|
||||
}
|
||||
//--------------------------------
|
||||
|
||||
@@ -261,9 +262,10 @@ t_dbg_launch(String8 cmdline, U64 timeout_us)
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
B32 dbg_ready = 0;
|
||||
|
||||
String8 user_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_user"));
|
||||
String8 project_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_project"));
|
||||
cmdline = str8f(scratch.arena, "--user:\"%S\" --project:\"%S\" %S", user_path, project_path, cmdline);
|
||||
String8 user_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_user"));
|
||||
String8 project_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_project"));
|
||||
String8 crash_dump_path = t_make_file_path(scratch.arena, str8_lit("raddbg_crash_dump.dmp"));
|
||||
cmdline = str8f(scratch.arena, "--gen_crash_dump --crash_dump_path:\"%S\" --user:\"%S\" --project:\"%S\" %S", crash_dump_path, user_path, project_path, cmdline);
|
||||
|
||||
// launch debugger
|
||||
OS_ProcessLaunchParams launch_opts = {
|
||||
@@ -579,7 +581,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us)
|
||||
// map IP -> source location
|
||||
U64 ip = u64_from_str8(t_dbg_value_from_exprf(scratch.arena, "reg:rip"), 10);
|
||||
T_DbgSourceLocation loc = {0};
|
||||
AssertAlways(t_dbg_src_line(scratch.arena, ip, &loc, TIMEOUT_SEC(5)));
|
||||
AssertAlways(t_dbg_src_line(scratch.arena, ip, &loc, TIMEOUT_SEC(15)));
|
||||
|
||||
// compute line where debugger must be
|
||||
S64 at_line_s64 = (S64)(program->line - program->file->line) + cmd->at.delta;
|
||||
|
||||
Reference in New Issue
Block a user