Article View: pl.comp.lang.delphi
Article #347174Re: callChain
From: Roman Tyczka
Date: Fri, 26 Jun 2020 15:27
Date: Fri, 26 Jun 2020 15:27
55 lines
3817 bytes
3817 bytes
On Fri, 26 Jun 2020 05:03:12 -0700 (PDT), apl wrote:
> 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;
Program, który wkleiłeś nie zadziała jak opisałeś, sprawdź.
--
pozdrawiam
Roman Tyczka
Technical Details
Message-ID:
<11s1yocj1ipmk.dlg@tyczka.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin2!goblin.stu.neva.ru!aioe.org!peer01.ams4!peer.am4.highwinds-media.com!news.highwinds-media.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mailReferences:
<81b9653c-e77c-444e-9e47-38872c9e3853o@googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin2!goblin.stu.neva.ru!aioe.org!peer01.ams4!peer.am4.highwinds-media.com!news.highwinds-media.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail From: Roman Tyczka <noemail@because.no> Subject: Re: callChain Newsgroups: pl.comp.lang.delphi User-Agent: 40tude_Dialog/2.0.15.84 MIME-Version: 1.0 Sender: romek@tyczka.no.found References: <81b9653c-e77c-444e-9e47-38872c9e3853o@googlegroups.com> Date: Fri, 26 Jun 2020 17:27:36 +0200 Message-ID: <11s1yocj1ipmk.dlg@tyczka.com> Lines: 55 Organization: Telekomunikacja Polska NNTP-Posting-Host: 94.75.90.137 X-Trace: 1593185256 unt-rea-a-01.news.neostrada.pl 17352 94.75.90.137:8798 X-Complaints-To: abuse@news.neostrada.pl X-Received-Bytes: 3599 X-Received-Body-CRC: 3630171042 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit