* Clean up/refactor stack back-tracing code, reducing overall amount of checks and rejecting range from StackBottom to <current frame>.

git-svn-id: trunk@27097 -
This commit is contained in:
sergei 2014-03-11 16:29:20 +00:00
parent 3b5552ae75
commit 5ddb267d57

View File

@ -533,16 +533,16 @@ begin
{ retrieve backtrace info } { retrieve backtrace info }
bp:=get_frame; bp:=get_frame;
pcaddr:=get_pc_addr; pcaddr:=get_pc_addr;
oldbp:=bp;
get_caller_stackinfo(bp,pcaddr); get_caller_stackinfo(bp,pcaddr);
{ valid bp? }
if (bp>=StackBottom) and (bp<(StackBottom + StackLength)) then
for i:=1 to tracesize do for i:=1 to tracesize do
begin begin
if (bp<oldbp) or (bp>(StackBottom + StackLength)) then
break;
oldbp:=bp; oldbp:=bp;
get_caller_stackinfo(bp,pcaddr); get_caller_stackinfo(bp,pcaddr);
pp^.calls[i]:=pcaddr; pp^.calls[i]:=pcaddr;
if (bp<oldbp) or (bp>(StackBottom + StackLength)) then
break;
end; end;
{ insert in the linked list } { insert in the linked list }
@ -576,6 +576,7 @@ function CheckFreeMemSize(loc_info: pheap_info; pp: pheap_mem_info;
size, ppsize: ptruint): boolean; inline; size, ppsize: ptruint): boolean; inline;
var var
i: ptruint; i: ptruint;
oldbp,
bp : pointer; bp : pointer;
pcaddr : codepointer; pcaddr : codepointer;
ptext : ^text; ptext : ^text;
@ -638,15 +639,16 @@ begin
begin begin
bp:=get_frame; bp:=get_frame;
pcaddr:=get_pc_addr; pcaddr:=get_pc_addr;
oldbp:=bp;
get_caller_stackinfo(bp,pcaddr); get_caller_stackinfo(bp,pcaddr);
if (bp>=StackBottom) and (bp<(StackBottom + StackLength)) then
for i:=(tracesize div 2)+1 to tracesize do for i:=(tracesize div 2)+1 to tracesize do
begin begin
if (bp<oldbp) or (bp>(StackBottom + StackLength)) then
break;
oldbp:=bp;
get_caller_stackinfo(bp,pcaddr); get_caller_stackinfo(bp,pcaddr);
pp^.calls[i]:=pcaddr; pp^.calls[i]:=pcaddr;
if not((bp>=StackBottom) and (bp<(StackBottom + StackLength))) then
break;
end; end;
end; end;
inc(loc_info^.freemem_cnt); inc(loc_info^.freemem_cnt);
@ -920,15 +922,15 @@ begin
{ generate new backtrace } { generate new backtrace }
bp:=get_frame; bp:=get_frame;
pcaddr:=get_pc_addr; pcaddr:=get_pc_addr;
oldbp:=bp;
get_caller_stackinfo(bp,pcaddr); get_caller_stackinfo(bp,pcaddr);
if (bp>=StackBottom) and (bp<(StackBottom + StackLength)) then
for i:=1 to tracesize do for i:=1 to tracesize do
begin begin
if (bp<oldbp) or (bp>(StackBottom + StackLength)) then
break;
oldbp:=bp; oldbp:=bp;
get_caller_stackinfo(bp,pcaddr); get_caller_stackinfo(bp,pcaddr);
pp^.calls[i]:=pcaddr; pp^.calls[i]:=pcaddr;
if (bp<oldbp) or (bp>(StackBottom + StackLength)) then
break;
end; end;
{ regenerate signature } { regenerate signature }
if usecrc then if usecrc then