* Any Suggestion How To Accomplish A Debug Macro? @ 2014-12-30 3:12 Hubert 2014-12-30 11:14 ` Simon Wright 2014-12-30 16:24 ` sbelmont700 0 siblings, 2 replies; 13+ messages in thread From: Hubert @ 2014-12-30 3:12 UTC (permalink / raw) I know there is no such thing as C #define's in Ada, but isn't there a way to make some sort of debug macro? In my C++ code I use a lot of statements like PRINT(DEBUG_CHANNEL, "TEXT" ); to print out debug messages and in release code, these defines aren't compiled. Is there any way to achieve something like this in Ada without surrounding it with an IF statement and a boolean flag? Thanks --- This email has been checked for viruses by Avast antivirus software. http://www.avast.com ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Any Suggestion How To Accomplish A Debug Macro? 2014-12-30 3:12 Any Suggestion How To Accomplish A Debug Macro? Hubert @ 2014-12-30 11:14 ` Simon Wright 2014-12-30 11:45 ` Hubert 2014-12-30 20:07 ` Brad Moore 2014-12-30 16:24 ` sbelmont700 1 sibling, 2 replies; 13+ messages in thread From: Simon Wright @ 2014-12-30 11:14 UTC (permalink / raw) Hubert <herrdoktor@fumanchu.com> writes: > I know there is no such thing as C #define's in Ada, but isn't there a > way to make some sort of debug macro? > In my C++ code I use a lot of statements like > > PRINT(DEBUG_CHANNEL, "TEXT" ); > > to print out debug messages and in release code, these defines aren't > compiled. Is there any way to achieve something like this in Ada > without surrounding it with an IF statement and a boolean flag? GNAT has pragma Debug[1]. I was always annoyed that this is controlled by -gnata, which also controls assertions, but I see there's a pragma Debug_Policy - stated to be equivalent to pragma Check_Policy (Debug). [1] https://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Debugging---A-Special-Case.html ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Any Suggestion How To Accomplish A Debug Macro? 2014-12-30 11:14 ` Simon Wright @ 2014-12-30 11:45 ` Hubert 2014-12-30 20:07 ` Brad Moore 1 sibling, 0 replies; 13+ messages in thread From: Hubert @ 2014-12-30 11:45 UTC (permalink / raw) Cool, thanks a bunch, that's exactly what I need. You're right, it would be better if there was a separate switch, but I take what I can get :) --- This email has been checked for viruses by Avast antivirus software. http://www.avast.com ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Any Suggestion How To Accomplish A Debug Macro? 2014-12-30 11:14 ` Simon Wright 2014-12-30 11:45 ` Hubert @ 2014-12-30 20:07 ` Brad Moore 2014-12-30 22:11 ` Randy Brukardt 2014-12-31 0:15 ` Luke A. Guest 1 sibling, 2 replies; 13+ messages in thread From: Brad Moore @ 2014-12-30 20:07 UTC (permalink / raw) On 14-12-30 04:14 AM, Simon Wright wrote: > Hubert <herrdoktor@fumanchu.com> writes: > >> I know there is no such thing as C #define's in Ada, but isn't there a >> way to make some sort of debug macro? >> In my C++ code I use a lot of statements like >> >> PRINT(DEBUG_CHANNEL, "TEXT" ); >> >> to print out debug messages and in release code, these defines aren't >> compiled. Is there any way to achieve something like this in Ada >> without surrounding it with an IF statement and a boolean flag? > > GNAT has pragma Debug[1]. I was always annoyed that this is controlled > by -gnata, which also controls assertions, but I see there's a pragma > Debug_Policy - stated to be equivalent to pragma Check_Policy (Debug). > > [1] https://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Debugging---A-Special-Case.html > Another more portable solution would be to declare a static constant somewhere, and use the value of that constant to decide if logging should occur. If the compiler/linker supports dead code elimination, then the debug code can be eliminated if that variable is set to False. Eg. package Debug_Logging is Debug_Enabled : constant Boolean := False; -- Edit this line procedure Log(Message : String); end Debug_Logging; with Debug_Logging; procedure Foo is begin -- if statement removed if Debug_Enabled is false if Debug_Enabled then Log("Entered Foo"); end if; end Foo; This works in GNAT, and might work in other compilers as well. Worst case is that the Debug_Enabled boolean get evaluated in multiple places, but that overhead of evaluating a Boolean might still be acceptable for a compiler that doesn't do dead code elimination. Brad ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Any Suggestion How To Accomplish A Debug Macro? 2014-12-30 20:07 ` Brad Moore @ 2014-12-30 22:11 ` Randy Brukardt 2015-01-01 12:28 ` Georg Bauhaus 2015-01-02 20:37 ` J-P. Rosen 2014-12-31 0:15 ` Luke A. Guest 1 sibling, 2 replies; 13+ messages in thread From: Randy Brukardt @ 2014-12-30 22:11 UTC (permalink / raw) "Brad Moore" <brad.moore@shaw.ca> wrote in message news:gCDow.832901$No4.618024@fx19.iad... > On 14-12-30 04:14 AM, Simon Wright wrote: >> Hubert <herrdoktor@fumanchu.com> writes: >> >>> I know there is no such thing as C #define's in Ada, but isn't there a >>> way to make some sort of debug macro? >>> In my C++ code I use a lot of statements like >>> >>> PRINT(DEBUG_CHANNEL, "TEXT" ); >>> >>> to print out debug messages and in release code, these defines aren't >>> compiled. Is there any way to achieve something like this in Ada >>> without surrounding it with an IF statement and a boolean flag? That's of course the Ada way. What's the point of avoiding the Ada way here? Everything in Ada is more verbose than C -- some of us think that's the advantage of Ada (more for readability than writability). ... > Another more portable solution would be to declare a static constant > somewhere, and use the value of that constant to decide if logging should > occur. He said he didn't want to do that. I usually make these flags more complex (like an array of constants) so that various sets of tracing can be enabled in order to track whatever is wrong. Indeed, in most of my programs, I use a flag set at runtime (controlled either through the GUI or through command-line switches. In that case, the code is always there (but a Boolean test is cheap), but that means I don't have to waste time with a compile-link-test-repeat cycle to trace a problem. (I admit, it's often necessary to add additional tracing to actually find the root cause, but the initial tracing at least can narrow it down quickly.) ... > This works in GNAT, and might work in other compilers as well. Worst case > is that the Debug_Enabled boolean get evaluated in multiple places, but > that overhead of evaluating a Boolean might still be acceptable for a > compiler that doesn't do dead code elimination. I think that the set of compilers that don't do dead code elimination is close to the empty set. (That was pretty much the first optimization we did in Janus/Ada, even before we had packages or floating point.) Whether the dead code elimination can get rid of everything (it won't get rid of string literals in Janus/Ada, for instance) is a different question. But I don't think there is much reason (outside of the memory-constrained embedded system, or the system that has to be formally proved or validated) to ever removing the tracing. It's important to be able to turn it off, of course, but the runtime cost of it being off is so minimal (primarily caching/paging effects) that removing it isn't worth the effort. (And if you plan to keep it around forever, you'll spend more time making the traces make sense in the future -- which typically pays off very quickly.) Randy. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Any Suggestion How To Accomplish A Debug Macro? 2014-12-30 22:11 ` Randy Brukardt @ 2015-01-01 12:28 ` Georg Bauhaus 2015-01-02 20:37 ` J-P. Rosen 1 sibling, 0 replies; 13+ messages in thread From: Georg Bauhaus @ 2015-01-01 12:28 UTC (permalink / raw) "Randy Brukardt" <randy@rrsoftware.com> wrote: > "Brad Moore" <brad.moore@shaw.ca> wrote in message > news:gCDow.832901$No4.618024@fx19.iad... >> On 14-12-30 04:14 AM, Simon Wright wrote: >>> Hubert <herrdoktor@fumanchu.com> writes: >>> >>>> I know there is no such thing as C #define's in Ada, but isn't there a >>>> way to make some sort of debug macro? >>>> In my C++ code I use a lot of statements like >>>> >>>> PRINT(DEBUG_CHANNEL, "TEXT" ); >>>> >>>> to print out debug messages and in release code, these defines aren't >>>> compiled. Is there any way to achieve something like this in Ada >>>> without surrounding it with an IF statement and a boolean flag? > > That's of course the Ada way. What's the point of avoiding the Ada way here? > Everything in Ada is more verbose than C -- some of us think that's the > advantage of Ada (more for readability than writability). The Ada way has been built into the Eiffel programming language: "debug" is a keyword of Eiffel and it works much like "begin" starts a block in Ada. Eiffel's "debug" is controlled by flag set at compile time, though. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Any Suggestion How To Accomplish A Debug Macro? 2014-12-30 22:11 ` Randy Brukardt 2015-01-01 12:28 ` Georg Bauhaus @ 2015-01-02 20:37 ` J-P. Rosen 2015-01-02 21:13 ` Dmitry A. Kazakov 1 sibling, 1 reply; 13+ messages in thread From: J-P. Rosen @ 2015-01-02 20:37 UTC (permalink / raw) Le 30/12/2014 23:11, Randy Brukardt a écrit : > But I don't think there is much reason (outside of the memory-constrained > embedded system, or the system that has to be formally proved or validated) > to ever removing the tracing. It's important to be able to turn it off, of > course, but the runtime cost of it being off is so minimal (primarily > caching/paging effects) that removing it isn't worth the effort. (And if you > plan to keep it around forever, you'll spend more time making the traces > make sense in the future -- which typically pays off very quickly.) I fully agree with that. In AdaControl, there is a sophisticated tracing capability, and it's enabled with a command line option. If a user has a problem, he just has to rerun the program with -x and send me the output - that's usually enough to identify the problem. I can't tell how much time it saved me. And since AdaControl spends about 65% of its time in ASIS, the cost of testing a boolean is neglectible. -- J-P. Rosen Adalog 2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00 http://www.adalog.fr ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Any Suggestion How To Accomplish A Debug Macro? 2015-01-02 20:37 ` J-P. Rosen @ 2015-01-02 21:13 ` Dmitry A. Kazakov 2015-01-02 21:52 ` Randy Brukardt 0 siblings, 1 reply; 13+ messages in thread From: Dmitry A. Kazakov @ 2015-01-02 21:13 UTC (permalink / raw) On Fri, 02 Jan 2015 21:37:47 +0100, J-P. Rosen wrote: > Le 30/12/2014 23:11, Randy Brukardt a écrit : >> But I don't think there is much reason (outside of the memory-constrained >> embedded system, or the system that has to be formally proved or validated) >> to ever removing the tracing. It's important to be able to turn it off, of >> course, but the runtime cost of it being off is so minimal (primarily >> caching/paging effects) that removing it isn't worth the effort. (And if you >> plan to keep it around forever, you'll spend more time making the traces >> make sense in the future -- which typically pays off very quickly.) > > I fully agree with that. This is all true, conditional compilation is rubbish, IMO. However, it would be interesting to consider how tracing could be better supported. I mean options: 1. To have zero-cost turned off tracing, e.g. some code modification techniques or maybe something else. After all we have zero-cost exceptions, why not tracing. 2. Ideas for the compilation units structure modification which would allow to have tracing code physically separated from the functional code. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Any Suggestion How To Accomplish A Debug Macro? 2015-01-02 21:13 ` Dmitry A. Kazakov @ 2015-01-02 21:52 ` Randy Brukardt 2015-01-02 22:17 ` Niklas Holsti 0 siblings, 1 reply; 13+ messages in thread From: Randy Brukardt @ 2015-01-02 21:52 UTC (permalink / raw) "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> wrote in message news:fh7u81n706kr.131btl9yj1iz8.dlg@40tude.net... > On Fri, 02 Jan 2015 21:37:47 +0100, J-P. Rosen wrote: ... > However, it would be interesting to consider how tracing could be better > supported. I mean options: > > 1. To have zero-cost turned off tracing, e.g. some code modification > techniques or maybe something else. After all we have zero-cost > exceptions, > why not tracing. But "zero-cost exceptions" aren't really zero-cost, they just shift the cost to handling. And that's already the case; virtually all of the cost of tracing is when the tracing is enabled. (A Boolean compare being about the cheapest operation on most targets.) About all one could do would be to keep the tracing code out of the normal flow, which would decrease paging/caching costs a bit when tracing is off -- but that would not make a noticable difference on the vast majority of programs. It would be unlikely to be worth the work. > 2. Ideas for the compilation units structure modification which would > allow > to have tracing code physically separated from the functional code. We've considered such ideas in the context of assertions, but nothing proposed really looked like a proper part of Ada. For tracing, it would be even harder, because tracing can be inserted anywhere in the flow of a program (not just at particular places like most assertions). Moreover, in both cases, there isn't a clear-cut boundary between them (for tracing, that's primarily human-readable output, which often is needed anyway; for assertions, that's predicate functions that you might want to use to insert pre-tests before operations). I use separate logging and trace management packages, which (combined with my aversion to use clauses) show tracing code pretty well. It's not clear at all that we could do better with syntax mechanisms. Randy. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Any Suggestion How To Accomplish A Debug Macro? 2015-01-02 21:52 ` Randy Brukardt @ 2015-01-02 22:17 ` Niklas Holsti 0 siblings, 0 replies; 13+ messages in thread From: Niklas Holsti @ 2015-01-02 22:17 UTC (permalink / raw) On 15-01-02 23:52 , Randy Brukardt wrote: > "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> wrote in message > news:fh7u81n706kr.131btl9yj1iz8.dlg@40tude.net... >> On Fri, 02 Jan 2015 21:37:47 +0100, J-P. Rosen wrote: > ... >> However, it would be interesting to consider how tracing could be better >> supported. I mean options: [snip] >> 2. Ideas for the compilation units structure modification which would >> allow >> to have tracing code physically separated from the functional code. > > We've considered such ideas in the context of assertions, but nothing > proposed really looked like a proper part of Ada. Just a comment that this idea is approaching "aspect-oriented programming", AOP, which promised to be a radically new way to structure programs, as important as procedural abstraction. ("Aspect" here does not mean the same as in the Ada RM; see http://en.wikipedia.org/wiki/Aspect_%28computer_programming%29.) In this case, the tracing would be its own aspect of the program's functionality, specified and implemented separately from the other "real" functionality. It appears that, unfortunately, AOP was not as useful, or not as easy to design into programming languages, as was hoped, and the field seems to be not very active currently. I found AOP an interesting idea because it feels like an intermediate or hybrid between procedural/imperative programming and declarative programming. AOP thus supports the Ada philosophy of favouring static descriptions/declarations of problem domain concepts, over dynamic coding, but on the other hand the implicit and automatic invocation of aspect operations, that is typical of AOP, may not be attractive for the safety-critical domain. -- Niklas Holsti Tidorum Ltd niklas holsti tidorum fi . @ . ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Any Suggestion How To Accomplish A Debug Macro? 2014-12-30 20:07 ` Brad Moore 2014-12-30 22:11 ` Randy Brukardt @ 2014-12-31 0:15 ` Luke A. Guest 1 sibling, 0 replies; 13+ messages in thread From: Luke A. Guest @ 2014-12-31 0:15 UTC (permalink / raw) Brad Moore <brad.moore@shaw.ca> wrote: > On 14-12-30 04:14 AM, Simon Wright wrote: >> Hubert <herrdoktor@fumanchu.com> writes: > This works in GNAT, and might work in other compilers as well. Worst case > is that the Debug_Enabled boolean get evaluated in multiple places, but > that overhead of evaluating a Boolean might still be acceptable for a > compiler that doesn't do dead code elimination. Not strictly true as the compiler should see the "if var = true then" and remove the if in dead code elimination leaving the contents of the if statement. When the if statement is false (statically) the entire statement can be eliminated. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Any Suggestion How To Accomplish A Debug Macro? 2014-12-30 3:12 Any Suggestion How To Accomplish A Debug Macro? Hubert 2014-12-30 11:14 ` Simon Wright @ 2014-12-30 16:24 ` sbelmont700 2014-12-30 18:21 ` Simon Wright 1 sibling, 1 reply; 13+ messages in thread From: sbelmont700 @ 2014-12-30 16:24 UTC (permalink / raw) On Monday, December 29, 2014 10:11:52 PM UTC-5, Hubert wrote: > > Is there any way to achieve something like this in Ada without > surrounding it with an IF statement and a boolean flag? > TWYF, FWYT. Having the compiler cull a bunch of your code, especially such I/O heavy code, and expecting it to work the same in the release is a bad idea (though there are better solutions than an if statement, e.g. observer pattern). -sb ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Any Suggestion How To Accomplish A Debug Macro? 2014-12-30 16:24 ` sbelmont700 @ 2014-12-30 18:21 ` Simon Wright 0 siblings, 0 replies; 13+ messages in thread From: Simon Wright @ 2014-12-30 18:21 UTC (permalink / raw) sbelmont700@gmail.com writes: > TWYF, FWYT. Having the compiler cull a bunch of your code, especially > such I/O heavy code, and expecting it to work the same in the release > is a bad idea (though there are better solutions than an if statement, > e.g. observer pattern). We did desktop testing (mainly functional, some timing) on Windows for deployment on powerpc-wrs-vxworks. On-target validation & verification was hugely simplified, and I don't recall any instances of on-target failures that were down to compilation differences. We retained the same logging in the two environments; on the host, via a low-priority task to standard output; on the target, via ethernet to a logging computer. So the Ada code of the subsystem under test wasn't altered. ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2015-01-02 22:17 UTC | newest] Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-12-30 3:12 Any Suggestion How To Accomplish A Debug Macro? Hubert 2014-12-30 11:14 ` Simon Wright 2014-12-30 11:45 ` Hubert 2014-12-30 20:07 ` Brad Moore 2014-12-30 22:11 ` Randy Brukardt 2015-01-01 12:28 ` Georg Bauhaus 2015-01-02 20:37 ` J-P. Rosen 2015-01-02 21:13 ` Dmitry A. Kazakov 2015-01-02 21:52 ` Randy Brukardt 2015-01-02 22:17 ` Niklas Holsti 2014-12-31 0:15 ` Luke A. Guest 2014-12-30 16:24 ` sbelmont700 2014-12-30 18:21 ` Simon Wright
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox