diff options
| author | fundamental <[email protected]> | 2021-03-30 19:16:15 -0400 |
|---|---|---|
| committer | fundamental <[email protected]> | 2021-03-30 19:16:15 -0400 |
| commit | 49f0da682180f3623c173075c498694b1d21d585 (patch) | |
| tree | b6d2ec19d4108bb2d4ec624eae66355f9cd12801 /src | |
| parent | a963e29b671f4754bc1d735e62cf7935b244b05b (diff) | |
| download | mruby-49f0da682180f3623c173075c498694b1d21d585.tar.gz mruby-49f0da682180f3623c173075c498694b1d21d585.zip | |
Add support for partial backtraces
When debug information is omitted within ireps, show that a stack
frame existed rather than silently hiding it.
Diffstat (limited to 'src')
| -rw-r--r-- | src/backtrace.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/backtrace.c b/src/backtrace.c index 70c82e2d1..c69af5955 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -61,7 +61,6 @@ each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, each_backtrace_func func, void * idx = (uint32_t)(pc - irep->iseq); loc.lineno = mrb_debug_get_line(mrb, irep, idx); - if (loc.lineno == -1) continue; loc.filename = mrb_debug_get_filename(mrb, irep, idx); if (!loc.filename) { @@ -202,7 +201,12 @@ mrb_unpack_backtrace(mrb_state *mrb, mrb_value backtrace) const struct backtrace_location *entry = &bt[i]; mrb_value btline; - btline = mrb_format(mrb, "%s:%d", entry->filename, (int)entry->lineno); + if (entry->lineno != -1) {//debug info was available + btline = mrb_format(mrb, "%s:%d", entry->filename, (int)entry->lineno); + } + else { //all that was left was the stack frame + btline = mrb_format(mrb, "%s:missing-lineno", entry->filename); + } if (entry->method_id != 0) { mrb_str_cat_lit(mrb, btline, ":in "); mrb_str_cat_cstr(mrb, btline, mrb_sym_name(mrb, entry->method_id)); |
