Re: [Haskell-cafe] Printing call site for partial functions
Michael Snoyman mich...@snoyman.com writes: I had a bug in a site of mine[1] for a few weeks, where it would just print: Prelude.head: empty list It took a long time to track down the problem +1: I've been arguing this for something like ten years :-) One half-baked quasi-solution is to use: #define head (\xs - case xs of { (x:_) - x ; _ - error(head: empty list at++__FILE__++show __LINE__)}) Downsides are that it depends on CPP, and, CPP being a C preprocessor, it doesn't blend well with lines with single apostrophes on them (e.g.: head x') -k -- If I haven't seen further, it is by standing in the footprints of giants ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Printing call site for partial functions
On Mon, 30 Apr 2012 10:31:01 +0200, Ketil Malde ke...@malde.org wrote: One half-baked quasi-solution is to use: #define head (\xs - case xs of { (x:_) - x ; _ - error(head: empty list at++__FILE__++show __LINE__)}) Downsides are that it depends on CPP, and, CPP being a C preprocessor, it doesn't blend well with lines with single apostrophes on them (e.g.: head x') -k There is a Haskell solution: cpphs[0], you can invoke this preprocessor by specifying the flags -cpp -pgmPcpphs -optP--cpp for GHC. Regards, Henk-Jan van Tuyl [0] http://hackage.haskell.org/package/cpphs -- http://Van.Tuyl.eu/ http://members.chello.nl/hjgtuyl/tourdemonad.html Haskell programming -- ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Printing call site for partial functions
On Thu, Apr 26, 2012 at 5:05 PM, Joachim Breitner m...@joachim-breitner.de wrote: Hi, Am Mittwoch, den 25.04.2012, 18:36 +0300 schrieb Michael Snoyman: I'm sure there are many better ways to approach the problem, and I can't speak to the complexity of implementation within GHC. I *can* say, however, that this would have saved me a lot of time in the example I gave above, and I'd bet many Haskellers have similar stories. This could be a huge debugging win across the board. using TH (which I only reluctantly advocate for general usage) you can get good location information behaviour, see http://hackage.haskell.org/packages/archive/stm-stats/0.2.0.0/doc/html/Control-Concurrent-STM-Stats.html#v:trackThisSTM (and its source) for one example. One would use this approach maybe with http://hackage.haskell.org/packages/archive/safe/0.3.3/doc/html/Safe.html#v:headNote Greetings, Joachim -- Joachim Breitner e-Mail: m...@joachim-breitner.de Homepage: http://www.joachim-breitner.de Jabber-ID: nome...@joachim-breitner.de ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe We actually use a similar technique in Yesod for logging[1]. But it requires actively using it in all libraries. In other words, unless the author of the library in question explicitly used $headLoc, this wouldn't help. [1] http://hackage.haskell.org/packages/archive/yesod-core/1.0.1.1/doc/html/Yesod-Core.html#v:logDebug ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Printing call site for partial functions
On Thu, Apr 26, 2012 at 12:20 AM, Simon Peyton-Jones simo...@microsoft.com wrote: Tristan Allwood got quite a long way with this a couple of years ago. http://research.microsoft.com/en-us/um/people/simonpj/papers/stack-trace/DebugTraces.pdf While stack traces are undoubtably useful, I think this is a different problem. At least the one I'm thinking of is. It's probably never going to be reasonable to get a whole stack trace on every call to a logger, but all that's actually needed is the direct call site. That's a different (and much simpler!) problem. And at least in my case, the logging and exception functions are all pure, so using currentCallStack under an unsafePerformIO would be sketchy. On Thu, Apr 26, 2012 at 7:05 AM, Joachim Breitner m...@joachim-breitner.de wrote: using TH (which I only reluctantly advocate for general usage) you can get good location information behaviour, see Yeah, this is the TH solution I mentioned. It requires boilerplate at every call site and put a TH dependency on every module (which seems to slow down compilation quite a lot!), but on the other hand it *does* provide zero overhead caller information. I still prefer my hacky preprocessor, even though I don't like it much either. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Printing call site for partial functions
Tristan Allwood got quite a long way with this a couple of years ago. http://research.microsoft.com/en-us/um/people/simonpj/papers/stack-trace/DebugTraces.pdf But not enough to finish it off! The paper describes the tricky points... Simon M is more of an expert than I. Moreover the work Simon has done on improving profiling is relevant too. Simon | -Original Message- | From: haskell-cafe-boun...@haskell.org [mailto:haskell-cafe- | boun...@haskell.org] On Behalf Of Evan Laforge | Sent: 25 April 2012 17:08 | To: Michael Snoyman | Cc: Haskell Cafe | Subject: Re: [Haskell-cafe] Printing call site for partial functions | | And then have the compiler automatically include (optional) package | name, module name, and line number where `headContext` was called. How | about we borrow a bit from rewrite rules, and have a pragma such as: | | {-# WITH_CONTEXT head headContext #-} | | This seems similar to the SRCLOC_ANNOTATE pragma supported by jhc. | | I'd love to have this feature. I'd just like to point out it's not just | useful for partial functions like 'head', but also for logging and expected | exceptions like Left. It's also extremely useful for tests, when I get | check failed: 3 /= 4 it's really important to see filename and line number. | | There are various hacks out there to get this, but they all involve | annotating the call sites with some magic, either an 'assert' (and then | runtime overhead on every function that uses it) or a TH splice (and then you | have to turn TH on in every module). I have literally thousands of lines of | tests that would all need an extra boilerplate argument. | | I implemented a preprocessor that is effectively like SRCLOC_ANNOTATE and it | works ok for me, but it's not a good general solution because it's hardcoded | to certain symbols and slows down compilation too much. | And being specific to my app of course it wouldn't help in your case | :) | | But it won't happen unless one of us few people who care about it just goes | and implements it. I don't think it's much of a priority with others. | | ___ | Haskell-Cafe mailing list | Haskell-Cafe@haskell.org | http://www.haskell.org/mailman/listinfo/haskell-cafe ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Printing call site for partial functions
On 25/04/2012 17:28, Ozgur Akgun wrote: Hi, On 25 April 2012 16:36, Michael Snoyman mich...@snoyman.com mailto:mich...@snoyman.com wrote: Prelude.head: empty list Recent versions of GHC actually generate a very helpful stack trace, if the program is compiled with profiling turned on and run with -xc. Right. Also don't forget to add -fprof-auto. There's an API to get access to the stack trace too: http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.5.0.0/GHC-Stack.html See: http://community.haskell.org/~simonmar/slides/HIW11.pdf (Ironically titled Prelude.head: empty list) A more recent talk about this with more details is here: http://community.haskell.org/~simonmar/Stack-traces.pdf Cheers, Simon ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Printing call site for partial functions
On Wed, Apr 25, 2012 at 7:28 PM, Ozgur Akgun ozgurak...@gmail.com wrote: Hi, On 25 April 2012 16:36, Michael Snoyman mich...@snoyman.com wrote: Prelude.head: empty list Recent versions of GHC actually generate a very helpful stack trace, if the program is compiled with profiling turned on and run with -xc. See: http://community.haskell.org/~simonmar/slides/HIW11.pdf (Ironically titled Prelude.head: empty list) HTH, Ozgur I certainly think that stack traces are going to be a powerful debugging tool, and I'm looking forward to using them. But I think this feature would be useful in and of itself. I'm presuming it won't be the default to have stack traces turned on due to performance overhead (is that a faulty assumption?). This feature would be available for all builds and give you a very high amount of useful information- though not quite as much as a stack trace- without any (serious) performance impact. Michael ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Printing call site for partial functions
Hi, Am Mittwoch, den 25.04.2012, 18:36 +0300 schrieb Michael Snoyman: I'm sure there are many better ways to approach the problem, and I can't speak to the complexity of implementation within GHC. I *can* say, however, that this would have saved me a lot of time in the example I gave above, and I'd bet many Haskellers have similar stories. This could be a huge debugging win across the board. using TH (which I only reluctantly advocate for general usage) you can get good location information behaviour, see http://hackage.haskell.org/packages/archive/stm-stats/0.2.0.0/doc/html/Control-Concurrent-STM-Stats.html#v:trackThisSTM (and its source) for one example. One would use this approach maybe with http://hackage.haskell.org/packages/archive/safe/0.3.3/doc/html/Safe.html#v:headNote Greetings, Joachim -- Joachim Breitner e-Mail: m...@joachim-breitner.de Homepage: http://www.joachim-breitner.de Jabber-ID: nome...@joachim-breitner.de signature.asc Description: This is a digitally signed message part ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Printing call site for partial functions
And then have the compiler automatically include (optional) package name, module name, and line number where `headContext` was called. How about we borrow a bit from rewrite rules, and have a pragma such as: {-# WITH_CONTEXT head headContext #-} This seems similar to the SRCLOC_ANNOTATE pragma supported by jhc. I'd love to have this feature. I'd just like to point out it's not just useful for partial functions like 'head', but also for logging and expected exceptions like Left. It's also extremely useful for tests, when I get check failed: 3 /= 4 it's really important to see filename and line number. There are various hacks out there to get this, but they all involve annotating the call sites with some magic, either an 'assert' (and then runtime overhead on every function that uses it) or a TH splice (and then you have to turn TH on in every module). I have literally thousands of lines of tests that would all need an extra boilerplate argument. I implemented a preprocessor that is effectively like SRCLOC_ANNOTATE and it works ok for me, but it's not a good general solution because it's hardcoded to certain symbols and slows down compilation too much. And being specific to my app of course it wouldn't help in your case :) But it won't happen unless one of us few people who care about it just goes and implements it. I don't think it's much of a priority with others. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Printing call site for partial functions
Hi, On 25 April 2012 16:36, Michael Snoyman mich...@snoyman.com wrote: Prelude.head: empty list Recent versions of GHC actually generate a very helpful stack trace, if the program is compiled with profiling turned on and run with -xc. See: http://community.haskell.org/~simonmar/slides/HIW11.pdf(Ironically titled Prelude.head: empty list) HTH, Ozgur ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe