mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-09 16:05:07 +00:00
[MIRROR] Makes stack trace errors set file and line number to caller [MDB IGNORE] (#24706)
* Makes stack trace errors set file and line number to caller (#79341) Somewhat annoying on occasion, errors thrown from stack_trace() get combined all into one entry in the runtime viewer. This is because if we were to create our own exception with properly set information, we would lose the call stack. To workaround this I've formatted the file and line number in the exception.name such that it can be extracted in world.Error and assigned to the correct vars before we handle other parts of exception handling.  * Makes stack trace errors set file and line number to caller --------- Co-authored-by: Emmett Gaines <ninjanomnom@gmail.com>
This commit is contained in:
@@ -1,2 +1,4 @@
|
||||
/// gives us the stack trace from CRASH() without ending the current proc.
|
||||
#define stack_trace(message) _stack_trace(message, __FILE__, __LINE__)
|
||||
|
||||
#define WORKAROUND_IDENTIFIER "%//%"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/// gives us the stack trace from CRASH() without ending the current proc.
|
||||
/// Do not call directly, use the [stack_trace] macro instead.
|
||||
/proc/_stack_trace(message, file, line)
|
||||
CRASH("[message] ([file]:[line])")
|
||||
CRASH("[message][WORKAROUND_IDENTIFIER][json_encode(list(file, line))][WORKAROUND_IDENTIFIER]")
|
||||
|
||||
@@ -26,6 +26,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0)
|
||||
Reboot(reason = 1)
|
||||
return
|
||||
|
||||
var/static/regex/stack_workaround = regex("[WORKAROUND_IDENTIFIER](.+?)[WORKAROUND_IDENTIFIER]")
|
||||
var/static/list/error_last_seen = list()
|
||||
var/static/list/error_cooldown = list() /* Error_cooldown items will either be positive(cooldown time) or negative(silenced error)
|
||||
If negative, starts at -1, and goes down by 1 each time that error gets skipped*/
|
||||
@@ -33,6 +34,12 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0)
|
||||
if(!error_last_seen) // A runtime is occurring too early in start-up initialization
|
||||
return ..()
|
||||
|
||||
if(stack_workaround.Find(E.name))
|
||||
var/list/data = json_decode(stack_workaround.group[1])
|
||||
E.file = data[1]
|
||||
E.line = data[2]
|
||||
E.name = stack_workaround.Replace(E.name, "")
|
||||
|
||||
var/erroruid = "[E.file][E.line]"
|
||||
var/last_seen = error_last_seen[erroruid]
|
||||
var/cooldown = error_cooldown[erroruid] || 0
|
||||
|
||||
Reference in New Issue
Block a user