From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=unavailable autolearn_force=no version=3.4.4 X-Received: by 10.42.70.5 with SMTP id d5mr24943119icj.32.1416759189560; Sun, 23 Nov 2014 08:13:09 -0800 (PST) X-Received: by 10.140.20.175 with SMTP id 44mr295545qgj.4.1416759189511; Sun, 23 Nov 2014 08:13:09 -0800 (PST) Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!mx02.eternal-september.org!feeder.eternal-september.org!news.glorb.com!uq10no3135477igb.0!news-out.google.com!w7ni50qay.0!nntp.google.com!w8no1829242qac.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: comp.lang.ada Date: Sun, 23 Nov 2014 08:13:09 -0800 (PST) In-Reply-To: Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=50.111.65.229; posting-account=Ies7ywoAAACcdHZMiIRy0M84lcJvfxwg NNTP-Posting-Host: 50.111.65.229 References: User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: Subject: Re: How to get nice with GNAT? From: brbarkstrom@gmail.com Injection-Date: Sun, 23 Nov 2014 16:13:09 +0000 Content-Type: text/plain; charset=ISO-8859-1 Xref: news.eternal-september.org comp.lang.ada:23661 Date: 2014-11-23T08:13:09-08:00 List-Id: On Friday, November 21, 2014 6:41:45 AM UTC-5, Natasha Kerensikova wrote: > Hello, > > I happen to have found a situation in which symbolic traceback is a > great help, but I have been a bit surprise by the (lack of) support in > the platform to which I have access. > > I have been using GNAT.Traceback.Symbolic.Symbolic_Traceback, is there a > more portable way? > > In FreeBSD, with GNAT 4.9.0, I get an output like the following, with > the first line actually repeated about a hundred times: > > BFD: Dwarf Error: found dwarf version '4', this reader only handles version 2 information. > > 0x7e7773 in asis.gela.contexts.open at ??:0 > > 0x78cb43 in asis.ada_environments.open at ??:0 > > 0x46a7da in adactl at ??:0 > > 0x40690e in main at ??:0 > > 0x4069df in <_start> at ??:0 > > 0x800da3ffe in ?? at ??:0 > > In Debian/kFreeBSD, with GNAT 4.6, it looks like the following, which is > what I consider as perfect: > > 0x7fa993 in asis.ada_environments.open at asis-ada_environments.adb:241 > > 0x481a57 in adactl at adactl.adb:90 > > 0x417029 in main at b~adactl.adb:817 > > 0x8015a4347 in ?? at ??:0 > > 0x41706e in <_start> at ??:0 > > In Fedora 20, with GNAT 4.8.3, it looks like the following, which I find > the worst: > > 0x000000000069307D > > 0x00000000004733BD > > 0x0000000000410824 > > 0x0000003CC5A21D63 > > 0x000000000041086F > > 0xFFFFFFFFFFFFFFFE > > Considering the versions, I doubt that's the cause for the discrepancy. > I would rather wager on something related to addr2line. > > As a user, is there something I can do to improve the traceback > representation on those platforms? > Or is it completely in the hands of the GNAT packager/maintainer? > > > Thanks in advance for your help, > Natasha That is not correct. I routinely set OK := False; at the beginning of the procedure and only set it to True when the procedure has completed correctly. The output from the procedure does provide the last value of OK before the procedure raises the exception -- if the procedure doesn't handle the exception. You can set outgoing parameters in the code after raising the exception. In other words, the code for a procedure looks like procedure This_Procedure(OK : out Boolean; Err_Msg : out Bounded_String); is ... This_Kind_Of_Exception : exception; ... begin ... if (Bad_Condition = True) then raise This_Kind_Of_Exception; end if; ... exception when ... ... when This_Kind_Of_Exception => Err_Msg := Vstring.To_Bounded_String("This procedure encountered a Bad_Condition : "); Err_Msg := Vstring.Append(Err_Msg, ...); ... end This_Procedure; The code that calls This_Procedure can choose how it wants to handle the exception. For example, ... This_Procedure(OK => OK, Err_Msg => Err_Msg); if not OK then Put_Line(Vstring.To_String(Err_Msg)); -- Take other exception handling steps end if; ... will print out the error message. I'll grant the programmer may have to handle complex chains of exception handling. However, it does work and can provide the thread of exceptions for understanding what happened. Also, this is one strategy for dealing with exceptions in Web interfaces, where it's important to avoid a fatal error that shuts down a working program that's interacting with users. I use this approach routinely. It is a big help during debugging. If the exception handling is left in, it can also catch problems when the debugging has moved along and you've forgotten about it. That saves time. Bruce B.