From 5bae6459ff6649fdc622b0c4f2a8ee93865197e3 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Wed, 31 Oct 2012 11:47:59 +0900 Subject: show backtrace. --- tools/mruby/mruby.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'tools') diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index db26d23a1..94fddf4c7 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -162,6 +162,40 @@ cleanup(mrb_state *mrb, struct _args *args) mrb_close(mrb); } +static void +showcallinfo(mrb_state *mrb) +{ + mrb_callinfo *ci; + const char *filename, *sep; + int i; + + printf("trace:\n"); + for (i = 0; &mrb->cibase[i] < mrb->ciend; i++) { + ci = &mrb->cibase[i]; + if (ci->target_class == NULL) + break; + + if (MRB_PROC_CFUNC_P(ci->proc)) + filename = "(cfunc)"; + else { + filename = ci->proc->body.irep->filename; + if (filename == NULL) + filename = "(unknown)"; + } + + if (ci->target_class == ci->proc->target_class) + sep = "."; + else + sep = "#"; + + printf(" ci[%d]: %s:in %s%s%s\n", + i, filename, + mrb_class_name(mrb, ci->proc->target_class), + sep, + mrb_sym2name(mrb, ci->mid)); + } +} + int main(int argc, char **argv) { @@ -198,6 +232,7 @@ main(int argc, char **argv) mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); n = 0; if (mrb->exc) { + showcallinfo(mrb); p(mrb, mrb_obj_value(mrb->exc)); n = -1; } @@ -223,6 +258,7 @@ main(int argc, char **argv) mrbc_context_free(mrb, c); if (mrb->exc) { if (!mrb_undef_p(v)) { + showcallinfo(mrb); p(mrb, mrb_obj_value(mrb->exc)); } n = -1; -- cgit v1.2.3 From 075aa3eeaa9ee798ebcd8781f04a18fbbab7b2fd Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Thu, 1 Nov 2012 09:40:56 +0900 Subject: don't print garbage entries. --- src/vm.c | 3 +++ tools/mruby/mruby.c | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'tools') diff --git a/src/vm.c b/src/vm.c index 953863a0b..fe359be47 100644 --- a/src/vm.c +++ b/src/vm.c @@ -169,6 +169,9 @@ cipush(mrb_state *mrb) mrb->ci->eidx = eidx; mrb->ci->ridx = ridx; mrb->ci->env = 0; + if (mrb->ci + 1 != mrb->ciend) { + mrb->ci[1].mid = 0; + } return mrb->ci; } diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 94fddf4c7..2037ee2a8 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -170,9 +170,9 @@ showcallinfo(mrb_state *mrb) int i; printf("trace:\n"); - for (i = 0; &mrb->cibase[i] < mrb->ciend; i++) { + for (i = 1; &mrb->cibase[i] < mrb->ciend; i++) { ci = &mrb->cibase[i]; - if (ci->target_class == NULL) + if (ci->mid == 0) break; if (MRB_PROC_CFUNC_P(ci->proc)) -- cgit v1.2.3 From 80ed166e9f3f293f166086dc70e766272c342950 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Thu, 1 Nov 2012 14:54:04 +0900 Subject: show all callinfo's. --- src/error.c | 1 + src/vm.c | 3 --- tools/mruby/mruby.c | 6 +++--- 3 files changed, 4 insertions(+), 6 deletions(-) (limited to 'tools') diff --git a/src/error.c b/src/error.c index 858c70820..430728db0 100644 --- a/src/error.c +++ b/src/error.c @@ -189,6 +189,7 @@ exc_debug_info(mrb_state *mrb, struct RObject *exc) mrb_callinfo *ci = mrb->ci; mrb_code *pc = ci->pc; + mrb_obj_iv_set(mrb, exc, mrb_intern(mrb, "ciidx"), mrb_fixnum_value(ci - mrb->cibase)); ci--; while (ci >= mrb->cibase) { if (ci->proc && !MRB_PROC_CFUNC_P(ci->proc)) { diff --git a/src/vm.c b/src/vm.c index fe359be47..953863a0b 100644 --- a/src/vm.c +++ b/src/vm.c @@ -169,9 +169,6 @@ cipush(mrb_state *mrb) mrb->ci->eidx = eidx; mrb->ci->ridx = ridx; mrb->ci->env = 0; - if (mrb->ci + 1 != mrb->ciend) { - mrb->ci[1].mid = 0; - } return mrb->ci; } diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 2037ee2a8..5a97adc8a 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -166,14 +166,14 @@ static void showcallinfo(mrb_state *mrb) { mrb_callinfo *ci; + mrb_int ciidx; const char *filename, *sep; int i; printf("trace:\n"); - for (i = 1; &mrb->cibase[i] < mrb->ciend; i++) { + ciidx = mrb_fixnum(mrb_obj_iv_get(mrb, mrb->exc, mrb_intern(mrb, "ciidx"))); + for (i = 1; i <= ciidx; i++) { ci = &mrb->cibase[i]; - if (ci->mid == 0) - break; if (MRB_PROC_CFUNC_P(ci->proc)) filename = "(cfunc)"; -- cgit v1.2.3 From 9622d65a6bfc34806897fd5fbaa3abdfb25d2cb3 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Thu, 1 Nov 2012 17:02:08 +0900 Subject: show line numbers in backtrace. --- tools/mruby/mruby.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to 'tools') diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 5a97adc8a..fd0fba496 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -168,28 +168,38 @@ showcallinfo(mrb_state *mrb) mrb_callinfo *ci; mrb_int ciidx; const char *filename, *sep; - int i; + int i, line; printf("trace:\n"); ciidx = mrb_fixnum(mrb_obj_iv_get(mrb, mrb->exc, mrb_intern(mrb, "ciidx"))); - for (i = 1; i <= ciidx; i++) { + if (ciidx >= mrb->ciend - mrb->cibase) + ciidx = 10; /* ciidx is broken... */ + + for (i = ciidx; i >= 0; i--) { ci = &mrb->cibase[i]; + filename = "(unknown)"; + line = -1; - if (MRB_PROC_CFUNC_P(ci->proc)) + if (MRB_PROC_CFUNC_P(ci->proc)) { filename = "(cfunc)"; - else { - filename = ci->proc->body.irep->filename; - if (filename == NULL) - filename = "(unknown)"; + } else { + mrb_irep *irep = ci->proc->body.irep; + if (irep->filename != NULL) + filename = irep->filename; + if (irep->lines != NULL && i+1 <= ciidx) { + mrb_code *pc = mrb->cibase[i+1].pc; + if (irep->iseq <= pc && pc < irep->iseq + irep->ilen) { + line = irep->lines[pc - irep->iseq - 1]; + } + } } - if (ci->target_class == ci->proc->target_class) sep = "."; else sep = "#"; - printf(" ci[%d]: %s:in %s%s%s\n", - i, filename, + printf("\t[%d] %s:%d:in %s%s%s\n", + i, filename, line, mrb_class_name(mrb, ci->proc->target_class), sep, mrb_sym2name(mrb, ci->mid)); -- cgit v1.2.3 From 650008bf9e25e4076937e8377185c69e5f7d5a53 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Fri, 2 Nov 2012 10:37:52 +0900 Subject: fix compilation. --- tools/mruby/mruby.c | 1 + 1 file changed, 1 insertion(+) (limited to 'tools') diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index fd0fba496..07d0da36c 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -4,6 +4,7 @@ #include "mruby/string.h" #include "mruby/compile.h" #include "mruby/dump.h" +#include "mruby/variable.h" #include #include -- cgit v1.2.3 From 43f4934e6d6ef14e38baf1f007f2ccc09d2781dc Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Fri, 2 Nov 2012 10:48:39 +0900 Subject: printf("%s", NULL) is not safe on some platforms. --- tools/mruby/mruby.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'tools') diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 07d0da36c..acecc7c8e 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -168,7 +168,7 @@ showcallinfo(mrb_state *mrb) { mrb_callinfo *ci; mrb_int ciidx; - const char *filename, *sep; + const char *filename, *method, *sep; int i, line; printf("trace:\n"); @@ -199,11 +199,15 @@ showcallinfo(mrb_state *mrb) else sep = "#"; + method = mrb_sym2name(mrb, ci->mid); + if (method == NULL) + method = "(???)"; + printf("\t[%d] %s:%d:in %s%s%s\n", i, filename, line, mrb_class_name(mrb, ci->proc->target_class), sep, - mrb_sym2name(mrb, ci->mid)); + method); } } -- cgit v1.2.3 From e0aa96a6826c5627e7cead998d3fe5f865930c35 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 3 Nov 2012 01:40:51 +0900 Subject: avoid trigraph (???) in backtrace --- tools/mruby/mruby.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'tools') diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index acecc7c8e..61c2b1445 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -200,14 +200,12 @@ showcallinfo(mrb_state *mrb) sep = "#"; method = mrb_sym2name(mrb, ci->mid); - if (method == NULL) - method = "(???)"; - - printf("\t[%d] %s:%d:in %s%s%s\n", + printf("\t[%d] %s:%d%s%s%s%s\n", i, filename, line, - mrb_class_name(mrb, ci->proc->target_class), - sep, - method); + method ? ":in " : "", + method ? mrb_class_name(mrb, ci->proc->target_class) : "", + method ? sep : "", + method ? method : ""); } } -- cgit v1.2.3 From 5987f67a8d219dbe251a68941710c8192383d3d5 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 3 Nov 2012 01:42:19 +0900 Subject: ignore cfunc method in backtrace --- tools/mruby/mruby.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'tools') diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 61c2b1445..d9386f6e2 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -182,8 +182,9 @@ showcallinfo(mrb_state *mrb) line = -1; if (MRB_PROC_CFUNC_P(ci->proc)) { - filename = "(cfunc)"; - } else { + continue; + } + else { mrb_irep *irep = ci->proc->body.irep; if (irep->filename != NULL) filename = irep->filename; -- cgit v1.2.3