1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- unit bug0002;
- interface
- implementation
- {$message starting hexstr}
- function hexstr(val : longint;cnt : byte) : string;
-
- const
- hexval : string[16]=('0123456789ABCDEF');
-
- var
- s : string;
- l2,i : integer;
- l1 : longInt;
-
- begin
- s[0]:=char(cnt);
- l1:=longint($f) shl (4*(cnt-1));
- for i:=1 to cnt do
- begin
- l2:=(val and l1) shr (4*(cnt-i));
- l1:=l1 shr 4;
- s[i]:=hexval[l2+1];
- end;
- hexstr:=s;
- end;
- {$message starting dump_stack}
- procedure dump_stack(bp : longint);
- {$message starting get_next_frame}
- function get_next_frame(bp : longint) : longint;
- begin
- asm
- movl bp,%eax
- movl (%eax),%eax
- movl %eax,__RESULT
- end ['EAX'];
- end;
- procedure dump_frame(addr : longint);
- begin
- { to be used by symify }
- writeln(' 0x',HexStr(addr,8));
- end;
- {$message starting get_addr}
- function get_addr(BP : longint) : longint;
- begin
- asm
- movl BP,%eax
- movl 4(%eax),%eax
- movl %eax,__RESULT
- end ['EAX'];
- end;
- {$message starting main}
- var
- i,prevbp : longint;
- begin
- prevbp:=bp-1;
- i:=0;
- while bp > prevbp do
- begin
- dump_frame(get_addr(bp));
- i:=i+1;
- if i>max_frame_dump then exit;
- prevbp:=bp;
- bp:=get_next_frame(bp);
- end;
- end;
- end.
|