20#ifdef LOW_LEVEL_TRACER
31static char *send_tracer_message(
char *start,
char *name, arity_t arity,
32 char *mname, CELL *args,
char **s0,
char *s,
35 size_t max = *top - (s + 1);
39 if (expand || max < 32) {
43 *s0 = Realloc(*s0, max);
54 d = snprintf(s, max,
"(%d)%s", worker_id, start);
56 d = snprintf(s, max,
"%s", start);
62 d = snprintf(s, max,
"%s %s:%s(", start, mname, name);
64 d = snprintf(s, max,
"%s %s:%s/%lu", start, mname, name,
65 (
unsigned long int)arity);
67 d = snprintf(s, max,
"%s %s:%s", start, mname, name);
79 for (i = 0; i < arity; i++) {
90 int l_max_depth = LOCAL_max_depth;
92 const char *sn = Yap_TermToBuffer(args[i],
93 Quote_illegal_f | Handle_vars_f);
94 LOCAL_max_depth = l_max_depth;
121unsigned long long vsc_count;
123unsigned long vsc_count;
127static int thread_trace;
157CELL old_value = 0L, old_value2 = 0L;
159void jmp_deb(
int), jmp_deb2(
void);
161void jmp_deb2(
void) { fprintf(stderr,
"Here\n"); }
165 printf(
"Here we go " Int_FORMAT
"\n", old_value++);
166 if (old_value == 716)
200bool low_level_trace__(yap_low_level_port port,
PredEntry *pred, CELL *args) {
210 int l = push_text_stack();
218 char *buf =
Malloc(512), *top = buf + 511, *b = buf;
222 LOCK(Yap_low_level_trace_lock);
226 LOCAL_ThreadHandle.thread_inst_count++;
229 b = snprintf(b, top - b,
"in %p\n");
231 while (gc_ENV != NULL) {
232 b = snprintf(b, top - b,
"%ld\n", LCL0 - gc_ENV);
233 gc_ENV = (CELL *)gc_ENV[E_E];
237 LOCAL_ActiveError = old;
244 b = snprintf(b, top - b,
"%p %ld\n", b_p,
245 Yap_op_from_opcode(b_p->cp_ap->opc));
256 if (vsc_count > 1388060LL && vsc_count < 1388070LL) {
257 if (vsc_count == 1388061LL)
259 if (vsc_count % 1LL == 0) {
260 UInt sz = Yap_regp->H0_[17];
261 UInt end =
sizeof(
MP_INT) /
sizeof(CELL) + sz + 1;
262 b = snprintf(b, top - b,
"VAL %lld %d %x/%x\n", vsc_count, sz, H0[16],
268 LOCAL_ActiveError = old;
271 tr_fr_ptr pt = (tr_fr_ptr)LOCAL_TrailBase;
272 if (pt[140].term == 0 && pt[140].value != 0)
275 if (worker_id != 04 || worker_id != 03)
279 if (vsc_count < 1468068888) {
280 UNLOCK(Yap_heap_regs->low_level_trace_lock);
283 if (port != enter_pred || !pred || pred->ArityOfPE != 4 ||
284 strcmp(RepAtom(NameOfFunctor(pred->FunctorOfPred))->StrOfAE,
285 "in_between_target_phrases")) {
286 UNLOCK(Yap_heap_regs->low_level_trace_lock);
289 if (vsc_count < 1246949400LL) {
290 UNLOCK(Yap_heap_regs->low_level_trace_lock);
293 if (vsc_count == 1246949493LL)
295 if (vsc_count < 5646100000LL) {
296 UNLOCK(Yap_heap_regs->low_level_trace_lock);
299 if (vsc_count == 5646100441LL)
301 if (vsc_count < 2923351500LL) {
302 UNLOCK(Yap_heap_regs->low_level_trace_lock);
305 if (vsc_count == 123536441LL)
307 if (vsc_count < 5530257LL) {
308 UNLOCK(Yap_heap_regs->low_level_trace_lock);
311 if (vsc_count == 9414280LL) {
314 if (vsc_count < 3399741LL) {
315 UNLOCK(Yap_heap_regs->low_level_trace_lock);
321 tr_fr_ptr pt = (tr_fr_ptr)LOCAL_TrailBase;
322 if (pt[153].term == 0 && pt[153].value == 0 && pt[154].term != 0 &&
323 pt[154].value != 0 && (TR > pt + 154 || TR_FZ > pt + 154))
325 if (pt[635].term == 0 && pt[635].value == 0 && pt[636].term != 0 &&
326 pt[636].value != 0 && (TR > pt + 636 || TR_FZ > pt + 636))
328 if (pt[138].term == 0 && pt[138].value == 0 && pt[139].term != 0 &&
329 pt[139].value != 0 && (TR > pt + 138 || TR_FZ > pt + 138))
332 if (vsc_count == 287939LL)
334 if (vsc_count == 173118LL)
336 if (!(vsc_count >= 287934LL && vsc_count <= 287939LL) &&
337 !(vsc_count >= 173100LL && vsc_count <= 173239LL) && vsc_count != -1) {
340 if (vsc_count == 51021) {
341 printf(
"Here I go\n");
343 if (vsc_count < 52000) {
344 UNLOCK(Yap_heap_regs->low_level_trace_lock);
347 if (vsc_count > 52000)
349 UNLOCK(Yap_heap_regs->low_level_trace_lock);
351 if (vsc_count == 837074) {
352 printf(
"Here I go\n");
355 UNLOCK(Yap_heap_regs->low_level_trace_lock);
366 UNLOCK(Yap_heap_regs->low_level_trace_lock);
371 env_ptr = (CELL *)(env_ptr[E_E]);
376 b += snprintf(b, top - b,
"%llud " UInt_FORMAT
" ", vsc_count,
378 b += snprintf(b, top - b, Int_FORMAT
" ", LCL0 - (CELL *)Yap_REGS.CUT_C_TOP);
379#if defined(THREADS) || defined(YAPOR)
380 b += snprintf(b, top - b,
"(%d)", worker_id);
384 UNLOCK(Yap_low_level_trace_lock);
388 if (pred->ModuleOfPred == PROLOG_MODULE) {
389 if (!LOCAL_do_trace_primitives) {
390 UNLOCK(Yap_low_level_trace_lock);
396 mname = RepAtom(AtomOfTerm(Yap_Module_Name(pred)))->StrOfAE;
400 arity = pred->ArityOfPE;
402 s = (
char *)RepAtom((
Atom)pred->FunctorOfPred)->StrOfAE;
404 s = (
char *)RepAtom(NameOfFunctor((pred->FunctorOfPred)))->StrOfAE;
408 b = send_tracer_message(
"CALL: ", s, arity, mname, args, &buf, b, &top);
411 b = send_tracer_message(
"TRY_OR ", NULL, 0, NULL, args, &buf, b, &top);
414 b = send_tracer_message(
"FAIL ", NULL, 0, NULL, args, &buf, b, &top);
415 b = send_tracer_message(
"RETRY_OR ", NULL, 0, NULL, NULL, &buf, b, &top);
417 case retry_table_generator:
418 b = send_tracer_message(
"FAIL ", NULL, 0, NULL, args, &buf, b, &top);
419 mname = (
char *)RepAtom(AtomOfTerm(Yap_Module_Name(pred)))->StrOfAE;
420 arity = pred->ArityOfPE;
422 s = (
char *)RepAtom((
Atom)pred->FunctorOfPred)->StrOfAE;
424 s = (
char *)RepAtom(NameOfFunctor((pred->FunctorOfPred)))->StrOfAE;
425 b = send_tracer_message(
"RETRY GENERATOR: ", s, arity, mname, args, &buf, b,
428 case retry_table_consumer:
429 b = send_tracer_message(
"FAIL ", NULL, 0, NULL, args, &buf, b, &top);
430 mname = (
char *)RepAtom(AtomOfTerm(Yap_Module_Name(pred)))->StrOfAE;
431 arity = pred->ArityOfPE;
433 s = (
char *)RepAtom((
Atom)pred->FunctorOfPred)->StrOfAE;
434 b = send_tracer_message(
"RETRY CONSUMER: ", s, 0, mname, NULL, &buf, b,
437 s = (
char *)RepAtom(NameOfFunctor((pred->FunctorOfPred)))->StrOfAE;
438 b = send_tracer_message(
"RETRY CONSUMER: ", s, pred->ArityOfPE, mname,
439 NULL, &buf, b, &top);
442 case retry_table_loader:
443 b = send_tracer_message(
"FAIL ", NULL, 0, NULL, args, &buf, b, &top);
444 if (pred == UndefHook) {
445 b = send_tracer_message(
"RETRY LOADER ", NULL, 0, NULL, NULL, &buf, b,
448 mname = (
char *)RepAtom(AtomOfTerm(Yap_Module_Name(pred)))->StrOfAE;
449 arity = pred->ArityOfPE;
451 s = (
char *)RepAtom((
Atom)pred->FunctorOfPred)->StrOfAE;
453 s = (
char *)RepAtom(NameOfFunctor((pred->FunctorOfPred)))->StrOfAE;
454 b = send_tracer_message(
"RETRY LOADER: ", s, 0, mname, NULL, &buf, b,
459 b = send_tracer_message(
"FAIL ", NULL, 0, NULL, args, &buf, b, &top);
461 mname = (
char *)RepAtom(AtomOfTerm(Yap_Module_Name(pred)))->StrOfAE;
462 arity = pred->ArityOfPE;
463 if (pred->ModuleOfPred == IDB_MODULE) {
466 }
else if (arity == 0) {
467 s = (
char *)RepAtom((
Atom)pred->FunctorOfPred)->StrOfAE;
469 s = (
char *)RepAtom(NameOfFunctor((pred->FunctorOfPred)))->StrOfAE;
471 b = send_tracer_message(
"RETRY: ", s, arity, mname, args, &buf, b, &top);
475 UNLOCK(Yap_low_level_trace_lock);
477 __android_log_print(ANDROID_LOG_DEBUG,
"YAPDroid",
"%s\n", buf);
487void toggle_low_level_trace(
void) {
488 Yap_do_low_level_trace = !Yap_do_low_level_trace;
491static Int start_low_level_trace(USES_REGS1) {
492 Yap_do_low_level_trace = TRUE;
496static Int total_choicepoints(USES_REGS1) {
497 return Yap_unify(MkIntegerTerm(LOCAL_total_choicepoints), ARG1);
500static Int reset_total_choicepoints(USES_REGS1) {
501 LOCAL_total_choicepoints = 0;
505static Int show_low_level_trace(USES_REGS1) {
506 fprintf(stderr,
"Call counter=%lld\n", vsc_count);
511static Int start_low_level_trace2(USES_REGS1) {
512 thread_trace = IntegerOfTerm(Deref(ARG1)) + 1;
513 Yap_do_low_level_trace = TRUE;
529static Int stop_low_level_trace(USES_REGS1) {
530 Yap_do_low_level_trace = FALSE;
532 LOCAL_do_trace_primitives = TRUE;
541static Int vsc_wait(USES_REGS1) {
547static Int vsc_go(USES_REGS1) {
552void Yap_InitLowLevelTrace(
void) {
553 Yap_InitCPred(
"start_low_level_trace", 0, start_low_level_trace,
555 Yap_InitCPred(
"$start_low_level_trace", 0, start_low_level_trace,
565 Yap_InitCPred(
"start_low_level_trace", 1, start_low_level_trace2,
568 Yap_InitCPred(
"stop_low_level_trace", 0, stop_low_level_trace, SafePredFlag);
569 Yap_InitCPred(
"show_low_level_trace", 0, show_low_level_trace, SafePredFlag);
570 Yap_InitCPred(
"$stop_low_level_trace", 0, stop_low_level_trace, SafePredFlag);
571 Yap_InitCPred(
"total_choicepoints", 1, total_choicepoints, SafePredFlag);
572 Yap_InitCPred(
"reset_total_choicepoints", 0, reset_total_choicepoints,
574 Yap_InitCPred(
"vsc_wait", 0, vsc_wait, SafePredFlag);
575 Yap_InitCPred(
"vsc_go", 0, vsc_go, SafePredFlag);
580static null(USES_REGS1) {
return true; }
582void Yap_InitLowLevelTrace(
void) {
583 Yap_InitCPred(
"$start_low_level_trace", 0,
null,
584 SafePredFlag | HiddenPredFlag);
585 Yap_InitCPred(
"$stop_low_level_trace", 0,
null,
586 SafePredFlag | HiddenPredFlag);
void * Malloc(size_t sz USES_REGS)
allocate a temporary text block