mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-06 01:28:04 +02:00
84 lines
1.6 KiB
ObjectPascal
84 lines
1.6 KiB
ObjectPascal
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.
|