Hacker News new | past | comments | ask | show | jobs | submit login
Panicparse: Crash your Go app in style (github.com/maruel)
163 points by jgrahamc on Nov 26, 2015 | hide | past | favorite | 32 comments



Someone please pass this to the Go team, something like this would really be nice to have in the default Go distribution.


One thing I noticed the last time I worked with go was how hostile the go team was to stdlib changes and additions.

Their default argument parsing library is pretty horrible - it uses single-dash for word flags (thus does not differenciate between -h -e -l -p and -help...) and they refuse to implement double-dash, citing "there's third party libs for that".

It really annoys me. I understand the predicament that the stdlib should remain relatively stable, but setting the wrong example in the stdlib itself is really bad - third party libs or not, you know a fair share of people will stick to the stdlib where possible.

I had the exact same experience with python a few days ago. Python's builtin elementtree can't add doctypes at all and is hostile to patches adding it. The reasoning being "lxml exists". For the simple task of adding a doctype, one must either deal with a cpython-specific extension that is a pain in the arse to build, or hack it in with undocumented functionality in minidom.


I love that the go team is hostile to breaking stdlib changes (which is what changing the flag package would be). It is so nice to be able to upgrade to the latest go version without having to worry about what it might break in production.

It is true that the go team is cautious about what goes into the stdlib. Part of that is their commitment to long term support of the standard library. To be able to do that effectively they need to be discerning when choosing what to have there vs an external library. But that doesn't mean that they don't take big changes. HTTP2 support will be in 1.6 which is a huge addition.


Then why even have a stdlib?

Haskell has problem too, where the Prelude (a std lib imorted into programs by default) is designed for learning the language, and getting real work done requrequires supressing the Prelude to work around its bad performance and unsafe semantics.


They wanted to help get the language off the ground. Without the stdlib at launch, I don't think Go would have been nearly as well received. I feel like it's one of the key pieces people first coming to the language like.

The golang.com/x/ packages seems to be handling extending the stdlib at this point.


You could view the standard/core library as the minimum need to make a language pragmatically useful. You could also view it as trying to prevent fragmentation. However, the stability of standard/core libraries is also what causes them to be "where things go to die" because changing them is very hard to do without breaking things.

In the case of Go they also prefer to let third parties experiment and determine which design works best rather than trying to guess.

So it's all a bit subjective hence the differing opinions. The point is it's people trying to balance trade-offs.


You mean it DOES differentiate between -h -e -l -p and -help, right? They are different flagsets.


Nope, not under GNU options, they aren't. It's just a culture difference, nothing special.

The Go team comes from an old unix background where long options with a single '-' was standard. GNU changed that, and a good part of the world standardized around it (but not the X11 people for example); now the cultures collide, and people don't understand why the behaviour is different.


I'm not super confident but I think the stdlib flags are a POSIX implementation. However, POSIX is not what most people are used to. For example, POSIX says flags/options come before arguments but most Linux shells allow you to put the flags/options after arguments as well, e.g. `ls ~ -lh`.


The lack of double-dash in the stdlib really annoys me. Almost all command line tools use a single dash for single letter arguments (-h) and double-dash for anything longer (--help).


double-dash still works.


You see he works for Google right...?


Actually, no, I didn't see that. Did I miss something?


This looks like it has real potential. I've lost count of the times I've had to scroll through a lengthy tmux buffer just to find the key 2 lines of the stack trace.


Same with Python. I wonder if there's something similar.


Wrote a similar web-based tool a while back, primarily for grouping goroutines by their source location:

https://github.com/vito/swirly

Try it out here:

https://rawgit.com/vito/swirly/master/index.html

...with: https://gist.githubusercontent.com/vito/486918d4c759184eb1d4...


This is even better! I highly encourage you to publish this or at least write a README for it.


Great idea, would love to see this as a default part of the Go toolchain. I run in to this problem all the time.


This is excellent. I wish I had this when I first started learning go. Will definitely recommend to new learners of the language.


to run it through its paces try giving it the goroutines output of a large server. https://http2.golang.org/goroutines is a good example.

unfortunately its color palette is tailored to dark terminals: http://i.imgur.com/WqNVjfh.png

also unfortunate is that we've now lost path information and i can't just right-click to open the relevant line in the source. win some, lose some :)



Seems like a great tool for wrangling Go's stack trace. Particularly relevant if you're running a large number of go routines since when they panic you'll console will blow up.


Sorry for such a pedantic comment for such a nice tool, but... I noticed that GIFs were attracting my attention, but were too for me to comprehend what was happening. They are not better than static text (you can color it if you want) or image.

Is it common now to present screencasts instead of pasting text copied from for CLI tools?


GIFs are much better in this context because the selling point of the tool is the workflow. Perhaps having GIF playback controls implemented in the browser would improve it.

Correct me if I'm wrong, but you cannot have colored text in GitHub markdown. You can have syntax coloring, but in this case he's showing terminal output.


Why isn't the default panic like this?


Because while far far denser and easier to parse by humans, it discards a considerable amount of data. I think it's perfectly sensible for the default toolchain to dump the most complete representation and allow users to use tools to get the representation they prefer.


Because this one involve checking duplicates and does a fair amount of logic. When the process is crashing, all bets are off and you may not be able to allocate memory for this processing. This is why they simply dump all there is to stderr and exit.


Wow, so much nicer -- works with SIGQUIT too. Very nice work!


Similar tool for Rust: https://github.com/Ticki/dybuk


Just tried it on old stacktraces I had lying around that I didn't analyze yet… And I think I just found a bug! Wow, thanks a lot @maruel !


PS: the bug is my fault. Never use _ to ignore errors. Never do it. Even when you think you've sanitized everything to death.


This looks great. Will definitely be making use of it




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: