#help_index "Debugging/Dump" Bool ClassRep2(CDoc *doc,U8 *_d,U8 *class_name=lastclass, I64 depth,I64 max_depth,Bool dynamic,I64 types=HTT_CLASS,I64 offset=0) {//See $LK,"::/Demo/LastClass.HC"$. I64 i,j,stars,*ptr; CMemberLst *ml; CDocEntry *doc_e; Bool unlock; CHashClass *tmpc,*tmpc2; if (depth>=max_depth) return TRUE; if (!(tmpc=HashFind(class_name,Fs->hash_table,types))) { DocPrint(doc,"Class Not Found.\n"); return FALSE; } if (!ChkPtr(_d) || !ChkPtr(_d(U8 *)+tmpc->size)) { DocPrint(doc,"Bad Ptr:%016X\n",_d); return FALSE; } if (tmpc->base_class && !ClassRep2(doc,_d,tmpc->base_class->str, depth,max_depth,dynamic,types,offset)) return FALSE; unlock=DocLock(doc); DocPrint(doc,"Class:\"%s\"\n",class_name); ml=tmpc->member_lst_and_root; while (ml) { tmpc2=ml->member_class; ptr=_d(U8 *)+ml->offset; DocPrint(doc,"%08X ",ptr(U8 *)+offset); stars=tmpc2->ptr_stars_cnt; tmpc2=OptClassFwd(tmpc2); tmpc2-=tmpc2->ptr_stars_cnt; if (tmpc2->type & HTT_INTERNAL_TYPE) { DocPrint(doc,"$$GREEN$$%-20ts:$$FG$$",ml->str); if (stars==1 && (tmpc2->raw_type==RT_I8 || tmpc2->raw_type==RT_U8)) { ptr=*ptr; if (ChkPtr(ptr)) { if (dynamic) { doc_e=DocPrint(doc,"$$DA-TRM-P+RD,LEN=64,A=\"%%40ts\"$$\n"); doc_e->data=ptr; DocDataFmt(doc,doc_e); } else DocPrint(doc,"%40ts\n",ptr); } } else if (!stars) { j=MinI64(ml->dim.total_cnt,32); if (tmpc2->raw_type==RT_I8 || tmpc2->raw_type==RT_U8) { if (j==1) { if (dynamic) { doc_e=DocPrint(doc,"$$DA-TRM+RD+UD,RT=U8,A=\"%%c\"$$\n"); doc_e->data=ptr; } else DocPrint(doc,"%c\n",*ptr(U8 *)); } else { if (dynamic) { doc_e=DocPrint(doc,"$$DA-TRM-P+RD,LEN=64,A=\"%%40ts\"$$\n"); doc_e->data=ptr; DocDataFmt(doc,doc_e); } else DocPrint(doc,"%40ts\n",ptr); } } for (i=0;iraw_type) { case RT_I0: case RT_U0: break; case RT_I8: if (dynamic) { doc_e=DocPrint(doc,"$$DA-TRM+RD+UD,RT=I8,A=\"%%02X\"$$ "); doc_e->data=ptr(I8 *)++; } else DocPrint(doc,"%02X ",*ptr(I8 *)++); break; case RT_U8: if (dynamic) { doc_e=DocPrint(doc,"$$DA-TRM+RD+UD,RT=U8,A=\"%%02X\"$$ "); doc_e->data=ptr(U8 *)++; } else DocPrint(doc,"%02X ",*ptr(U8 *)++); break; case RT_I16: if (dynamic) { doc_e=DocPrint(doc,"$$DA-TRM+RD+UD,RT=I16,A=\"%%04X\"$$ "); doc_e->data=ptr(I16 *)++; } else DocPrint(doc,"%04X ",*ptr(I16 *)++); break; case RT_U16: if (dynamic) { doc_e=DocPrint(doc,"$$DA-TRM+RD+UD,RT=U16,A=\"%%04X\"$$ "); doc_e->data=ptr(U16 *)++; } else DocPrint(doc,"%04X ",*ptr(U16 *)++); break; case RT_I32: if (dynamic) { doc_e=DocPrint(doc,"$$DA-TRM+RD+UD,RT=I32,A=\"%%08X\"$$ "); doc_e->data=ptr(I32 *)++; } else DocPrint(doc,"%08X ",*ptr(I32 *)++); break; case RT_U32: if (dynamic) { doc_e=DocPrint(doc,"$$DA-TRM+RD+UD,RT=U32,A=\"%%08X\"$$ "); doc_e->data=ptr(U32 *)++; } else DocPrint(doc,"%08X ",*ptr(U32 *)++); break; case RT_U64: if (dynamic) { doc_e=DocPrint(doc,"$$DA-TRM+RD+UD,RT=U64,A=\"%%08X\"$$ "); doc_e->data=ptr(U64 *)++; } else DocPrint(doc,"%08X ",*ptr(U64 *)++); break; case RT_F64: if (dynamic) { doc_e=DocPrint(doc,"$$DA-TRM+RD+UD,RT=F64,A=\"%%16g\"$$ "); doc_e->data=ptr(F64 *)++; } else DocPrint(doc,"%16g ",*ptr(I64 *)++); break; default: if (dynamic) { doc_e=DocPrint(doc,"$$DA-TRM+RD+UD,A=\"%%016X\"$$ "); doc_e->data=ptr(I64 *)++; } else DocPrint(doc,"%016X ",*ptr(I64 *)++); } if (dynamic) DocDataFmt(doc,doc_e); } if (jdim.total_cnt) DocPrint(doc,"..."); } else DocPrint(doc,"%016X",*ptr); DocPrint(doc,"\n"); } else { if (depth<2) { if (stars==1 && !ChkPtr(*ptr)) DocPrint(doc,"%-20ts:%016X\n",ml->str,*ptr); else { DocPrint(doc,"$$TR,\"%s\"$$\n",ml->str); DocPrint(doc,"$$ID,2$$"); if (!stars) ClassRep2(doc,ptr,tmpc2->str,depth+1,max_depth,dynamic); else if (stars==1) ClassRep2(doc,*ptr,tmpc2->str,depth+1,max_depth,dynamic); DocPrint(doc,"$$ID,-2$$"); } } else DocPrint(doc,"%-20ts\n",ml->str); } ml=ml->next; } if (unlock) DocUnlock(doc); return TRUE; } public U0 ClassRep(U8 *_d,U8 *class_name=lastclass, I64 max_depth=2,Bool fun=FALSE,I64 offset=0) {//Displays members of a record by using the compiler's info. CDoc *doc; if (IsRaw) doc=DocNew; else { DocMax; doc=DocPut; } if (fun) ClassRep2(doc,_d,class_name,0,max_depth,FALSE,HTT_FUN,offset); else ClassRep2(doc,_d,class_name,0,max_depth,FALSE,HTT_CLASS,offset); DocPrint(doc,"\n"); DocRecalc(doc); if (IsRaw) { DocDump(doc,100000); DocDel(doc); } } public U0 ClassRepD(U8 *_d,U8 *class_name=lastclass, I64 max_depth=2,Bool fun=FALSE,I64 offset=0) {//Dynamic ClassRep. Uses hex_ed widgit for live changes. CDoc *doc; if (IsRaw) doc=DocNew; else { DocMax; doc=DocPut; } if (fun) ClassRep2(doc,_d,class_name,0,max_depth,TRUE,HTT_FUN,offset); else ClassRep2(doc,_d,class_name,0,max_depth,TRUE,HTT_CLASS,offset); DocPrint(doc,"\n"); DocRecalc(doc); if (IsRaw) { DocDump(doc,100000); DocDel(doc); } } U0 UpdateRegVarImg(CHashFun *tmpf,U8 *_b,CTask *task) { CMemberLst *ml; CHashClass *tmpc; ml=tmpf->member_lst_and_root; while (ml) { if (ml->reg!=REG_NONE) { tmpc=OptClassFwd(ml->member_class); MemCpy(_b+ml->offset,TaskRegAddr(task,ml->reg),tmpc->size); } ml=ml->next; } } public U0 FunRep(U8 *st,U8 *rbp=NULL,I64 max_depth=2,CTask *task=NULL) {//Shows names and vals of a fun's local vars using compiler's info. I64 size; U8 *img; CHashFun *tmpf=HashFind(st,Fs->hash_table,HTT_FUN); CMemberLst *tmpm; if (tmpf) { if (rbp) { if (task) { //tmpf->size is negative.It's the bottom //of the fun local var space relative to RBP . size=tmpf->arg_cnt*8-tmpf->size+16; img=MAlloc(size); MemCpy(img,rbp+tmpf->size,size); UpdateRegVarImg(tmpf,img-tmpf->size,task); ClassRep(img-tmpf->size,st,max_depth,TRUE,rbp-img+tmpf->size); Free(img); } else ClassRep(rbp,st,max_depth,TRUE); } else { tmpm=tmpf->member_lst_and_root; while (tmpm) { if (0<=tmpm->regreg,"ST_U64_REGS",tmpm->str; else "%08tX %s\n",tmpm->offset,tmpm->str; tmpm=tmpm->next; } "%08tX Stk Size\n",tmpf->size; } } } #help_index "Debugging/Unassemble" public U0 Uf(U8 *st) {//Unassembles a named fun I64 i; CHashSrcSym *tmpf; CDbgInfo *dbg_info; if (tmpf=HashFind(st,Fs->hash_table,HTT_FUN|HTT_EXPORT_SYS_SYM)) { if (tmpf->type&HTT_FUN) FunRep(st); if (dbg_info=tmpf->dbg_info) { i=dbg_info->body[dbg_info->max_line+1-dbg_info->min_line] -dbg_info->body[0]; Un(dbg_info->body[0],i); "Code Size:%04X\n",i; } else U(HashVal(tmpf)); } }