diff --git a/vm/debug.cpp b/vm/debug.cpp index 0be3c2cc4a..a464ff751b 100644 --- a/vm/debug.cpp +++ b/vm/debug.cpp @@ -264,26 +264,39 @@ void factor_vm::dump_memory(ostream& out, cell from, cell to) { dump_cell(out, from); } -template -void factor_vm::dump_generation(ostream& out, const char* name, Generation* gen) { - out << name << ": "; - out << "Start=" << gen->start; - out << ", size=" << gen->size; - out << ", end=" << gen->end; - out << endl; +void dump_memory_range(ostream& out, const char* name, cell name_w, + cell start, cell end) { + out << setw(name_w) << left << name << ": "; + + out << "[" << (void*)start << " -> " << (void*)end << "] "; + out << setw(10) << right << (end - start) << " bytes" << endl; } -void factor_vm::dump_generations(ostream& out) { - out << hex; +template +void dump_generation(ostream& out, const char* name, Generation* gen) { + dump_memory_range(out, name, 10, gen->start, gen->end); +} - dump_generation(out, "Nursery", &nursery); +void factor_vm::dump_memory_layout(ostream& out) { + dump_generation(out, "Nursery", data->nursery); dump_generation(out, "Aging", data->aging); dump_generation(out, "Tenured", data->tenured); + dump_memory_range(out, "Cards", 10, (cell)data->cards, (cell)data->cards_end); - out << "Cards:"; - out << "base=" << (cell)data->cards << ", "; - out << "size=" << (cell)(data->cards_end - data->cards) << endl; - out << dec; + out << endl << "Contexts:" << endl << endl; + FACTOR_FOR_EACH(active_contexts) { + context* the_ctx = *iter; + segment* ds = the_ctx->datastack_seg; + segment* rs = the_ctx->retainstack_seg; + segment* cs = the_ctx->callstack_seg; + if (the_ctx == ctx) { + out << " Active:" << endl; + } + dump_memory_range(out, " Datastack", 14, ds->start, ds->end); + dump_memory_range(out, " Retainstack", 14, rs->start, rs->end); + dump_memory_range(out, " Callstack", 14, cs->start, cs->end); + out << endl; + } } void factor_vm::dump_objects(ostream& out, cell type) { @@ -382,7 +395,7 @@ void factor_vm::factorbug_usage(bool advanced_p) { << endl; cout << " . -- print object at tagged " << endl; - cout << " g -- dump generations" << endl; + cout << " g -- dump memory layout" << endl; cout << " ds dr -- dump data, retain stacks" << endl; cout << " trim -- toggle output trimming" << endl; cout << " data -- data heap dump" << endl; @@ -498,7 +511,7 @@ void factor_vm::factorbug() { for (cell i = 0; i < special_object_count; i++) dump_cell(cout, (cell)&special_objects[i]); } else if (cmd == "g") - dump_generations(cout); + dump_memory_layout(cout); else if (cmd == "c") { exit_fep(this); return; @@ -542,11 +555,7 @@ void factor_vm::factorbug() { } void factor_vm::primitive_die() { - cout << "The die word was called by the library. Unless you called it " - "yourself," << endl; - cout << "you have triggered a bug in Factor. Please report." - << endl; - factorbug(); + critical_error("The die word was called by the library.", 0); } } diff --git a/vm/errors.cpp b/vm/errors.cpp index 3de6945435..c8f080cea3 100644 --- a/vm/errors.cpp +++ b/vm/errors.cpp @@ -32,7 +32,7 @@ void critical_error(const char* msg, cell tagged) { void out_of_memory(const char *msg) { std::cout << "Out of memory: " << msg << "\n\n"; - current_vm()->dump_generations(std::cout); + current_vm()->dump_memory_layout(std::cout); abort(); } diff --git a/vm/vm.hpp b/vm/vm.hpp index fec5b38a82..5c94db010e 100644 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -410,9 +410,7 @@ struct factor_vm { void print_callstack_object(ostream& out, callstack* obj); void dump_cell(ostream& out, cell x); void dump_memory(ostream& out, cell from, cell to); - template - void dump_generation(ostream& out, const char* name, Generation* gen); - void dump_generations(ostream& out); + void dump_memory_layout(ostream& out); void dump_objects(ostream& out, cell type); void dump_edges(ostream& out); void find_data_references(ostream& out, cell look_for_);