support resource errors for out of memory conditions.

improve stack dump message.
This commit is contained in:
Vitor Santos Costa 2009-05-17 09:42:56 -07:00
parent d8590f2587
commit ae5bf4d6e7
5 changed files with 62 additions and 67 deletions

View File

@ -196,65 +196,31 @@ detect_bug_location(yamop *yap_pc, find_pred_type where_from, char *tp, int psiz
} else if (pred_module == 0) {
/* don't give info on system predicates */
#if HAVE_SNPRINTF
#if SHORT_INTS
snprintf(tp, psize, "prolog:%s/%ld",
RepAtom(pred_name)->StrOfAE, pred_arity);
snprintf(tp, psize, "prolog:%s/%lu",
RepAtom(pred_name)->StrOfAE, (unsigned long int)pred_arity);
#else
snprintf(tp, psize, "prolog:%s/%d",
RepAtom(pred_name)->StrOfAE, pred_arity);
#endif
#else
#if SHORT_INTS
sprintf(tp, "in prolog:%s/%ld",
RepAtom(pred_name)->StrOfAE, pred_arity);
#else
sprintf(tp, "in prolog:%s/%d",
RepAtom(pred_name)->StrOfAE, pred_arity);
#endif
sprintf(tp, "in prolog:%s/%lu",
RepAtom(pred_name)->StrOfAE, (unsigned long int)pred_arity);
#endif
} else if (cl < 0) {
#if HAVE_SNPRINTF
#if SHORT_INTS
snprintf(tp, psize, "indexing code of %s:%s/%ld",
snprintf(tp, psize, "%s:%s/%lu",
RepAtom(AtomOfTerm(pred_module))->StrOfAE,
RepAtom(pred_name)->StrOfAE, pred_arity);
RepAtom(pred_name)->StrOfAE, (unsigned long int)pred_arity);
#else
snprintf(tp, psize, "indexing code of %s:%s/%d",
RepAtom(AtomOfTerm(pred_module))->StrOfAE,
RepAtom(pred_name)->StrOfAE, pred_arity);
#endif
#else
#if SHORT_INTS
sprintf(tp, "indexing code of %s:%s/%ld",
sprintf(tp, "%s:%s/%lu",
RepAtom(AtomOfTerm(pred_module))->StrOfAE,
RepAtom(pred_name)->StrOfAE, pred_arity);
#else
sprintf(tp, "indexing code of %s:%s/%d",
RepAtom(AtomOfTerm(pred_module))->StrOfAE,
RepAtom(pred_name)->StrOfAE, pred_arity);
#endif
RepAtom(pred_name)->StrOfAE, (unsigned long int)pred_arity);
#endif
} else {
#if HAVE_SNPRINTF
#if SHORT_INTS
snprintf(tp, psize, "clause %ld of %s:%s/%ld", cl,
snprintf(tp, psize, "%s:%s/%lu at clause %lu ",
RepAtom(AtomOfTerm(pred_module))->StrOfAE,
RepAtom(pred_name)->StrOfAE, pred_arity);
RepAtom(pred_name)->StrOfAE, (unsigned long int)pred_arity, (unsigned long int)cl);
#else
snprintf(tp, psize, "clause %d of %s:%s/%d", cl,
RepAtom(AtomOfTerm(pred_module))->StrOfAE,
RepAtom(pred_name)->StrOfAE, pred_arity);
#endif
#else
#if SHORT_INTS
sprintf(tp, "clause %ld of %s:%s/%ld", cl,
sprintf(tp, "%s:%s/%lu at clause %lu",
RepAtom(AtomOfTerm(pred_module))->StrOfAE,
RepAtom(pred_name)->StrOfAE, pred_arity);
#else
sprintf(tp, "clause %d of %s:%s/%d", cl,
RepAtom(AtomOfTerm(pred_module))->StrOfAE,
RepAtom(pred_name)->StrOfAE, pred_arity);
#endif
RepAtom(pred_name)->StrOfAE, (unsigned long int)pred_arity, (unsigned long int)cl);
#endif
}
}
@ -291,10 +257,14 @@ dump_stack(void)
}
#endif
#endif
fprintf (stderr,"%ldKB of Global Stack (%p--%p)\n",(long int)(sizeof(CELL)*(H-H0))/1024,H0,H);
fprintf (stderr,"%ldKB of Local Stack (%p--%p)\n",(long int)(sizeof(CELL)*(LCL0-ASP))/1024,ASP,LCL0);
fprintf (stderr,"%ldKB of Trail (%p--%p)\n",(long int)((ADDR)TR-Yap_TrailBase)/1024,Yap_TrailBase,TR);
fprintf (stderr,"Performed %d garbage collections\n", GcCalls);
detect_bug_location(P, FIND_PRED_FROM_ANYWHERE, (char *)H, 256);
fprintf (stderr,"%%\n%% PC: %s\n",(char *)H);
detect_bug_location(CP, FIND_PRED_FROM_ANYWHERE, (char *)H, 256);
fprintf (stderr,"%% Continuation: %s\n",(char *)H);
fprintf (stderr,"%% %ldKB of Global Stack (%p--%p)\n",(long int)(sizeof(CELL)*(H-H0))/1024,H0,H);
fprintf (stderr,"%% %ldKB of Local Stack (%p--%p)\n",(long int)(sizeof(CELL)*(LCL0-ASP))/1024,ASP,LCL0);
fprintf (stderr,"%% %ldKB of Trail (%p--%p)\n",(long int)((ADDR)TR-Yap_TrailBase)/1024,Yap_TrailBase,TR);
fprintf (stderr,"%% Performed %d garbage collections\n", GcCalls);
#if LOW_LEVEL_TRACER
{
extern long long vsc_count;
@ -304,19 +274,17 @@ dump_stack(void)
}
}
#endif
detect_bug_location(P, FIND_PRED_FROM_ANYWHERE, (char *)H, 256);
fprintf (stderr,"Running code at %s\n",(char *)H);
detect_bug_location(CP, FIND_PRED_FROM_ANYWHERE, (char *)H, 256);
fprintf (stderr,"Continuation is at %s\n",(char *)H);
fprintf (stderr,"%% All Active Calls and\n");
fprintf (stderr,"%% Goals With Alternatives Open (Global In Use--Local In Use)\n%%\n");
while (b_ptr != NULL) {
while (env_ptr && env_ptr <= (CELL *)b_ptr) {
detect_bug_location(ipc, FIND_PRED_FROM_ENV, tp, 256);
if (env_ptr == (CELL *)b_ptr &&
(choiceptr)env_ptr[E_CB] > b_ptr) {
b_ptr = b_ptr->cp_b;
fprintf(stderr," %s (*)\n", tp);
fprintf(stderr,"%% %s\n", tp);
} else {
fprintf(stderr," %s\n", tp);
fprintf(stderr,"%% %s\n", tp);
}
ipc = (yamop *)(env_ptr[E_CP]);
env_ptr = (CELL *)(env_ptr[E_E]);
@ -328,7 +296,9 @@ dump_stack(void)
b_ptr->cp_ap->opc != Yap_opcode(_Nstop)) {
/* we can safely ignore ; because there is always an upper env */
detect_bug_location(b_ptr->cp_ap, FIND_PRED_FROM_CP, tp, 256);
fprintf(stderr," %s (*)\n", tp);
fprintf(stderr,"%% %s (%luKB--%luKB)\n", tp,
(unsigned long int)((b_ptr->cp_h-H0)*sizeof(CELL)/1024),
(unsigned long int)((ADDR)LCL0-(ADDR)b_ptr)/1024);
}
b_ptr = b_ptr->cp_b;
}
@ -999,10 +969,12 @@ Yap_Error(yap_error_number type, Term where, char *format,...)
case OUT_OF_HEAP_ERROR:
{
int i;
Term ti[1];
dump_stack();
ti[0] = MkAtomTerm(AtomCodeSpace);
i = strlen(tmpbuf);
nt[0] = MkAtomTerm(AtomOutOfHeapError);
nt[0] = Yap_MkApplTerm(FunctorResourceError, 1, ti);
tp = tmpbuf+i;
psize -= i;
fun = FunctorError;
@ -1012,10 +984,12 @@ Yap_Error(yap_error_number type, Term where, char *format,...)
case OUT_OF_STACK_ERROR:
{
int i;
Term ti[1];
dump_stack();
i = strlen(tmpbuf);
nt[0] = MkAtomTerm(AtomOutOfStackError);
ti[0] = MkAtomTerm(AtomStack);
nt[0] = Yap_MkApplTerm(FunctorResourceError, 1, ti);
tp = tmpbuf+i;
psize -= i;
fun = FunctorError;
@ -1025,10 +999,12 @@ Yap_Error(yap_error_number type, Term where, char *format,...)
case OUT_OF_ATTVARS_ERROR:
{
int i;
Term ti[1];
dump_stack();
i = strlen(tmpbuf);
nt[0] = MkAtomTerm(AtomOutOfAttvarsError);
ti[0] = MkAtomTerm(AtomAttributes);
nt[0] = Yap_MkApplTerm(FunctorResourceError, 1, ti);
tp = tmpbuf+i;
psize -= i;
fun = FunctorError;
@ -1038,11 +1014,13 @@ Yap_Error(yap_error_number type, Term where, char *format,...)
case OUT_OF_AUXSPACE_ERROR:
{
int i;
Term ti[1];
dump_stack();
i = strlen(tmpbuf);
nt[0] = MkAtomTerm(AtomOutOfAuxspaceError);
tp = tmpbuf+i;
ti[0] = MkAtomTerm(AtomUnificationStack);
nt[0] = Yap_MkApplTerm(FunctorResourceError, 1, ti);
psize -= i;
fun = FunctorError;
serious = TRUE;
@ -1051,10 +1029,12 @@ Yap_Error(yap_error_number type, Term where, char *format,...)
case OUT_OF_TRAIL_ERROR:
{
int i;
Term ti[1];
dump_stack();
i = strlen(tmpbuf);
nt[0] = MkAtomTerm(AtomOutOfTrailError);
ti[0] = MkAtomTerm(AtomTrail);
nt[0] = Yap_MkApplTerm(FunctorResourceError, 1, ti);
tp = tmpbuf+i;
psize -= i;
fun = FunctorError;

View File

@ -38,10 +38,11 @@
AtomCatch = Yap_FullLookupAtom("$catch");
AtomChangeModule = Yap_FullLookupAtom("$change_module");
AtomChar = Yap_LookupAtom("char");
AtomCharsio = Yap_LookupAtom("charsio");
AtomCharacter = Yap_LookupAtom("character");
AtomCharacterCode = Yap_LookupAtom("character_code");
AtomCharsio = Yap_LookupAtom("charsio");
AtomColomn = Yap_LookupAtom(":");
AtomCodeSpace = Yap_LookupAtom("code_space");
AtomComma = Yap_LookupAtom(",");
AtomCompound = Yap_LookupAtom("compound");
AtomConsistencyError = Yap_LookupAtom("consistency_error");
@ -260,6 +261,7 @@
AtomTimeOutSpec = Yap_LookupAtom("time_out_spec");
AtomTopLevelGoal = Yap_FullLookupAtom("$top_level_goal");
AtomTopThreadGoal = Yap_FullLookupAtom("$top_thread_goal");
AtomTrail = Yap_LookupAtom("trail");
AtomTrue = Yap_LookupAtom("true");
AtomTty = Yap_LookupAtom("tty");
AtomTtys = Yap_LookupAtom("ttys");
@ -267,6 +269,7 @@
AtomUndefined = Yap_LookupAtom("undefined");
AtomUndefp = Yap_FullLookupAtom("$undefp");
AtomUnderflow = Yap_LookupAtom("underflow");
AtomUnificationStack = Yap_LookupAtom("unification_stack");
AtomUnsignedByte = Yap_LookupAtom("unsigned_byte");
AtomUnsignedChar = Yap_LookupAtom("unsigned_char");
AtomUser = Yap_LookupAtom("user");

View File

@ -38,10 +38,11 @@
AtomCatch = AtomAdjust(AtomCatch);
AtomChangeModule = AtomAdjust(AtomChangeModule);
AtomChar = AtomAdjust(AtomChar);
AtomCharsio = AtomAdjust(AtomCharsio);
AtomCharacter = AtomAdjust(AtomCharacter);
AtomCharacterCode = AtomAdjust(AtomCharacterCode);
AtomCharsio = AtomAdjust(AtomCharsio);
AtomColomn = AtomAdjust(AtomColomn);
AtomCodeSpace = AtomAdjust(AtomCodeSpace);
AtomComma = AtomAdjust(AtomComma);
AtomCompound = AtomAdjust(AtomCompound);
AtomConsistencyError = AtomAdjust(AtomConsistencyError);
@ -262,6 +263,7 @@
AtomTimeOutSpec = AtomAdjust(AtomTimeOutSpec);
AtomTopLevelGoal = AtomAdjust(AtomTopLevelGoal);
AtomTopThreadGoal = AtomAdjust(AtomTopThreadGoal);
AtomTrail = AtomAdjust(AtomTrail);
AtomTrue = AtomAdjust(AtomTrue);
AtomTty = AtomAdjust(AtomTty);
AtomTtys = AtomAdjust(AtomTtys);
@ -269,6 +271,7 @@
AtomUndefined = AtomAdjust(AtomUndefined);
AtomUndefp = AtomAdjust(AtomUndefp);
AtomUnderflow = AtomAdjust(AtomUnderflow);
AtomUnificationStack = AtomAdjust(AtomUnificationStack);
AtomUnsignedByte = AtomAdjust(AtomUnsignedByte);
AtomUnsignedChar = AtomAdjust(AtomUnsignedChar);
AtomUser = AtomAdjust(AtomUser);

View File

@ -78,14 +78,16 @@
#define AtomChangeModule Yap_heap_regs->AtomChangeModule_
Atom AtomChar_;
#define AtomChar Yap_heap_regs->AtomChar_
Atom AtomCharsio_;
#define AtomCharsio Yap_heap_regs->AtomCharsio_
Atom AtomCharacter_;
#define AtomCharacter Yap_heap_regs->AtomCharacter_
Atom AtomCharacterCode_;
#define AtomCharacterCode Yap_heap_regs->AtomCharacterCode_
Atom AtomCharsio_;
#define AtomCharsio Yap_heap_regs->AtomCharsio_
Atom AtomColomn_;
#define AtomColomn Yap_heap_regs->AtomColomn_
Atom AtomCodeSpace_;
#define AtomCodeSpace Yap_heap_regs->AtomCodeSpace_
Atom AtomComma_;
#define AtomComma Yap_heap_regs->AtomComma_
Atom AtomCompound_;
@ -526,6 +528,8 @@
#define AtomTopLevelGoal Yap_heap_regs->AtomTopLevelGoal_
Atom AtomTopThreadGoal_;
#define AtomTopThreadGoal Yap_heap_regs->AtomTopThreadGoal_
Atom AtomTrail_;
#define AtomTrail Yap_heap_regs->AtomTrail_
Atom AtomTrue_;
#define AtomTrue Yap_heap_regs->AtomTrue_
Atom AtomTty_;
@ -540,6 +544,8 @@
#define AtomUndefp Yap_heap_regs->AtomUndefp_
Atom AtomUnderflow_;
#define AtomUnderflow Yap_heap_regs->AtomUnderflow_
Atom AtomUnificationStack_;
#define AtomUnificationStack Yap_heap_regs->AtomUnificationStack_
Atom AtomUnsignedByte_;
#define AtomUnsignedByte Yap_heap_regs->AtomUnsignedByte_
Atom AtomUnsignedChar_;

View File

@ -47,10 +47,11 @@ A Callable N "callable"
A Catch F "$catch"
A ChangeModule F "$change_module"
A Char N "char"
A Charsio N "charsio"
A Character N "character"
A CharacterCode N "character_code"
A Charsio N "charsio"
A Colomn N ":"
A CodeSpace N "code_space"
A Comma N ","
A Compound N "compound"
A ConsistencyError N "consistency_error"
@ -271,6 +272,7 @@ A Throw N "throw"
A TimeOutSpec N "time_out_spec"
A TopLevelGoal F "$top_level_goal"
A TopThreadGoal F "$top_thread_goal"
A Trail N "trail"
A True N "true"
A Tty N "tty"
A Ttys N "ttys"
@ -278,6 +280,7 @@ A TypeError N "type_error"
A Undefined N "undefined"
A Undefp F "$undefp"
A Underflow N "underflow"
A UnificationStack N "unification_stack"
A UnsignedByte N "unsigned_byte"
A UnsignedChar N "unsigned_char"
A User N "user"