puts me in mind of the old guru meditation error messages that popped up in the stone knives and bearskins era of computing.
The developer must either provide the logging and attach a debugger or go get fucked when a runtime error happens
are you c++?
You can also debug post-mortem with the minidump or the core dump file with WDT on Windows. Great fun and a good way to brush up on your assembly skills
Great fun and a good way to brush up on your assembly skills
Just load it on the debugger and leave your asm skill gather patina.
That’s not true though. You can get the backtrace and other useful information from the coredump mentioned by the error message by loading it with gdb. Not as good as attaching it to a living process, since you can’t see step-by-step what happens leading up to the error, but still quite useful.
Well yes, that’s a pretty good way of debugging a third party app but if you are developing something you can have more ease with gdb attached
let’s not act like Java’s error log is useful
It’s extraordinarily useful
skill issue
The same applies to using the core dump.
In fact, the Python one is the lest useful of the trio.
When the day comes that you need
gdb
you will indeed be amazed at how fucking powerful it is. If your server crashes grab that core dump!
I think it’s pretty useful, be interested to hear your hangups with it though because it’s definitely not perfect.
If something goes wrong and I have a stack trace, that plus the type of exception will almost always be enough for me to figure out what’s wrong at least as a starting point. I’ve worked mostly with JVM languages in my career though so maybe I just don’t know how bad it actually is.
It actually is if you known how to read it. It’s extremely verbose, but you can follow any exception down to the exact line of code (or JNI call, I guess) where the problem occurs. I’ll gladly take the kilobytes
Unfortunately, Java programmers seem to hate actually handing errors, so you see a lot of
try{} catch (Exception e) { throw System.println("something went wrong");}
ruining your life, but that’s not the language’s fault.Super-advanced java devs like me do it like
try{} catch (Exception e) { System.out.println("something went wrong); e.printStackTrace(); }
And then swallow the error, continue executing the code, and make others wonder why the program printed 40 stack traces but crashed without one.
Yeah cos everyone knows other languages are impossible to write bad code with
On Error Resume Next
never before have more terrible words been spoken.On Error Resume Next
never before have more terrible words been spoken.Every time I’m reading a PowerShell script at work and see
-ErrorAction SilentlyContinue
I want to scream into a pillow and forcefully revert their commit.I’ve actually done it a few times, but I want to do it every time.
And that’s why you’re a hero.
but you can follow any exception down to the exact line of code (or JNI call, I guess) where the problem occurs.
But, it’s not really where the problem occurred. How often do you get a stack trace and the bug fix is at the line referenced by the stack trace? Almost never. It’s more that it takes you down to the exact line of code where the effects of the problem are bad enough to affect the running of the program. But, the actual problem happened earlier, sometimes much earlier.
For example, NullPointerException isn’t actually the problem, it’s a symptom of the problem. Something didn’t get initialized properly, and nobody noticed for a while, until we tried to use it, and got a null pointer. Sometimes it’s easy to go from the effect (null pointer) to the cause (uninitialized thing). But, other times that “thing” was passed in, so you have to work backwards to try to figure out where that thing comes from, and why it’s in that broken state.
Sure, it’s better than nothing, but it’s still frustrating.
When reproducing a bug? Most of the time. Reasoning back from the variable name and location of a null dereference with a provided call path is much more than you get with tons of languages, especially when calls from frameworks or external libraries enter the mix.
It won’t tell you exactly what to fix, you’ll need to debug for that (C# does some black magic to allow you to do that, Java doesn’t come close to the capabilities of full fat Visual Studio), but you won’t need to waste any time deciphering where the program crashed.
Every crash is frustrating, but the stack traces themselves are super useful.
you can follow any exception down to the exact line of code
Which is usually not a piece of code written by us and is caused by another piece of code not written by us either
Does your IDE not highlight the lines written by you in a different colour? Of course that doesn’t help when it’s an error in production!
Is it possible to make intelliJ do this?
I thought it highlighted the line number in blue when it was your code. I use eclipse so can’t properly remember
I don’t know any programming language where that isn’t the case, though. Unless you’re writing another SerenityOS, you’ll probably use external frameworks and libraries to take care of all the uninteresting stuff.
My favorite compile error happened while I was taking a Haskell class.
ghc: panic! (the ‘impossible’ happened)
The issue is plainly stated, and it provides clear next steps to the developer.
I had a similar error, though not from the compiler
Error message just readthis should never happen
Ah, good old PlarformIO
I know this is supposed to be humorous, but there’s a reason why these languages can, and are doing what they’re doing.
Core dumps are also worth learning about, they’re really helpful if you understand them.
gdb: Am I a joke to you?
Yes. It’s a surprisingly bad debugger the more you think about it. I use it largely in assembly and it loves to spit out random errors about memory it tried to access based on the current register state. The shortcuts are kind of dumb.
It certainly works but I wouldn’t call it a pleasure to use.
I honestly vastly prefer using IDA and Windows specific tools (x64dbg) over gdb. IDA can interface with gdb so it can act as a frontend which can be handy for visualization.
I use gdb with great success for x64, rv64, and c:
info registers rip
or just setup tui:# ~/.config/gdb/gdbinit: tui new-layout default regs 1 {-horizontal src 1 asm 1} 2 status 0 cmd 1 tui layout default tui enable
At least you are getting a dump, count your blessings. Could be worse!
Just hook your app to a debugger and load the dump.
No bounds checking, only fast.
There is bounds checking, but it’s opt-in. I often enable it on debug builds.
This right here - C++ iirc is used mostly for microprocessor code in an industry setting, where EXTENSIVE testing is done so that bloated code doesn’t need to constantly check for programmer errors every single time, i.e. where execution speed is prioritized over programmer development time. And whenever that is not the case, well, as OP pointed out, other higher-level languages also exist (implication: to choose from).
C++ iirc is used mostly for microprocessor code
lol no, it’s used almost everywhere where performance is important and people want(ed) OOP, from tiny projects to web browsers (Chrome, Firefox) to game engines (Unreal, CryEngine). Many of these are hugely complex and do encounter segfaults on a somewhat frequent basis.
Saying C++ is mostly used for embedded applications is like saying C# is mostly used for scripting games, i.e. it doesn’t nearly cover all the use cases.
higher-level languages also exist
This depends on your definition of “higher-level”, but many people would argue that C++ is on a similar level to Java or C# in terms of abstraction. The latter two do, however, have a garbage collector, which vastly simplifies memory management for the programmer(generally anyway).
It’s also used for basically any AAA game
Lots of those in C# now, especially with Unity coming along like it did.
I also currently use it for a new project since all needed 3rd party libraries are from a very specific domain and the project has a deadline, so writing and testing wrappers for Rust that would provide me with any meaningful advantages down the road are too costly to budget for before the deadline.
That could become part of a future refactoring, though.
Python: So you used spaces and tabs for indentation? NOW DIE!
Mixing tabs and white spaces in 2024 is categorically a you problem lmao
Good. Spaces and tabs for indentation should never be mixed in any language other than Whitespace.
Raw adjust with tabs, fine adjust with spaces.
Don’t laugh, people are actually doing that.
Some people use tabs for indentation and spaces for alignment. It kind of gets the pros of tabs (user configurable indent-width) and the pros of spaces (alignment). That doesn’t work in Python where you can’t align stuff and the interpreter doesn’t allow mixing tabs with spaces, but in other languages it is a possible style.
There are no pros to tabs. Configure tabs to a number of spaces.
Are you ok?
Mixing spaces and tabs should be a warcrime.
Find me anyone who claims they use tabs for indentation, and I bet I’ll find at least one case where they’re using both tabs and spaces.
The only safe way to avoid war crimes is to avoid tabs.
Why would I use spaces if I use tabs? Also, it seemd like a huge waste of time hitting the space bar so many times…
Why would I use spaces if I use tabs?
To comply with Python’s best practices:
https://peps.python.org/pep-0008/
Also, it seemd like a huge waste of time hitting the space bar so many times…
You use an editor that doesn’t auto-indent?
Removed by mod
I use vi without syntax highlighting.
Removed by mod
I use the tab key but I’m pretty sure vs code converts that to spaces
Depends on your settings, but yeah typically it does
It worries me that a programmer wouldn’t know for sure what’s happening when they hit tab, and that it’s a setting that can be changed.
I mean I was 99% sure it convert to spaces, I cannot say I was certain. The default settings are fine for what I do, I only ever had to change the spacing from 4 to 2 spaces once when dealing with someone else’s files
Don’t IDEs just replace any tab with 4 spaces anyways? Pretty sure VSCode does
That’s a setting in the editor.
I don’t use an ide, but I wrote a script that replaces any space I type with four.
I haven’t worked out all the use cases yet, though.
Linux kernel?
https://www.kernel.org/doc/html/v4.10/process/coding-style.html#indentation
edit: oh python, nevermind
The kernel definitely mixes tabs and spaces:
https://elixir.bootlin.com/linux/latest/source/block/bfq-iosched.c#L390
And in Python, it’s merely a SyntaxCrime.
https://www.youtube.com/@TsodingDaily
If you’re a programmer, or think you might want to be one, I highly recommend this channel. He’s a savant at all sorts of low level things, quite funny and entertaining, and does a fantastic job of explaining what’s going on.
Good gods, a long-form content creator! Will be checking this out later
tsoding’s channel is one I look forward to watching every single day, never a dull moment in his streams/videos.
If you’re someone who likes to watch things live, his Twitch channel is available here.
The guy is testing the result of malloc and you are complaining about how?
More like 100 lines of template errors
If only I could show segfaul stack tracetrough looped macros.
It breaks VSCode (it would be hilarious if I wasn’t the author of said macros).
Where’s rust?
Rust required you to fix all the errors before running the code.
Runtime errors are still a thing.
Compared to that trio, they are a rarity that make people excited just to spot one.
Runtime errors are rare? Interesting. I guess it depends on hoe much error handling the dev additionally wants to do.
I have a graphical application that crashes regularly when I switch between displays with Ctrl+alt+number. Something in the winit stack does not like it.
Rust: this garbage code is beneath me, come back when you have your shit together.
Compilation: top row, runtime: button row.
Nevermind that the C++ program is two orders of magnitude faster when completed.
I would love to learn and use Rust but I’m a embedded systems guy. Everything of consequence is C and C++.
Rust seems pretty performant
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/rust-gpp.html
I meant faster than Python, not faster than Rust. Rust is fast.
If the embedded system is old or poorly-maintained enough, there might be more Rust than you’d think.
There’s embedded rust for a few platforms. Using it on ESPs is fun
Why doesn’t JavaScript have tracebacks?
How useful would they be when they rely to such a large extent on various callback functions?