you need to stop using print debugging (do THIS instead)

  Рет қаралды 456,255

Low Level

Low Level

Күн бұрын

Пікірлер: 704
@flamurmustafa522
@flamurmustafa522 2 жыл бұрын
For anyone who doesn’t know, in the older references, core meant memory, so when the core is dumped is actually writing the current state of memory into a file
@guilherme5094
@guilherme5094 2 жыл бұрын
👍
@PeterJepson123
@PeterJepson123 2 жыл бұрын
If I remember correctly, the term goes back to the 1950's when they used magnetic iron cores for memory. I'm sure I read it in a 'history of Unix' book of some sort.
@TalentGamer
@TalentGamer 2 жыл бұрын
@@PeterJepson123 read the same thing in "Unix - a History and a memoir" by Brian Kernighan. Recommend it to anyone interested in Computer and Software history
@tymscar
@tymscar 2 жыл бұрын
That is true! Lovely book all around. Kernighan is such an amazing person!
@kennethbeal
@kennethbeal 2 жыл бұрын
@@PeterJepson123 My mom worked on those back in her college days.
@maximkulkin2351
@maximkulkin2351 Жыл бұрын
Print debugging still is the most universal way of debugging. You can do it local, you can do it remote you can do it in embedded, you can do it in a high volume processing code that would be just time consuming to step through (or when you don't know exactly where the problem is and can't put conditional breakpoints). Core files can only help with memory problems (when your code crashes), but won't help when it doesn't crash, but just produces wrong resutls.
@SerBallister
@SerBallister Жыл бұрын
Prints are great at looking at long sequences of events too, which in a debugger can be quite difficult to setup several break-points and then have to poke around the entire local variable state at every break. Prints get straight to the point.
@KucheKlizma
@KucheKlizma Жыл бұрын
@@TheGameMakeGuy Not just logfiles, quite often there's also options to place the software or a component into debug mode and have even more verbouse print debug outputs. In addition to also being able to generate a memory dump, a configuration dump and whatnot. Personally I think debugging should be proportional to the issue or risk at hand. I wouldn't read a core dump to find a misplaced closing bracket, but if a prod sever is crashing mysteriously when it's running on client hardware alongside other applications which naturally have not been perfectly tested for compatibility from development but aren't expected to cause issues then obviously a core dump becomes a highly appropriate troubleshooting option.
@jnharton
@jnharton Жыл бұрын
You can also use /assertions/ if the language has that feature.
@jnharton
@jnharton Жыл бұрын
@@SerBallisterIt does matter how you use them, though. You (the programmer) have to actually understand what the code should be doing so you can add only necessary print statements that let you follow the process and see where it went wrong.
@reynoldskynaston9529
@reynoldskynaston9529 Жыл бұрын
Yeah this core debugging is useful but doesn’t replace other forms of debugging.
@glowiak3430
@glowiak3430 Жыл бұрын
6:13 Fun fact, this is a mistake. As this array's length is 100, its maximum value is 99, so entering 100 will cause a crash anyway.
@JosefdeJoanelli
@JosefdeJoanelli Жыл бұрын
I would have used >= 100
@glowiak3430
@glowiak3430 Жыл бұрын
@@JosefdeJoanelli Yes, but he didn't do it.
@JosefdeJoanelli
@JosefdeJoanelli Жыл бұрын
​@@glowiak3430I know
@chronxdev
@chronxdev Жыл бұрын
Nice! I came to comments to see if anyone else caught this off-by-1 error
@johnbrooks5903
@johnbrooks5903 Жыл бұрын
I assume it was intentional to drive engagement, but yet here I am.
@dfs-comedy
@dfs-comedy 2 жыл бұрын
Core files and debuggers are indeed very useful. But honestly... the occasional debugging printf() is perfectly fine too. I've caught a lot of bugs that way without having to fire up a debugger.
@stevenspmd
@stevenspmd Жыл бұрын
Depending on the situation printf or equivalent might be only way without changing changing threading/timing. Running a full debugger isn't a light weight process.
@pikachuchujelly4119
@pikachuchujelly4119 Жыл бұрын
Sometimes, you just can't use gdb, like when trying to debug bare metal Raspberry Pi code, so you have to do print debugging over UART.
@quentinquadrat9389
@quentinquadrat9389 Жыл бұрын
Or LED blinking :) while the best gdb for bare metal is the oscilloscope :D Instead of printf I know preferring the dbg-macro library for C++
@Bagasl
@Bagasl Жыл бұрын
@@pikachuchujelly4119 I'm using gdb to debug stm32, don't know what are you talking about
@jnharton
@jnharton Жыл бұрын
@@pikachuchujelly4119 That might be the easiest option, but it's most assuredly not the only way. You could probably use the GPIO and LEDs too.
@DinoDiniProductions
@DinoDiniProductions 2 жыл бұрын
Debugging complex systems with time dependent interactions (user input, network connections, video game AI, user interfaces etc) are pretty much impossible with a debugger. The biggest problem here is that the debugger is extremely invasive in terms of time. You hit a break point and it literally freezes your entire application. This is a bit of an issue if you have code that interacts with real time things, which lets face it, is most of the difficult work in software engineering. I do use debuggers where I can and where it's the best tool for the matter at hand. But I am here objecting to the click-bait. Yes, please carry on using logging for debugging, as most debugging of complex systems really requires it.
@sverkeren
@sverkeren 2 жыл бұрын
or you could actually watch the video and realize that it's about post-mortem debugging of core dumps and not time invasive interactive debugging with breakpoints.
@everydaynova663
@everydaynova663 Жыл бұрын
@sverkeren Or you could realize that debugging tools or core dumps aren't the Swiss army knives of debugging and that a simple print statement may be the best option at the moment. Also, this video is advice for programming in C and may not be applicable to any programming language. Still fitting to call it clickbait
@neeneko
@neeneko Жыл бұрын
@@everydaynova663 really, both techniques should be in your toolbelt. cores can tell you things that print statements can not, and print statements can tell you things dumps can not. dumps tell you where you are, prints tell you how you got there.
@DanielCordey
@DanielCordey 11 ай бұрын
Absolutely right !
@DinoDiniProductions
@DinoDiniProductions 11 ай бұрын
@@sverkeren ah, but I did not watch the video because I do not like clickbait. See...
@GiletteRazorsharp
@GiletteRazorsharp 2 жыл бұрын
Don't do "typedef unsigned int uint32_t". The size of an int is compiler dependant (although it usually is 32 bits). Include stdint.h if you *need* exact size integer types.
@absalomdraconis
@absalomdraconis 2 жыл бұрын
Yeah, stdint.h has been around for _how_ long now? Even VS 6 had some homebrew versions made for it at some point.
@biigsmokee
@biigsmokee 2 жыл бұрын
or just program in Rust
@cheems1337
@cheems1337 2 жыл бұрын
@@dmitryhetman1509 ikr, Go ftw
@0xCAFEF00D
@0xCAFEF00D 2 жыл бұрын
@@biigsmokee if you've moved to Rust because of fixed width integer types you're probably not staying.
@NoahGooder
@NoahGooder 2 жыл бұрын
plus it makes your program more portable technically
@ToyKeeper
@ToyKeeper 11 ай бұрын
After writing software for 40 years in many languages, from the highest to lowest levels, including patches to some of the software used in this video, here's what I've learned about debugging: 1. The best debugging technique is to just read the code. If the code is too complex to trace in your head, it probably needs to be rewritten anyway. 2. After that, nothing beats print style debugging. It's easy, simple, and works in almost any context. 3. Debuggers and profilers are nice luxuries to have sometimes, but are frequently not feasible.
@vlc-cosplayer
@vlc-cosplayer Ай бұрын
So you're saying a nice pretty-printer is more important than a nice debugger? 👀
@gariannobinger9933
@gariannobinger9933 11 ай бұрын
minor correction: "ulimit -c unlimited" means allow a core file be created with unlimited size, not "the kernel is allowed to produce an unlimited amount of core files"
@gregorymorse8423
@gregorymorse8423 2 жыл бұрын
This is very basic debugging for crashes but the video title sounded like more. Print statements to deal with non fatal errors are still quite useful.
@vastabyss6496
@vastabyss6496 7 ай бұрын
100% agree. This is probably the first comment I've seen from you where you don't sound angry lol
@gregorymorse8423
@gregorymorse8423 7 ай бұрын
@@vastabyss6496 I'm not angry generally. Just the way things come across via text on the web probably makes it seem that way.
@smocloud
@smocloud 9 ай бұрын
This man is the perfect programming KZbinr for me. I’ve noticed lately at my uni in my courses that all the other students complain at an assignment/task that needs to be done in C (we’re in Operating Systems and we just wrote the first part of a shell where we had to create and implement the cd, pwd, and exit commands, now we’re going to exec the other commands as well as their arguments, and the whole class whined out loud when they were told that was the next assignment due next week. He also teased at the possibility of making us write our own memory allocator, which got even more audible rejection from the other students). However, I get excited at the thought of it. I love writing in C, I love the challenges it brings. My professor even pointed it out to me when I went to see him during his office hour to discuss getting an internship, how to go about it, what to prepare for, etc. that I seemed to really enjoy working at a low level close to the hardware. So, as a guy who seemingly loves writing low-level code, finding a programming KZbinr whose channel name is literally “Low Level Learning” is the best thing that I’ve found on KZbin this year so far.
@rickwoods5274
@rickwoods5274 11 ай бұрын
0:12 no, this has never been me, because, I have (honestly) never been in a situation where I couldn’t find the problem using print statements
@system64_MC
@system64_MC 2 жыл бұрын
6:04 I think I noticed a small error in the if statement the last index of an array is always the size of the array minus one because arrays starts at 0 (except in LUA). So the maximum index of the array is 99, and not 100. if you select a box with 100 as ID, your program will segfault because index 100 is out of bounds. To fix that, you have to either replace the ">" sign to ">=" sign, or you can do if (i > 99) { ... }.
@-wx-78-
@-wx-78- 2 жыл бұрын
Typical “off-by-one” error. Program perhaps won't segfault: static g_Boxes takes 6800 bytes, hence it'll span two 4 KiB pages with 1392 writable bytes left after it (speaking x86'ish).
@chlorobyte_projects
@chlorobyte_projects 2 жыл бұрын
@@-wx-78- Yeah, but it might overwrite unrelated memory.
@-wx-78-
@-wx-78- 2 жыл бұрын
@@chlorobyte_projects Definitely.
@Megamike144p
@Megamike144p 2 жыл бұрын
Indexes in LUA start at 1? Absolute madness.
@cliffmathew
@cliffmathew 2 жыл бұрын
For those unfamiliar with C: "@System64 MC" is correct - and the index should be checked against 99 or less. The index variable "i", declared as an "unsigned int" will not go below zero, so you don't have to worry about that. I could not see what the read_int() function does if the user inputs a negative number.
@staceyschnee801
@staceyschnee801 2 жыл бұрын
It's a whole lot harder to use the core file when a released product crashes (no debug symbols). It is also much harder to use core files to track down crashes in multi-threaded programs, and impossible if the problem is caused by a deadlock elsewhere in the code.
@anujmchitale
@anujmchitale 2 жыл бұрын
And absolutely not an option for me, programming for microcontrollers. 😂
@AnnatarTheMaia
@AnnatarTheMaia 6 ай бұрын
Compiling with symbols only adds to the binary's size, but doesn't actually affect execution speed, as the runtime linker knows not to bind the debugging information into the process image, which is to say: binaries should always be built with debugging symbols embedded in them, they don't hurt runtime performance in any way, and the few milliseconds of loading time can very well save much misery later.
@AnnatarTheMaia
@AnnatarTheMaia 6 ай бұрын
@@anujmchitale it is ALWAYS an option; you could compile with debugging information, then use (g)objdump to extract that information into a separate file, which you could then use if you need to debug the binary. You should never compile without generating debug symbols.
@anujmchitale
@anujmchitale 6 ай бұрын
@@AnnatarTheMaia A classic reply without knowing the slightest about the system that the person might be using. Debugging goes beyond the "binary" when talking about microcontrollers. It's the system as a whole that needs to be debugged, which includes hardware responses. This objdump approach doesn't work when doing realtime debugging on the microcontroller itself. If a kernel isn't running on it.
@AnnatarTheMaia
@AnnatarTheMaia 6 ай бұрын
@@anujmchitale as someone who has learned to program by banging the hardware directly in the constrained system with only 64 KB of bank switched memory, on a microprocessor with only three eight bit registers, I thank you kindly for insulting me, and I want you to know that I took your response very personally.
@abdox86
@abdox86 2 жыл бұрын
Already using gdb on low level stuff, it’s ironic… thanks a lot man I’m really blessed by ur channel.
@quentinquadrat9389
@quentinquadrat9389 Жыл бұрын
For Linux C++ users, I really recommend compiling your project (-g -O0) against the backward-cpp library. You will have a nicely printed stack trace from your segfault. It is probably sufficient to understand where the bug comes from, else yes, use gdb and the core dump.
@lucass8119
@lucass8119 Жыл бұрын
cross platform stack traces were meant to be in C++20, but alas, the committee moves too slow. There is source_location, which you can use for debugging. source_location also doubles as a scrappy way to achieve compile-time reflection! You can extract class member's names as strings by abusing auto and source_location.
@swirl6996
@swirl6996 Жыл бұрын
use -fsanitize=address
@DefaultBoyBand
@DefaultBoyBand 7 ай бұрын
-Og is better for debugging (just a tip)
@atijohn8135
@atijohn8135 7 ай бұрын
​@@DefaultBoyBand -Og enables function inlining, so not exactly the best thing for stack traces, you need to additionally specify -fno-inline alongside it
@DefaultBoyBand
@DefaultBoyBand 7 ай бұрын
@@atijohn8135 huh... didn't know that! thanks
@anon_y_mousse
@anon_y_mousse 2 жыл бұрын
It would also be helpful to demonstrate how to write test cases and how best to separate into multiple modules. Also, you should check the number only once when read in from the user as well as stop using magic numbers. Might also want to demonstrate using `gdb` even if your program isn't crashing.
@CallousCoder
@CallousCoder 2 жыл бұрын
I believe there’s still a bug. You can enter 100 and it still crashes as the index is 0-99 😉I find it remarkable that you remember all the the commands. I always have to look em up. Then again I hardly debug, my code is usually error free 😅 I actually just wrote my first ever C program on the Amiga to just open a window and draw random computed pixels. And not being able to run the binary on my Mac (Aros HDF required UAE version 4 which is not released on Mac yet). So I upload my cross compiled binary and awaited the first crash… but it worked, first time! Usually that’s a no go. Especially with a whole new windowing environment.
@akaikangaroo
@akaikangaroo 2 жыл бұрын
That's why one-indexed languages rule🙂
@CallousCoder
@CallousCoder 2 жыл бұрын
@@akaikangaroo Can you name ONE 😝🤪 And obviously I don’t agree because 0 makes sense because also memory starts at 0000 making it ONE is a silly western construct. Because we a westerners were too stupid to not define zero, unlike the Indian Al-Khowarizini did. For ever gatefuk to him, now programming zero index makes complete sense 😁
@akaikangaroo
@akaikangaroo 2 жыл бұрын
@@CallousCoder Lua, Julia and 18 more😜
@typingcat
@typingcat 2 жыл бұрын
When I saw that "i > 100" code, I immediately thought it was wrong and came to write a comment, but of course someone has already pointed it out. It should have been "i >= 100".
@AnnatarTheMaia
@AnnatarTheMaia 6 ай бұрын
You code on the Amiga, that's why your programs are usually error free, because the Amiga shapes and reinforces correct programming. That explains a lot. Someone who has never programmed on the Amiga has no chance in hell of ever understanding why that is so. Good on you!
@ishashka
@ishashka Жыл бұрын
When I switched from python and C# to C, one of the problems I had was that there's no stack traces when something goes wrong. But this is actually even more useful than a stack trace. Amazing
@stephenhookings1985
@stephenhookings1985 Жыл бұрын
The gdb gives you the stack traces. You could type backtrace or just bt from the core. You can also type where at a breakpoint. In our products we caught signals, then processed the exception - servers are NOT allowed to crash. There again in C++ there are lots of ways to better handle exceptions than in C.
@ishashka
@ishashka Жыл бұрын
@@stephenhookings1985 Yeah, I meant stack traces that print out automatically when there's an exception. I figured you can get that from gdb, but you have to know it's there.
@TheCustomFHD
@TheCustomFHD Жыл бұрын
​@@ishashkaor, you know how to find it. Manuals are amazing.
@sthex4640
@sthex4640 Жыл бұрын
I like how you said we can look at the assembly instructions to debug this and resigned from doing so as soon as you saw them
@Boringpenguin
@Boringpenguin 2 жыл бұрын
This is super helpful for beginners as well! Thanks a lot!!
@LowLevelTV
@LowLevelTV 2 жыл бұрын
You're so welcome!
@avg_user-dd2yb
@avg_user-dd2yb 2 жыл бұрын
@@LowLevelTV can you make a tutorial on making basic interpreter and compilers using c,would be really helpful.
@windowsos-exestoppedworkin5391
@windowsos-exestoppedworkin5391 2 жыл бұрын
I absolutely agree, I keep trying to write a compiler in C but I suck so I eventually give up and then I start over and the cycle repeats
@avg_user-dd2yb
@avg_user-dd2yb 2 жыл бұрын
@@windowsos-exestoppedworkin5391 iam just starting,Iam interested in low level programming stuff... high level languages and frameworks... They hide a lot of details.
@conorstewart2214
@conorstewart2214 2 жыл бұрын
@@avg_user-dd2yb if you are interested then you should check out FPGAs, essentially reconfigurable hardware that you can use to make essentially any digital circuit like processors, the “game”, “Turing Complete” is good for this too, you start off making basic logic gates and latches and stuff and end up making a computer and programming it in assembly. If you are only interested in assembly then “Shenzhen IO” is good too. The most complete way to understand it at a very low level is to know how the processor itself works and be mostly able to build one.
@annan_ma
@annan_ma 2 жыл бұрын
You should at least fix it properly with >= 100… instead of > 100
@truestopguardatruestop164
@truestopguardatruestop164 Жыл бұрын
Wanted to write the same thing
@MrYerak5
@MrYerak5 7 ай бұрын
But the index starts at zero, 100 will overflow
@metroid031993
@metroid031993 Жыл бұрын
Another way to avoid the print statements that get confusing is to use asserts. Forcibly fail when the conditions you're desiring aren't met, or the conditions you're seeing are. It's printf debugging but only one message prints, and it means it's much more comprehensible when something does go wrong. It doesn't always substitute a debugger, but they're good practice anyway, so it's a good idea to use them regardless of if you're debugging or not
@darius0501
@darius0501 2 жыл бұрын
if i knew this in my first year where i've learned trees and graphs in C imagine all the seg faults thank you for this!
@der.Schtefan
@der.Schtefan 2 жыл бұрын
Also, don't use scanf. Use the secure variants, and try to reject input as soon as it is parsed, not later on as per his example.
@TheCustomFHD
@TheCustomFHD Жыл бұрын
Scanf with the right precautions works fine. Sure fscanf or whatever it was is technically better security wise, but is slower and lacks features. Just make sure to specify how much scanf is supposed to take in.
@plato4ek
@plato4ek Жыл бұрын
What are the secure variants?
@Sebastian-eb2ux
@Sebastian-eb2ux 2 жыл бұрын
Won't your program still crash for i = 100?
@Raizin-d8p
@Raizin-d8p 2 жыл бұрын
it will but it's just a small oversight on his part, it's not critical to the topic at hand
@SneezewipeYT
@SneezewipeYT 2 жыл бұрын
Woah this is cool! I wish I'd known about this when I still wrote in C back in uni. Great video!
@LowLevelTV
@LowLevelTV 2 жыл бұрын
Thank you!
@ronaldhofman1726
@ronaldhofman1726 Жыл бұрын
Good video , i just saw a video from Dave Plummer (ex Microsoft software engineer) and i learned to use the f_s functions all the other F functions are not safe, can bus buffer overflow , the new way so use prtinf_s, the video of Dave is called Stupid C tricks , i saw it and he's right , has to do witn functions not taken in account buffer lengts, and not checking them , not adding null remintator and so on, there are new functions and they have in common that they are named as the original functions but added with _s , these are safe functions can not induce a buffer overflow, good explanation also from Dave.
@aes0p895
@aes0p895 11 ай бұрын
KZbin programmers: COME OUT WITH YOUR PRINT STATEMENTS UP Me: You'll never take my print statements, copper! NEVER!
@deathreus
@deathreus Жыл бұрын
For Windows fellows, the equivelant is a .dmp file that is either next to the program or some crashes folder, and Visual Studio would be used to open it
@AnnatarTheMaia
@AnnatarTheMaia 6 ай бұрын
What's the Windows' equivalent of the runtime linker, ld.so.1?
@thatluminary
@thatluminary 2 жыл бұрын
Holy mother of valgrind, I was just struggling with debugging a program when you dropped this video...now my program works. Thanks :)
@LowLevelTV
@LowLevelTV 2 жыл бұрын
Glad it helped!
@thatluminary
@thatluminary 2 жыл бұрын
@@LowLevelTV I actually learned a lot about low level programming in this channel (your videos give me the necessary motivation to research a lot more)
@DeathSugar
@DeathSugar Жыл бұрын
Not always debugging used to fix crashes and sometimes gdb can't show proper backtraces due to absence of debug symbols or code version of the build. Also real-time tight programs will not let to stop themselves so prints is the only choice in many situations.
@Avighna
@Avighna 2 жыл бұрын
Holy shit, this is so useful! I cannot tell you the number of hours I’ve spent tracking down sigsegvs! I didn’t even know the (core dumped) meant anything 😂
@andrewgreen1970
@andrewgreen1970 Жыл бұрын
What I'm trying to understand here is how the values in rax and rdx gave away the nature of the issue.
@LunarLambda
@LunarLambda Жыл бұрын
Something that print debugging allows, but no traditional debugger (to my knowledge) supports, is seeing how certain values in your program evolve over time, like in any kind of loop. Seeing the change over time allows me to figure out a potential pattern, and from there derive the issue way faster than most other traditional debugging techniques. This becomes even more valuable in a language like Rust which has really rich formatting support and prevents most types of crashes from the get go, so the majority of bugs I need to fix are logic bugs, where finding patterns is often pretty fast.
@sakuyarules
@sakuyarules 9 ай бұрын
You can have debuggers stop every time a value changes for a variable. I think that does exactly what you're talking about.
@AnnatarTheMaia
@AnnatarTheMaia 6 ай бұрын
"...is seeing how certain values in your program evolve over time, like in any kind of loop." DTrace is what you want. You can trace the program live while it is running, with no sideeffects on your program. You can even build your own DTrace probe points into your program, and they won't even affect performance, because they won't trigger unless DTrace is used... And if you're on Windows, Microsoft has just added support for DTrace...
@DIMOHA25
@DIMOHA25 2 жыл бұрын
Excuse me, but I add a bunch of prints to figure out what's wrong and eventually I DO crack the code. Works every time.
@stove.d
@stove.d 7 ай бұрын
Plenty of things print statements can't do
@StasPakhomov-wj1nn
@StasPakhomov-wj1nn 2 жыл бұрын
I've been patiently waiting till I finally stumbled across someone who explains these concepts as well as you. Thank you so much sir! I am so excited to learn with you :)
@flannelshirtdad
@flannelshirtdad Жыл бұрын
For this simple example, printing i would have found the bug sooner. However, I do see that this can be useful for truly complex bugs, but not necessarily better than print statements.
@dirivial_
@dirivial_ 2 жыл бұрын
What is the point of looking at the assembly instructions and register states? To me, it looked like you gained nothing from looking at them.
@tobiasmarzell330
@tobiasmarzell330 2 жыл бұрын
That's correct. It was completely unnecessary for this example and probably is almost never necessary as the compiler usually knows pretty well what it does with how it uses the registers. If you ever happen to go that deep you most likely want to turn around and check your bug on a higher level.
@offlinemark
@offlinemark 3 ай бұрын
Agreed. While useful for specific problems, it’s a very security researcher mindset which is not useful for the debugging needs for the vast amount of software devs out there, especially on nontrivial projects unlike this toy example.
@xThirdOpsx
@xThirdOpsx 2 жыл бұрын
Great video Dave! Informative as always.
@LowLevelTV
@LowLevelTV 2 жыл бұрын
Thanks for watching
@a.lollipop
@a.lollipop Жыл бұрын
I never knew what "core dumped" meant, this makes so much more sense now! Thank you :)
@Brad_Script
@Brad_Script 10 ай бұрын
core is archaic term for memory
@__christopher__
@__christopher__ 3 ай бұрын
@@Brad_Script Actually it's a term for a specific type of memory that was in use at some time in the distant past, magnetic-core memory, usually shortened to core memory, where data was stored on magnetic rings.
@PeterJepson123
@PeterJepson123 2 жыл бұрын
This is a great video thanks. I generally use ifdef debug printf() style to isolate an offending function and create a new entry point and test that function to destruction. The only debugging tool I've been using is valgrind --leak-check=full. This is great. Cheers mate.
@LowLevelTV
@LowLevelTV 2 жыл бұрын
Thanks for sharing!
@nexovec
@nexovec Жыл бұрын
I didn't know you can actually configure core like that. This is pretty useful.
@zfekete74
@zfekete74 11 ай бұрын
Nice syntax, I really like when someone takes care of readability and looks at the same time!
@locusf2
@locusf2 2 жыл бұрын
Ah, Seven reference.
@LowLevelTV
@LowLevelTV 2 жыл бұрын
ayyy this guy gets it
@pqsk
@pqsk 11 ай бұрын
Took me a while to get it. Wow, thanks 😹😹😹
@RealLimerickman
@RealLimerickman Ай бұрын
I wish I knew this 25 years ago. I had to dwbug the code differently. It would have greatly improved my debugging speed.
@ThatCowGuy
@ThatCowGuy 2 жыл бұрын
Wow, this was a really well presented video. I never used this feature before, because I thought stuff like that would be overkill in most scenarios. But the way you showcased it made it seem pretty handy, while note being as complicated as I imagined. I will definitely try this out next time I code something.
@lukaszkonsek7940
@lukaszkonsek7940 2 жыл бұрын
Try gdb Save and reverse execution functionalities. It's pain to learn, but super usefull with the worst bugs.
@cajonesalt0191
@cajonesalt0191 11 ай бұрын
Excellent tutorial. Although not a solution for every bug, it's still a great way to debug C memory-related issues.
@frroossst4267
@frroossst4267 2 жыл бұрын
Half a semester of debugging seg faults, why did I not look this up earlier? THE PAIN!
@maaznaseer9706
@maaznaseer9706 Жыл бұрын
Or you can gcc -fsanitize=address to see where the segmentation dump core occurred, we use this method alot to understand where the pointer has failed. If not this, valgrind is the second choice of command to understand memory leaks.
@artik15xfilm
@artik15xfilm 2 жыл бұрын
Still allowing index 100 and that's bad too :P
@JackBond1234
@JackBond1234 11 ай бұрын
The reason I do print debugging is rarely to debug crashes, it's to understand the flow of logic.
@someoneunknown6894
@someoneunknown6894 Ай бұрын
5:22 it's move [rdx + rax] *into* eax, not the other way around
@shikutoai
@shikutoai 11 ай бұрын
Low Level Learning: "Have you ever done this silly noobish thing in C?" Me: "My brother, I do that in Python!"
@zechordlord
@zechordlord 2 жыл бұрын
Extra tip, if you have compiled with -g you should have debug symbols too and you can see the crashed code in gdb with "list". But why live like this? This is the 21st century and if you have a repro case like that you can debug it directly in VS code, and see all variables right there. Core files are nice when either the repro is difficult or you are debugging someone else's crash. The assembly part of the video was a bit unnecessary imo. You won't be able to figure out the array size easily by looking at the registers.
@gamerk316
@gamerk316 2 жыл бұрын
Yeah, this is my primary complaint about programming in Linux/GCC: everything is just harder then MSVC. Heck, when you *have* to support Linux nowadays, I just code in MSVC on Windows and use CLANG to do the compilation on Windows, then once that works just use CLANG on Linux to generate the executable. I can't imagine having to actually DEVELOP on Linux using either GCC or CLANG.
@maxp3141
@maxp3141 Жыл бұрын
Cool trick - I think I used this once a long time ago. Typically I just hit run on my IDE and it stops the debugger automatically on the line where the crash happens. Takes about 5 seconds to fix a bug like this.
@TheJaber288
@TheJaber288 2 жыл бұрын
Really nice ! This is why I want to learn assembly it's really helpful in all cases
@LowLevelTV
@LowLevelTV 2 жыл бұрын
Glad it was helpful!
@anomalous5048
@anomalous5048 9 ай бұрын
I will be using print debugging and you cant stop me. It is the best and only way to debug.
@foreignconta
@foreignconta 4 ай бұрын
I use coredumpctl on Linux. I didn't know you can change the directory where core dumps are saved. Very interesting. Thanks 🙏
@esser50k
@esser50k Жыл бұрын
This is mostly a good argument for C, but for most "memory safe" languages print debugging is KING
@ThatJay283
@ThatJay283 7 ай бұрын
recently i've been using assert alot more, and that's been much better than print statements for some usecases
@6iaZkMagW7EFs
@6iaZkMagW7EFs 5 ай бұрын
printing variables is pretty useful without needing to understand registers or set breakpoints. i personally use both.
@JustAnotherAlchemist
@JustAnotherAlchemist Ай бұрын
Can't do this on most Microcontrollers, but I'll keep it in mind whenever I write a PC program in C.
@rafaelpalmalima
@rafaelpalmalima Жыл бұрын
Thank you so much... it's really hard to find good content about gdb.
@LowLevelTV
@LowLevelTV Жыл бұрын
Happy to help!
@janisir4529
@janisir4529 11 ай бұрын
Printf is one of the most useful tools to debug, and you cannot tell me otherwise.
@ironspider5043
@ironspider5043 Жыл бұрын
You also can use the flag -fsanitize=address -g flag for these seg fault , buffer overflow, etc...
@billy-cg1qq
@billy-cg1qq Жыл бұрын
I'll stay loyal to my prints, thank you
@Kriszzzful
@Kriszzzful Жыл бұрын
„we can actually look at assembly instructions to figure out what went wrong“ Proceeds to briefly show assembly but not actually use it
@davidjulitz7446
@davidjulitz7446 11 ай бұрын
Beside using core dump files is a useful and really powerful debugging technique. Using some Logging or print statements stay still useful too.
@decky1990
@decky1990 Жыл бұрын
I’m about to start using GDB in my codebase - thank you so much 👍🏻
@groknet
@groknet 3 ай бұрын
Best tool for me yet: Dtrace. Once ported a large library from Linux and could remove 30% of all lines (trace/debug code). Replaced it with some Dtrace scripts, to have equivalent functionality, no need to recompile with instrumentation.
@gzozulin
@gzozulin 2 жыл бұрын
You probably meant >= 100, if you will type 100 as a box id you will have the same SEGFAULT
@__christopher__
@__christopher__ 3 ай бұрын
Unlikely. It will still be an array overflow, but it will likely be on the same memory page, and therefore not a segmentation fault.
@emilemil1
@emilemil1 Жыл бұрын
Starting in debug mode often takes 2-3 times longer so a log is usually more efficient. I only reach for the debugger when logs fail or are too cumbersome.
@jameskuyper
@jameskuyper 3 ай бұрын
I was quite proficient with the debuggers I used most frequently, but I still use printf debugging for several reasons: 1. When there's no debugger available. 2. When the only available debuggers are ones I don't know how to use. 3. When the bug shows up only at high levels of optimization, where the connection between the code I wrote and the behavior of the resulting program as shown by the debugger becomes incomprehensible. In particular, if I need to know the current value of a variable, the compiler often tells me that the variable has been optimized away. If I insert a debugging printf, that will either disable the optimization, or at least produces the same debugging output as if the variable had not been optimized away.
@OCKev
@OCKev 9 ай бұрын
What's really fun is when your program cores with the -o option, but doesn't when you specify -g!
@hellNo116
@hellNo116 7 ай бұрын
The funniest experience of learning c is starting using print statements for debugging. Learning about debuggers and perror. End up programming drivers going back to using printk to print statements in order to debug :p
@ardaaltntas9500
@ardaaltntas9500 2 жыл бұрын
As a computer engineering student and with knowing the assembly language, I`ll take my chances in print statements instead reading assembly code..
@arnavmohod9454
@arnavmohod9454 2 жыл бұрын
Really it goes to the core!
@hyper7354
@hyper7354 10 ай бұрын
This is great if you’re writing for a PC environment. Can’t use core files on embedded, a debugger and a robust logging system is the best to debug quickly. Also 99.99% opening up the assembly to see what’s going on is just to take more time than looking at the source
@ejun251
@ejun251 Жыл бұрын
I actually came here only to say that I don't stop print debugging. I learned not to in university and to use a debugger instead. What I learned when I started working is that most of the time, print debugging is way faster than stepping through the code and checking all the variables.
@6754bettkitty
@6754bettkitty 10 ай бұрын
Nice explanation of debugging. Thanks!
@stolenlaptop
@stolenlaptop Жыл бұрын
Don't want to point out a few minor errors however, old timers used 256 as a max number so they could pass unsigned characters and never worry about overflow.
@TheBypasser
@TheBypasser 11 ай бұрын
*255 as max (or 256 for strict-less comparison therefore).
@__christopher__
@__christopher__ 3 ай бұрын
That doesn't prevent overflow, it just causes it to access the wrong array element instead of an out-of-bounds access. I prefer as segmentation fault to a mysteriously misbehaving program.
@meowsqueak
@meowsqueak 9 ай бұрын
FWIW. “ulimit -c unlimited” doesn’t relate to the number of core files, but to the maximum size of a core file. If the maximum size is unlimited, it means you’ll get a core dump regardless of the “core” (memory) size of the process. It usually defaults to zero in a new shell which essentially disables core dumps since all cores are larger than zero bytes.
@corpseopera
@corpseopera 2 жыл бұрын
An address sanitizer compile with -g would help lots as well
@georgehelyar
@georgehelyar 2 жыл бұрын
I get that this is just showing how to use a debugger but you can often avoid needing it in the first place by writing good unit tests.
@mrbutish
@mrbutish 3 ай бұрын
You don't need that 1. Print will always show the error before after point 2. Call all your function parameters with non user input 3. Make sure to store all user input, database reads or API calls in unlimited memory(or limit memory and handle it gracefully) then pass it to your functions 4. Call all your functions in a debug caller 5. Print your own core file using the steps above to debug Now he used uint32 which is more than you can type in a minute. But if you cat a few GB of number to input it will exceed uint32
@mrbutish
@mrbutish 3 ай бұрын
Every function call in a debug caller will log it's parameters to a log file. Don't make it with an extension .log just dump it to an extension lead file
@mrbutish
@mrbutish 3 ай бұрын
* extension less
@ChristopherButeau
@ChristopherButeau 11 ай бұрын
Although I agree with the concepts in relation to crashing programs ...the use of printf or console debugging is still the best answer to figure out complex bugs like drag and drop and other scenarios where you do NOT want to stop execution but observe the flow. Also the best thing I saw done for a memory corruption problem was s senior engineer wrote a memory manager that would allocate restricted blocks around every block requested...so while running BAM it would trigger the debugger right when the memory was stepped on.
@Axel_Andersen
@Axel_Andersen Жыл бұрын
Core files have their place. However, printf has one key advantage IMO over any debugger: repeatability. When you use a debugger you click or give commands and that is a one time operation. If you can't figure out the problem you need to run the code again and repeat all that debugging. Where as whatever you put in printf will be there on every run until you remove them. I find that invaluable. I do use a debugger but most of the time for the kind of work I do printf & friends are much more useful. They are kind of scriptable debugger in a language you know and love.
@fr5229
@fr5229 Жыл бұрын
If anything, core files give you repeatability whereas print statements don’t, unless your application is trivial/deterministic.
@Axel_Andersen
@Axel_Andersen Жыл бұрын
@@fr5229 I was referring to debugger in general, not core files. Have never used core files so I could not really comment on them. However I would presume that they are a (massive) snap shot at given time(s) where as a carefully placed print statement IMO are much less work. But each to their own poisson. I use a debugger but many many times I find print statements much more useful.
@fr5229
@fr5229 Жыл бұрын
@@Axel_Andersen Oh I see. Yeah you’re right- core files are very cumbersome, overkill, the last resort. I avoid needing to use them and I’m actually surprised that this video is calling for people to be so impractical just because they can. I’m not really opinionated either way about print statements vs debuggers, but you should check whether “time travel debuggers” are available to you
@lucass8119
@lucass8119 Жыл бұрын
@@fr5229 The true benefit of printing over core files/debuggers is that printing is actually usable in production. Virtually every non-trivial piece of software has a logger, even in release builds. Virtually none of them compile with debug flags. Core dumps and the debugger are essentially useless in optimized binaries, which is most software.
@Alex-vg7uu
@Alex-vg7uu 8 ай бұрын
You must live in a perfect world where you never have to get your hands dirty.
@Codeaholic1
@Codeaholic1 2 жыл бұрын
Wow today i learned why some say tack instead of dash. Interesting. Still makes my eye twitch every time I hear it.
@ivanz6368
@ivanz6368 9 ай бұрын
It's easier to know why it crashes than finding out why the program flow went wrong and print debug is much more convenient for following the code flow
@davidlean8674
@davidlean8674 11 ай бұрын
1. Putting the MAGIC NUMBER 100 all over is possibly one of the reasons you need to be good at debugging. Define a Macro/Constant & use it in your array size & boundary checks. 2. Core dumping & dropping back to assembly is a flashback to 1985. Surely you can get an interactive debugger that lets you step thru your code line by line & examine your variables. Even small systems like RasberryPI's have emulators you can use. 3. C arrays are from 0 to (array size -1), so your error check needs to be If ( i >= 100). Maybe your array index could be a more meaningful name than "i". not enough characters to search for it in large code. But otherwise good tip.
@salut730
@salut730 Жыл бұрын
5:21, the mov instruction actually does the opposite of what you said, because it's in AT&T syntax.
@adam051838
@adam051838 2 жыл бұрын
I'm confused at what looking at the registers gave us - you opened it and said what we were trying to do but didn't say anything about why that was bad or how we could use that information. Seems you could have just looked at the program .c file and gotten the information without looking at the assembly
@javabeanz8549
@javabeanz8549 4 ай бұрын
This process is great for complied languages, not so easy to do for interpreted languages.
@vadiks20032
@vadiks20032 11 ай бұрын
so much to replicate something visual studio has out of the box lol. i didnt even realize fully that i kept running my VS program in debug mode all the time
@stera182
@stera182 Жыл бұрын
Hint : use sudo -i instead of sudo su. Same experience except all commands you’ll use can be logged properly as a sudo use.
@simonmarabi2661
@simonmarabi2661 6 ай бұрын
if(i >= 100){ printf("...."); return; } Not just greater. Love ur videos!
@Stabby666
@Stabby666 Жыл бұрын
There's still a bug in this program. You're checking for a box index > 100, when the array of boxes ranges from 0 to 99, so if you try to print box 100, it'll segfault...
@sverkeren
@sverkeren Жыл бұрын
Yes, 100 will index outside the array. But it will most probably not segfault the program but instead corrupt some innocent variable that happens to sit next to the array in memory.
@mrcool2963
@mrcool2963 Жыл бұрын
Which is even worse now as this could plant a random time bomb in your program you would have a very hard time finding
@richardsteiner8992
@richardsteiner8992 Жыл бұрын
I usually add a couple of debugging options to programs, even shell scripts, which enable either some basic logging or that plus an overkill data dump. That way I can trace behavior without code changes. A "debugger" isn't always viable for whatever reason.
@erniepasveer8027
@erniepasveer8027 2 жыл бұрын
"unlimited number of core files" => "a core file of unlimited size"
@LowLevelTV
@LowLevelTV 2 жыл бұрын
Yeah I can’t believe I didn’t catch that in editing 😔. Thank you!
using numbers in your code is bad
14:33
Low Level
Рет қаралды 145 М.
the 7zip rabbit hole goes extremely deep. (1000's of crashes)
12:50
Smart Sigma Kid #funny #sigma
00:33
CRAZY GREAPA
Рет қаралды 31 МЛН
Noodles Eating Challenge, So Magical! So Much Fun#Funnyfamily #Partygames #Funny
00:33
FOREVER BUNNY
00:14
Natan por Aí
Рет қаралды 36 МЛН
Turn Off the Vacum And Sit Back and Laugh 🤣
00:34
SKITSFUL
Рет қаралды 9 МЛН
why do header files even exist?
10:53
Low Level
Рет қаралды 434 М.
Google Drive hates developers now
23:56
Theo - t3․gg
Рет қаралды 161 М.
why are switch statements so HECKIN fast?
11:03
Low Level
Рет қаралды 429 М.
Naming Things in Code
7:25
CodeAesthetic
Рет қаралды 2,3 МЛН
Dear Game Developers, Stop Messing This Up!
22:19
Jonas Tyroller
Рет қаралды 734 М.
He wrote this out BY HAND? // Code Review
24:01
The Cherno
Рет қаралды 199 М.
31 nooby C++ habits you need to ditch
16:18
mCoding
Рет қаралды 830 М.
Smart Sigma Kid #funny #sigma
00:33
CRAZY GREAPA
Рет қаралды 31 МЛН