diff --git a/vm/debug.c b/vm/debug.c index 7e18738afc..101313a5ee 100755 --- a/vm/debug.c +++ b/vm/debug.c @@ -146,6 +146,18 @@ void print_objects(CELL start, CELL end) } } +void print_datastack(void) +{ + printf("==== DATA STACK:\n"); + print_objects(ds_bot,ds); +} + +void print_retainstack(void) +{ + printf("==== RETAIN STACK:\n"); + print_objects(rs_bot,rs); +} + void print_stack_frame(F_STACK_FRAME *frame) { print_obj(frame_executing(frame)); @@ -158,6 +170,7 @@ void print_stack_frame(F_STACK_FRAME *frame) void print_callstack(void) { + printf("==== CALL STACK:\n"); CELL bottom = (CELL)stack_chain->callstack_bottom; CELL top = (CELL)stack_chain->callstack_top; iterate_callstack(top,bottom,print_stack_frame); @@ -336,6 +349,8 @@ void factorbug(void) printf("push -- push object on data stack - NOT SAFE\n"); printf("code -- code heap dump\n"); + bool seen_command = false; + for(;;) { char cmd[1024]; @@ -344,7 +359,22 @@ void factorbug(void) fflush(stdout); if(scanf("%1000s",cmd) <= 0) + { + if(!seen_command) + { + /* If we exit with an EOF immediately, then + dump stacks. This is useful for builder and + other cases where Factor is run with stdin + redirected to /dev/null */ + print_datastack(); + print_retainstack(); + print_callstack(); + } + exit(1); + } + + seen_command = true; if(strcmp(cmd,"d") == 0) { @@ -371,9 +401,9 @@ void factorbug(void) else if(strcmp(cmd,"r") == 0) dump_memory(rs_bot,rs); else if(strcmp(cmd,".s") == 0) - print_objects(ds_bot,ds); + print_datastack(); else if(strcmp(cmd,".r") == 0) - print_objects(rs_bot,rs); + print_retainstack(); else if(strcmp(cmd,".c") == 0) print_callstack(); else if(strcmp(cmd,"e") == 0)