Live data from Hacker News

Show HN: Decorate Java stack traces with source code snippets

github.com

11–20 of 22 posts

Re: Show HN: Decorate Java stack traces with source code snippets

#11
This is pretty awesome! This got me curious if I can do this in C# so I took a quick stab at it. It's not actually updating the original stack trace but it's kind of cool. Might be worth exploring further :)

    static void Main()
    {
        try
        {
            throw new DivideByZeroException("Boom!");
        }
        catch (Exception ex)
        {
            var trace = new StackTrace(ex, true);
            var frame = trace.GetFrame(0);

            var targetFilename = frame.GetFileName();
            var targetLineNumber = frame.GetFileLineNumber();

            Console.WriteLine($"Exception occurred at {targetFilename}, line {targetLineNumber}");

            if (File.Exists(targetFilename))
            {
                var source = File.ReadAllLines(targetFilename);
                var startIndex = Math.Max(0, targetLineNumber - 3);
                var endIndex = Math.Min(source.Length - 1, targetLineNumber + 1);

                for (var i = startIndex; i > {lineNumber}" : $"   {lineNumber}")}{source[i]}");
                }
            }
        }
    }

Re: Show HN: Decorate Java stack traces with source code snippets

#13

One big "off-label" use of stack traces for me is to determine the caller method of the current method. I use it in a lightly customised log function to also log the name of the method that has emitted the log.

If I understand your use case, most loggers (like Logback) have the possiblity to automatically include the name of the method that called the log-statement.

Logback even supports including the call chain in the output, so you could include the parent method, grand parent method etc. This probably uses reflection, so it could have a negative impact for applications that need a high performance.

https://logback.qos.ch/manual/layouts.html

Re: Show HN: Decorate Java stack traces with source code snippets

#15

One big "off-label" use of stack traces for me is to determine the caller method of the current method. I use it in a lightly customised log function to also log the name of the method that has emitted the log.

If you're using Java 9+ there is an official API to do that. It's the StackWaker class.

https://docs.oracle.com/javase%2F9%2Fdocs%2Fapi%2F%2F/java/l...

Re: Show HN: Decorate Java stack traces with source code snippets

#18

One big "off-label" use of stack traces for me is to determine the caller method of the current method. I use it in a lightly customised log function to also log the name of the method that has emitted the log.

If you're using Java 9+ there is an official API to do that. It's the StackWaker class. https://docs.oracle.com/javase%2F9%2Fdocs%2Fapi%2F%2F/java/l...

Many thanks. Will look at it.

Re: Show HN: Decorate Java stack traces with source code snippets

#19

One big "off-label" use of stack traces for me is to determine the caller method of the current method. I use it in a lightly customised log function to also log the name of the method that has emitted the log.

If I understand your use case, most loggers (like Logback) have the possiblity to automatically include the name of the method that called the log-statement. Logback even supports including the call chain in the output, so you could include the parent method, grand parent method etc. This probably uses reflection, so it could have a negative impact for applications that need a high performance. https://logback.qos.ch…

Thanks. Will take a look. I don't use logging frameworks in smaller projects.

Re: Show HN: Decorate Java stack traces with source code snippets

#20
post #9

Reminds me of power assertions in Groovy - one of my favorite features!

Yep they are amazing. Never been a fan of alternative JVM languages, but wrote most tests in Groovy just for this feature.

There is a great library to add power assertions to Kotlin apps:

https://github.com/bnorm/kotlin-power-assert/

You just add the Gradle plugin and you're done.

Post reply on HN