9 Function name_extract(a
As String)
As String
11 For i=
Len(a)
To 1 Step -1
12 If a[i-1]=
Asc(
":")
Or a[i-1]=
Asc(
"\")
Or a[i-1]=
Asc(
"/")
Then Exit For
16 Function Common_exist(ad
As UInteger)
As Integer
17 For i
As Integer = 1
To vrbgbl
18 If vrb(i).adr=ad
Then Return TRUE
22 Sub enum_check(idx
As Integer)
23 For i
As Integer =1
To udtmax-1
25 If udt(idx).nm=udt(i).nm
Then
26 If udt(idx).ub-udt(idx).lb=udt(i).ub-udt(i).lb
Then
27 If cudt(udt(idx).ub).nm=cudt(udt(i).ub).nm
Then
28 If cudt(udt(idx).lb).nm=cudt(udt(i).lb).nm
Then
30 udt(idx).lb=udt(i).lb:udt(idx).ub=udt(i).ub
41 Function cutup_names(strg
As String)
As String
44 Dim As String nm,strg2,nm2
46 strg2=
Mid(strg,p+3,999)
48 If p>9
Then d=3
Else d=2
52 If p>9
Then d=3
Else d=2
54 Return "NS : "+nm+
"."+nm2
56 Function cutup_scp(gv
As Byte, ad
As UInteger,dlldelta
As Integer=0)
As Integer
59 Case Asc(
"S"),
Asc(
"G")
60 If gv=
Asc(
"G")
Then If Common_exist(ad)
Then Return 0
61 msg=*__(
"Reached limit ")
62 If vrbgbl=VGBLMAX
Then simple_message(
"Init Globals",msg):
Exit Function
69 vrb(vrbgbl).adr+=dlldelta
75 If vrbloc=VARMAX
Then simple_message(
"Init locals",
"Reached limit "+
Str(VARMAX-3000)):
Exit Function
79 proc(procnb+1).vr=vrbloc+1
96 Sub cutup_enum(readl
As String)
104 udtidx=
Val(
Mid(readl,p,q-p))
105 udtidx+=udtcpt:
If udtidx>udtmax
Then udtmax=udtidx
106 If udtmax > TYPEMAX
Then simple_message(
"Storing ENUM="+tnm,
"Max limit reached "+
Str(TYPEMAX)):
Exit Sub
109 udt(udtidx).en=udtidx
110 udt(udtidx).lg=
Len(
Integer)
112 udt(udtidx).lb=cudtnb+1
115 If InStr(readl,
";")=0
Then
117 cudt(cudtnb).nm=
"DUMMY"
119 simple_message(
"Storing ENUM="+tnm,
"Data not correctly formated "):
Exit Sub
121 While readl[p-1]<>
Asc(
";")
123 If cudtnb>=CTYPEMAX
Then simple_message(
"Storing ENUM="+tnm,
"Max limit reached "+
Str(CTYPEMAX)):
Exit Sub
125 cudt(cudtnb).nm=
Mid(readl,p,q-p)
129 cudt(cudtnb).
val=
Val(
Mid(readl,p,q-p))
134 udt(udtidx).ub=cudtnb
137 Function cutup_array(gv
As String,d
As Integer,f
As Byte)
As Integer
138 Dim As Integer p=d,q,c
140 If arrnb>ARRMAX
Then simple_message(
"Max array reached",
"can't store"):
Exit Function
144 While InStr(p,gv,
"ar")
148 If InStr(gv,
"=r(")
Then
157 arr(arrnb).nlu(c).lb=
Val(
Mid(gv,p,q-p))
161 arr(arrnb).nlu(c).ub=
Val(
Mid(gv,p,q-p))
168 vrb(*vrbptr).arr=@arr(arrnb)
170 cudt(cudtnb).arr=@arr(arrnb)
174 Sub cutup_2(gv
As String,f
As Byte)
175 Dim p
As Integer=1,c
As Integer,e
As Integer,gv2
As String,pp
As Integer
176 If InStr(gv,
"=")=0
Then
178 If c=udt(15).index
Then c=15
179 If c>15
Then c+=udtcpt
191 If InStr(gv,
"=ar1")
Then p=cutup_array(gv,
InStr(gv,
"=ar1")+1,f)
193 For p=0
To Len(gv2)-1
194 If gv2[p]=
Asc(
"*")
Then c+=1
195 If gv2[p]=
Asc(
"=")
Then e=p+1
198 If InStr(gv2,
"=f")
Then
199 If InStr(gv2,
"=f7")
Then
206 If gv2[e]=
Asc(
"*")
Then e+=1
212 If c=udt(15).index
Then c=15
213 If c>15
Then c+=udtcpt
223 Sub cutup_udt(readl
As String)
224 Dim As Integer p,q,lgbits,flagdouble
229 If InStr(readl,
":Tt")
Then
237 udtidx=
Val(
Mid(readl,p,q-p))
238 If tnm=
"OBJECT" OrElse tnm=
"$fb_Object" Then udt(15).index=udtidx:
Exit sub
239 udtidx+=udtcpt:
If udtidx>udtmax
Then udtmax=udtidx
240 If udtmax > TYPEMAX-1
Then simple_message(
"Storing UDT",
"Max limit reached "+
Str(TYPEMAX)):
Exit Sub
242 If left(tnm,4)=
"TMP$" Then Exit Sub
249 udt(udtidx).lg=
Val(
Mid(readl,p,q-p))
251 udt(udtidx).lb=cudtnb+1
252 while readl[p-1]<>
Asc(
";")
254 If cudtnb = CTYPEMAX
Then simple_message(
"Storing CUDT",
"Max limit reached "+
Str(CTYPEMAX)):
Exit Sub
260 cudt(cudtnb).nm=
Mid(readl,p,q-p)
264 cutup_2(
Mid(readl,p,q-p),TYUDT)
267 If Left(udt(cudt(cudtnb).typ).nm,7)=
"FBARRAY" Then
275 cudt(cudtnb).pt=cudt(udt(cudt(cudtnb).typ).lb).pt-1
276 cudt(cudtnb).typ=cudt(udt(cudt(cudtnb).typ).lb).typ
277 cudt(cudtnb).arr=
Cast(tarr
Ptr,-1)
286 cudt(cudtnb).ofs=
Val(
Mid(readl,p,q-p))
289 lgbits=
Val(
Mid(readl,p,q-p))
291 If cudt(cudtnb).typ<>4
And cudt(cudtnb).pt=0
And cudt(cudtnb).arr=0
Then
292 If lgbits<>udt(cudt(cudtnb).typ).lg*8
Then
293 cudt(cudtnb).typ=TYPEMAX
294 cudt(cudtnb).ofb=cudt(cudtnb).ofs-(cudt(cudtnb).ofs\8) * 8
295 cudt(cudtnb).lg=lgbits
300 cudt(cudtnb).ofs=cudt(cudtnb).ofs\8
302 udt(udtidx).ub=cudtnb
304 Sub cutup_1(gv
As String,ad
As UInteger, dlldelta
As Integer=0)
306 Static defaulttype
As Integer
309 If InStr(gv,
"long double:t")<>0
OrElse InStr(gv,
"FBSTRING:t")<>0
Then
311 ElseIf Left(gv,5)=
"int:t" OrElse InStr(gv,
"_Decimal32:t")<>0
Then
315 If InStr(gv,
"pchar:t")
Then
317 ElseIf InStr(gv,
"integer:t")
Then
321 If defaulttype
Then Exit Sub
326 vname=
Left(gv,
InStr(gv,
":")+1)
329 If InStr(vname,
":t")<>0
Then
330 If UCase(
Left(vname,
InStr(vname,
":")))<>
Left(vname,
InStr(vname,
":"))
Then
333 ElseIf InStr(vname,
"_ZTSN")<>0
orelse InStr(vname,
"_ZTVN")<>0
then
336 If Left(vname,2)=
"_{" Then Exit Sub
337 If Left(vname,3)=
".Lt" Then Exit Sub
339 If InStr(p+1,vname,
"$") <>0
AndAlso InStr(vname,
"$fb_Object")=0
Then
343 If InStr(vname,
":t")<>0
Then
344 If Left(vname,5)<>
"$fb_O" andalso Left(vname,4)<>
"TMP$" Then
348 If InStr(vname,
"$fb_RTTI")
OrElse InStr(vname,
"fb$result$")
Then
351 If Left(vname,3)=
"vr$" OrElse Left(vname,4)=
"tmp$" Then
355 If Left(vname,4)<>
"TMP$" Then
356 If p<>1
Then gv=
Left(gv,p-1)+
Mid(gv,
InStr(gv,
":"))
360 If InStr(gv,
";;")
Then
361 If InStr(gv,
":T")
Then
366 If cutup_scp(gv[
InStr(gv,
":")],ad,dlldelta)=0
Then Exit Sub
368 vrb(*vrbptr).nm=
Left(gv,
InStr(gv,
":")-1)
377 While InStr(p,gv,
";;")<>0
381 cutup_2(
Mid(gv,p),TYRDM)
382 vrb(*vrbptr).arr=
Cast(tarr
Ptr,-1)
384 ElseIf InStr(gv,
"=e")
Then
389 If InStr(gv,
"FDBG_COMPIL_INFO")
Then Exit Sub
390 If gv[0]=
Asc(
":")
Then Exit Sub
391 p=cutup_scp(gv[
InStr(gv,
":")],ad,dlldelta)
393 If InStr(gv,
"_ZN")
AndAlso InStr(gv,
":")
Then
394 vrb(*vrbptr).nm=cutup_names(gv)
396 vrb(*vrbptr).nm=
Left(gv,
InStr(gv,
":")-1)
398 If vrb(*vrbptr).mem=2
AndAlso vrb(*vrbptr).nm=vrb(*vrbptr-1).nm
Then
403 cutup_2(
Mid(gv,
InStr(gv,
":")+p),TYDIM)
405 If Left(udt(vrb(*vrbptr).typ).nm,7)=
"FBARRAY" Then
409 vrb(*vrbptr).pt=cudt(udt(vrb(*vrbptr).typ).lb).pt-1
410 vrb(*vrbptr).typ=cudt(udt(vrb(*vrbptr).typ).lb).typ
411 vrb(*vrbptr).arr=
Cast(tarr
Ptr,-1)
418 Function cutup_op (op
As String)
As String
457 Function =
"andalso="
541 Function =
"(Constructor)"
543 Function =
"(Destructor)"
548 Function parse_typeope(vchar
As long)
As String
552 If vchar=
Asc(
"P")
Then
556 Select Case As Const vchar
591 Function cutup_proc(fullname
As String)
As String
592 Dim As Long p=3,lg,namecpt,ps
593 Dim As String strg,strg2,names(10),mainname,strg3
595 lg=
InStr(fullname,
"@")
596 If lg=0
Then lg=
InStr(fullname,
":")
597 strg=
Left(fullname,lg-1)
599 If InStr(strg,
"_Z")=0
Then Return strg
601 If strg[2]=
Asc(
"Z")
Then p+=1
602 If strg[p-1]=
Asc(
"N")
Then
605 While Strg[p-1]<>
Asc(
"E")
606 lg=
ValInt(
Mid(strg,p,2))
609 strg3=
Mid(strg,p+1,lg)
610 ps=
InStr(strg3,
"__get__")
612 strg3=
Left(strg3,ps-1)+
" (Get property)"
614 ps=
InStr(strg3,
"__set__")
616 strg3=
Left(strg3,ps-1)+
" (Set property)"
627 names(namecpt)=mainname
630 strg2+=
" "+cutup_op(
Mid(strg,p,2))+
" "
633 While Strg[p-1]<>
Asc(
"E")
634 lg=
ValInt(
Mid(strg,p,2))
637 strg3=
Mid(strg,p+1,lg)
638 If strg3=
"FBSTRING" Then strg3=
"string"
647 names(namecpt)=mainname
650 strg2+=parse_typeope(
Asc(
Mid(strg,p,1)))
658 strg2=cutup_op(
Mid(strg,p,2))+
" "
662 If strg[p-1]=
Asc(
"E")
Then p+=1
668 lg=
ValInt(
Mid(strg,p,2))
671 strg3=
Mid(strg,p+1,lg)
672 If strg3=
"FBSTRING" Then strg3=
"String"
681 names(namecpt)=mainname
683 elseIf strg[p-1]=
Asc(
"R")
Then
684 If Right(strg2,1)<>
"(" AndAlso Right(strg2,1)<>
"," Then strg2+=
","
686 elseIf strg[p-1]=
Asc(
"N")
Then
687 If Right(strg2,1)<>
"(" AndAlso Right(strg2,1)<>
"," Then strg2+=
","
690 elseIf strg[p-1]=
Asc(
"K")
Then
691 If Right(strg2,1)<>
"(" AndAlso Right(strg2,1)<>
"," Then
697 elseIf strg[p-1]=
Asc(
"E")
Then
700 ElseIf strg[p-1]=
Asc(
"S")
Then
701 If Right(strg2,1)<>
"(" AndAlso Right(strg2,1)<>
"," Then strg2+=
",":mainname=
""
703 If strg[p-1]=
asc(
"_")
Then
707 strg3=names(strg[p-1]-46)
718 names(namecpt)=mainname
720 If Right(strg2,1)=
"(" Then
721 strg2+=parse_typeope(
Asc(
Mid(strg,p,1)))
723 strg2+=
","+parse_typeope(
Asc(
Mid(strg,p,1)))
730 If Right(strg2,6)=
"(Void)" Then
731 strg2=
Left(strg2,
Len(strg2)-6)
736 Sub cutup_retval(prcnb
As Integer,gv2
As String)
738 Dim p
As Integer,c
As Integer,e
As Integer
739 For p=0
To Len(gv2)-1
740 If gv2[p]=
Asc(
"*")
Then c+=1
741 If gv2[p]=
Asc(
"=")
Then e=p+1
744 If InStr(gv2,
"=f")
OrElse InStr(gv2,
"=F")
Then
745 If InStr(gv2,
"=f7")
OrElse InStr(gv2,
"=F7")
Then
751 If gv2[e]=
Asc(
"*")
Then e+=1
758 If c=udt(15).index
Then c=15
759 If c>15
Then c+=udtcpt
764 Function check_source(sourcenm
As String)
As Integer
765 Static As String fpath
766 If sourcenm=
"" Then Return -1
767 If Right(sourcenm,1)=SLASH
Then fpath=sourcenm:
Return -1
768 If instr(sourcenm,
":")=0
Then sourcenm=fpath+sourcenm
770 For i
As Integer=0
To sourcenb
771 If source(i).fullname=sourcenm
Then Return i
774 source(sourcenb).fullname=sourcenm
775 source(sourcenb).shortname=name_extract(sourcenm)
778 Function stabs_extract(nfile
As String,adrdiff
As uinteger)
As Long
779 Dim As Integer counter,flagstd
780 Dim As String dissas_command,code,procnmt,fpath,fname
782 Dim As Long srcprevnb=sourcenb,procnodll=TRUE,lastline,linen,temp
783 Dim As UInteger procadr,varadr,linea
785 If Dir(ExePath2+SLASH+
"objdump.exe")=
"" Then simple_message(
"Stabs extract",
"Error : objdump.exe must be in the directory of fbdebugger ("+ExePath2+SLASH+
"objdump.exe)"):
Return 0
788 dissas_command=
""""""+ExePath2+SLASH+
"objdump.exe"""+
" -G " """"+nfile+
""""""
789 counter=
Open Pipe( dissas_command
For Input As #stff)
793 Line Input #stff, stln
803 linen=
Valint(
Mid(stln,22,6)):linea=
ValInt(
"&h"+
Mid(stln,29,8))+procadr
806 If linen>lastline
Then
808 If linea<>rline(linenb).ad
Then
814 rline(linenb).ad=linea
816 If rLine(linenb).sv=-112
Then
820 rLine(linenb).nu=linen:rLine(linenb).pr=procnb
821 Print "ligne=";linen,rline(linenb).ad
824 dbg_prt(
"Line / adr : "+
Str(linen)+
" "+
Hex(rline(linenb).ad))
827 If linea-procadr
Then lastline=linen
843 Print "File=";fname;
" xx ";
left(stln,45)
844 temp=check_source(fname)
847 Print "Current File=";source(sourceix).fullname
850 If Mid(stln,45,10)=
"integer:t1" Then
852 ElseIf Mid(stln,45,8)=
"pchar:t1" Then
854 ElseIf flagstd=0
Then
855 If InStr(stln,
":Tt")
then
856 Print "Udt=";
Mid(stln,45,50)
857 cutup_1(
Mid(stln,45),0)
859 varadr=
ValInt(
"&h"+
Mid(stln,29,8))
860 Print "Local var=";
Mid(stln,45);
" ";varadr
861 cutup_1(
Mid(stln,45),varadr)
866 Print"Include file=";fname
867 temp=check_source(fname)
870 Print "Current File=";source(sourceix).fullname
876 If Mid(stln,45)=
"" Then
881 procadr=
ValInt(
"&h"+
Mid(stln,29,8))
882 procadr+=proc(procnb).db
883 proc(procnb).fn=procadr
884 If procadr>procfn
Then procfn=procadr+1
885 Print "procfn=";procfn
888 If proc(procnb).nu=rline(linenb).nu
AndAlso linenb>2
Then
890 For i
As Integer =1
To linenb
893 If rline(i).ad>=proc(procnb).db
AndAlso rline(i).ad<=proc(procnb).fn
Then
902 If proc(procnb).rv=7
Then
904 proc(procnb).fn=rline(linenb).ad
908 If proc(procnb).nm<>
"main" Then
910 rline(linenb).ad=rline(linenb+1).ad
911 rline(linenb).sv=rline(linenb+1).sv
912 proc(procnb).fn=rline(linenb).ad
927 procadr=
ValInt(
"&h"+
Mid(stln,29,8))
929 Print "Proc=";
Mid(stln,45);
" ";procadr
932 procnmt=cutup_proc(
Left(
Mid(stln,45),
InStr(
Mid(stln,45),
":")))
934 If procnmt=
"{MODLEVEL}" Then Exit Select
936 procnb+=1:proc(procnb).sr=sourceix
938 If InStr(procnmt,
"@")
Then
939 proc(procnb).nm=
Left(procnmt,
InStr(procnmt,
"@")-1)
941 proc(procnb).nm=procnmt
943 cutup_retval(procnb,
Mid(stln,
InStr(stln,
":")+2,99))
944 proc(procnb).db=procadr
946 proc(procnb).nu=
Valint(
Mid(stln,22,6)):lastline=0
947 proc(procnb+1).vr=proc(procnb).vr
949 varadr=
ValInt(
"&h"+
Mid(stln,29,8))
950 Print "Param=";
Mid(stln,45);
" ";varadr
951 cutup_1(
Mid(stln,45),varadr)
953 varadr=
ValInt(
"&h"+
Mid(stln,29,8))
954 Print "Shared/Common/Static=";
Mid(stln,45);
" ";varadr
955 cutup_1(
Mid(stln,45),varadr)
958 procadr=
ValInt(
"&h"+
Mid(stln,29,8))
959 Print "Entry point (main)=";procadr
963 Print "stabs unknow=";
left(stln,45):
969 Function display_pt(pt
As Long)
As String
970 If pt>220
Then Return String(.pt-220,
"*")
971 If pt>200
Then Return String(.pt-200,
"*")
972 Return String(.pt,
"*")
974 Sub extract_begin(nfile
As String)
982 stabs_extract(nfile,123456)
987 Print "global=";vrbgbl
988 For i
As Long =1
To vrbgbl
990 Print .nm;
" ";.typ;
" ";.adr;
" ";display_pt(.pt)
993 Print:
Print "local=";vrbloc
994 For i
As Long =VGBLMAX+1
To vrbloc
996 Print .nm;
" ";.typ;
" ";.adr;
" ";display_pt(.pt)
999 Print:
Print "Proc";procnb
1000 For i
As Long =1
To procnb
1002 Print i;
" ";.nm;
" ret=";udt(.rv).nm;
" ";
String(.pt,
"*");
" ";.vr;
" ";proc(i+1).vr-1;
" ";source(.sr).shortname;
" nu=";.nu;
1003 If .nu=-1
Then Print " added by compiler" Else Print
1004 For j
As Long =proc(i).vr
To proc(i+1).vr-1
1006 If .mem=4
OrElse .mem=5
Then Print "Param=";
Else Print "Local=";
1007 Print j;
" ";.nm;
" ";.typ;
" ";.adr;
" ";display_pt(.pt)
1013 For j
As Long=1
To linenb
1016 Print "nu=";.nu;
" ad=";.ad
1021 Print "------------------------"
1034 Dim As String prcname
1035 DIM AS GtkTreeIter tempiter
1036 If procnb=0
Then Exit Sub
1038 For i
As Long =1
To procnb
1040 Print i;
" ";.nm;
" ret=";udt(.rv).nm;
" ";
String(.pt,
"*");
" ";.vr;
" ";proc(i+1).vr-1;
" ";source(.sr).shortname;
" nu=";.nu;
1041 prcname=.nm+
" ret="+udt(.rv).nm+
" "+
String(.pt,
"*")+
" "+source(.sr).shortname+
" nu="+
Str(.nu)
1042 gtk_tree_store_append( GTK_TREE_STORE(GUI.tstoreProcs), @tempiter, NULL)
1043 gtk_tree_store_set( GTK_TREE_STORE(GUI.tstoreProcs), @tempiter, 0,
StrPtr(prcname), -1)
1044 proc(i).tv=@tempiter
1045 If .nu=-1
Then Print " added by compiler" Else Print
1046 For j
As Long =proc(i).vr
To proc(i+1).vr-1
1048 If .mem=4
OrElse .mem=5
Then Print "Param=";
Else Print "Local=";
1049 Print j;
" ";.nm;
" ";.typ;
" ";.adr;
" ";display_pt(.pt)