Article View: pl.comp.lang.delphi
Article #347166callChain
From: apl
Date: Fri, 26 Jun 2020 12:03
Date: Fri, 26 Jun 2020 12:03
48 lines
3784 bytes
3784 bytes
Drodzy koledzy,
każdy z was wie, jakim koszmarem jest debugowanie programu, zwłaszcza takiego, do którego sięgamy po wielu latach celem przebudowy nie mówiąc już o cudzych kodach źródłowych.
Bardzo pomocna w tym przypadku jest znajomość całego łańcucha wołań prowadzących do danego podprogramu.
W tym poście chciałbym podzielić się bardzo prostym wynalazkiem i poddać go waszej krytycznej ocenie.
Przypuśćmy, że śledzonym podprogramem jest procedure sub2.
Mój "chwyt" polega na dodaniu parametru formalnego callChain:string przekazywanego przez wartość oraz na zamieszczeniu na początku treści wykonawczej instrukcji callChain:=callChain+'>sub2'; Zabieg ten należy powtórzyć w każdym podprogramie wołającym wybrany śledzony (tu: sub2) z tym, że zamiast sub2 wpisujemy nazwę podprogramu wołającego z dodatkiem znaku '>' rozdzielającego nazwy w tworzonym łańcuchu. Krytyczne fragmenty treści sub2 obejmujemy instrukcją try except end, gdzie zamieszczamy showMessage informujący o błędzie. W przypadku iteracji, czy rekurencji przydatne będzie proliferowanie wartości zmiennych sterujących - dodajemy wtedy wymagane parametry formalne przekazywane przez wartość. Poniżej zamieszczam maksymalnie uproszczony przykład ilustrujący tę ideę zawierający iterację i rekurencję, stąd parametry i,n:word.
Tak wzbogacony program daje nieoceniony wgląd w bieżący stan wykonania programu odczytując aktualną wartość callChain. Program niejako buduje się sam, żądając brakujących parametrów formalnych podczas kompilacji.
Tym postem chciałbym zapoczątkować wakacyjną akcję dzielenia się na tym forum swoimi chwytami warsztatowymi. Gorąco zachęcam!!!
Pozdrawiam, apl
P.S. Błagam, powiedzcie PADowi NIE!!!
procedure sub2(callChain:string;i,n:word);
var r:real;
begin
callChain:=callChain+'>sub2';
r:=0;
try //enclosure of a critical fragment
r:=r/r;
except
showMessage('Error occured in a call chain "'+callChain+'". Iteration step='+intToStr(i)+'. Recursion step='+intToStr(n))
end;
end;{sub2}
procedure sub1(callChain:string;i,n:word);
begin
callChain:=callChain+'>sub1';
sub2(callChain,i,n);
end;{sub1}
procedure sub0(callChain:string;n:word);
var i:shortInt;
begin
callChain:=callChain+'>sub0';
for i:=0 to 5 do sub1(callChain,i,n);
if n<3 then sub0(callChain,n+1); //recursion
end;{sub0}
end.
Wołanie z poziomu formatki, to np.:
procedure TForm1.Button1Click(Sender: TObject);
begin
sub0('>TForm1.Button1Click',0);
end;
Technical Details
Message-ID:
<81b9653c-e77c-444e-9e47-38872c9e3853o@googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!2.eu.feeder.erje.net!feeder.erje.net!news.uzoreto.com!tr1.eu1.usenetexpress.com!feeder.usenetexpress.com!tr3.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mailShow Full Headers
Complete Article Headers
X-Received: by 2002:a0c:ea4a:: with SMTP id u10mr2657420qvp.225.1593172992618; Fri, 26 Jun 2020 05:03:12 -0700 (PDT) X-Received: by 2002:aca:dac5:: with SMTP id r188mr2192465oig.2.1593172992375; Fri, 26 Jun 2020 05:03:12 -0700 (PDT) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!2.eu.feeder.erje.net!feeder.erje.net!news.uzoreto.com!tr1.eu1.usenetexpress.com!feeder.usenetexpress.com!tr3.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.delphi Date: Fri, 26 Jun 2020 05:03:12 -0700 (PDT) Complaints-To: groups-abuse@google.com Injection-Info: google-groups.googlegroups.com; posting-host=109.173.147.252; posting-account=ukiAYgoAAADpsCfFgVYs3wM73JlzLYyB NNTP-Posting-Host: 109.173.147.252 User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <81b9653c-e77c-444e-9e47-38872c9e3853o@googlegroups.com> Subject: callChain From: apl <apl@icpnet.pl> Injection-Date: Fri, 26 Jun 2020 12:03:12 +0000 Lines: 71 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit