The State of Linux Debuggers
scattered-thoughts.net
scattered-thoughts.net
The display isn't really buggy, it's just the debugee output messed up the terminal. You can redraw it with ^L, or disable the tui while it's running. You can toggle it with Ctrl-X A, or just `tui enable` or `tui disable`.
I quite like the tui, the windows are configurable (use `show tui` and `show style`), and you can display more than just source, there's also registers and disassembly mode, e.g. `tui reg general`.
It's so heavily scriptable and configurable that you could argue that it's almost more of a debugger framework than just a debugger. I would argue that it's almost under-used really, simply because most devs don't realize what it can do besides setting a breakpoint and dumping a backtrace.
gdb --batch-silent -ex "attach $PPID" -ex "call (int)bind_variable(\"X\",\"$X\",0)"
I confess that I use this trick in my shell scripts more than strictly necessary, just for fun.That's clearly a horrible UX bug. The point of a debugger is to debug something which is probably going horribly wrong - having it mess up the debug output is a massive pain.
Clearly GDB could prevent this by intercepting the debuggee and preventing it from overwriting the rest of the screen.
I often run into a problem where switching to TUI after a crash disables local echo for some reason. I can't see my typing and TUI's output is totally busted. CTRL-L doesn't fix this, I have to exit the debugger and run "reset" in my terminal. Does anyone know why this happens or how to fix it without exiting the debugger?
I've even tried suspending with CTRL-Z, running "reset", then resuming gdb. This fixes the shell, but TUI is still busted, even with CTRL-L.
> Frida’s core is written in C and injects QuickJS into the target processes, where your JS gets executed with full access to memory, hooking functions and even calling native functions inside the process.
I always use v8, because it has better compatibility with libraries and tools.
EDIT: and then the default moved back in https://frida.re/news/2020/12/01/frida-14-1-released/
Pernosco's tool is described pretty well on their website (which is full of minimal fluff and marketing -- another good sign). But basically it allows you to view a program inside and out, forwards /and/ backwards, with zero replay lag. Everything from stack traces to variable displays (at any point in time in your code execution) is extremely easy to view and understand. The best part is the lightning fast search functionality (again: zero lag).
On top of this: extraordinary customer service if anything breaks (in my experience, they fix bugs within 24 hours and are highly communicative).
I'm not a paid Pernosco shill. I'm just so blown away by this product that I wanted to word-of-mouth spread it around because it's saved so much time for me.
Plus it's a cloud service I need to trust with my code? This is a very tough sell.
I might pay an annual fee for a local/self-hosted version though, kind of like a Jetbrains subscription.
As I understand it, it would be delivered as a pair of docker containers. One is for serving up the UI you see when you're debugging (I think there's one instance of this container per debugging session, but don't quote me on that), and the other ingests rr recordings into the database. A presentation they gave a while back stated that for the cloud version they send all recordings to 36-core AWS instances with 144 GB of ram, that it often takes as much as an hour to process a single recording, and that it can generate a 100GB database. Hopefully most recordings are simpler and quicker than that, but I don't think this is something I'll be running on my laptop in the next few years.
Maybe it's a great product, I'll never know.
I feel like this article gave up way too fast on gdb's tui mode, especially given that gdb works and tui didn't crash like half the debuggers in the list, other than "the command tui disable crashes gdb." which I can't reproduce.
The complaints about rendering and arrow keys are very easy to overlook with just a few tui mode hotkeys. ctrl-x-a toggles tui, ctrl-x-o toggles arrow-key focus between code and the gdb command line, and ctrl-l repaints whenever the rendering gets borked. Those three things cover all the concerns listed here.
The single most important thing about gdb, however, is the .gdbinit file. Being able to script your debug session is hands down the best thing about gdb. Bugs that require several steps to repro can be completely automated in gdb. You have conditionals and looping available in the debug script, this is very powerful. I suspect a bunch of the debuggers listed don't really support such a workflow.
Since I work in a CUDA environment often, it's also nice that cuda-gdb mirrors gdb, I can have scripting & tui mode for both.
I've had the same conundrum for a various categories of development tools on Linux:
For a particular category (e.g., remote debugging, Vim C++ autocomplete system, etc.), an initial search uncovers 3-10 software combinations that people have documented as working.
And when I work through the list, trying to find one that works for me, I often hit problem after problem. It's hard to know if (a) that particular recipe is no longer workable, (b) there's something about my particular setup that will forever damn that approach, or (c) I just need to keep working through the problems until I finally get things working.
So it's hard to know how long to bang away at a particular recipe to determine if it's (a), (b), or (c).
The unfortunate result is I often run out of time for the investigation, and fall back to using Vim + gdb + ctags for developing on remote servers.
Mostly I'm just surprised that Visual Studio in 1999 gave me a better debugging experience than I've been able to cobble together on Linux in 2020.
For debugging, gdb -tui works for me (once I’ve learned to refresh the display after an output).
For coding, VSCode’s is much more responsive than CLion but its code navigation is inconsistent and it use >30GB of RAM once a week randomly (60 GB last week!).. I’m thinking about going back to Vim :-(
No comment on memory though, my remote dev env has 384 gb so I don't really pay much attention :/
This is perhaps related to using zig, but it's frustrating that gdb itself works fine with zig but each gdb frontend manages to break in different ways.
Oh, I'm sure it is. Debugging it would probably be good practice. I'll just open my working debugger...
Considering gdb/Linux: I love the Kdevelop GUI front-end for gdb. It allows introspection of variables in source code at mouse hovering.
Of course it also can open coredumps. The Fortran gdb is also great for debugging arrays.
If you don't mind OSS, check out https://totalview.io/ -- it is an instance of a domain specific debugger for C/C++ in HPC (massively parallel computing).
* gdb works on zig code, so it isn't unreasonable to expect gdb frontends to also work * being on nixos might explain crashes or failing to start, but it's hard to imagine how it could be responsible for various gdb frontends not being able to set breakpoints, run to the correct line or render a pointer to an array of bytes, especially when those same features work fine in gdb * it also doesn't explain why the memory view in most frontends was buggy or didn't work at all * I also tried lldb, whose gui I couldn't operate at all, and code-lldb, whose breakage might actually be nix-related since I had to patch a binary (but the error message was complaining about invalid utf8...)
I'm also happy to try non-gdb/lldb debuggers if you have any suggestions.
As they say typically in the license conditions: This software comes with absolutely no warranty.
Nothing that's not tested in every release (better in every CI build) can be assumed to work. How much of a standard boring Linux distro is written in zig? (That's an honest question, not a justification or even a defense to ship broken software.)
So yes, the headline is most likely misleading: It should be "The state of debugging zig binaries in NixOS." I expect that debugging a C binary on OpenSUSE[1] would give different results.
[1] I picked OpenSUSE here because installing library source is very easy and to my limited experience gdb just finds it. I haven't used OpenSUSE for a while. I have never used NixOS, so no clue whether that would rank above or below average.
I know Solaris has its own debugger(s?), and rr looks really useful, but I haven't worked on a platform that could run either.
How are you able to make that judgement?
The following may help you to view this form:
* Are you using an ad blocker? Try whitelisting this page or disabling it
* Browsing in a private or incognito window may prevent this form from loading correctly. Try viewing this page in a normal window.
* If you’re using Firefox Tracking Protection may be enabled. This could prevent this form from loading. Learn how to disable it.
* Try clearing your cache (including cookies).
Ok, close tab. I will keep using other tool for HPC debugging... (Yes, I actually do HPC and I of course have heard of totalview. Last I heard it is also a total pain to install.)
I think it wasn't as powerful as Valgrind, but you've got to give them credit for an interesting UX concept.
This is not really a criticism, just an observation. I suspect it stems from the fact that both software design and interface design are very complicated disciplines, but most OSS projects are done by a single person scratching an itch, so you either have programmers designing interface, or designers programming software, and both don't work out well. I suspect if we had some GUI libraries that were as easy as dumping text to console, the programmers would be able to churn out passable interfaces without having to do design. Quite possibly Tcl/Tk is that library, based on how rough, but usable gitk and git gui are.
Pro-tip. When working with a new debugging environment "I haven't found a way to display the backtrace, list local variables or view memory" would be where most would look at documentation or seek advice, not move on to the next tool. That the author didn't is more of a comment on the reviewer than the product.
A debugger is a somewhat advanced tool, studying the documentation is absolutely required. It's a CNC machine, not a screwdriver.
(Agreed that gdb could use better documentation.)
Emacs has a much tighter integration with gdb than with other debuggers. The features and interface are documented here: https://www.gnu.org/software/emacs/manual/html_node/emacs/GD...
Simply run Emacs in server mode - it's an operating system, so don't shut it down too often ;-)
using emacs in terminal mode its pretty frustrating to have the gdb interface bring up windows that you aren't allowed to delete...that and I can I really do more than 2 or 3. so whatever the intent was has been well and truly lost.
this kind of modality is anti-emacs...at least why my hindbrain thinks of as emacs
working on compiler-introduced introspection annotations and writing an elisp front end. we'll see.
https://www.gnu.org/software/ddd/
https://doc.qt.io/qtcreator/creator-debugging.html
https://docs.kde.org/trunk5/en/extragear-kdevelop/kdevelop/d...
Back in the old XEmacs days, I used the gdb integration, no idea how far Emacs has improved on it.
Works great for native and cross compiled apps
Edit: Oh 'gdb -tui' ... I should read the docs more ofent.
https://sourceware.org/gdb/current/onlinedocs/gdb/TUI-Keys.h...
(I never start with gdb -tui but usually end up there for a little bit).
As the author pointed out, this hijacks arrow keys, so you have to use readline editing:
https://sourceware.org/gdb/current/onlinedocs/gdb/Readline-B...
https://sourceware.org/gdb/current/onlinedocs/gdb/Readline-M...
Fortunately, there's a lot of stuff that uses readline so it is all very portable.
https://github.com/cyrus-and/gdb-dashboard
It makes for a very pleasant debugging experience
I can't easily see the surrounding code
I have Emacs on the side window, so I use GDB to see the immediately surrounding code, and Emacs to see the rest of the function. I do exactly the same for Python debbuging with PDB I have to manually request information rather than just glancing at the display
I just print the variables I want to see, there are not so many of them I'm actually interested in while debugging I have to remember syntax rather than just clicking on things
...and in this case, it took me a few tries to correctly deref this pointer to an fixed-size array
those are the tradeoff between flexibility and ease. You can access any memory locations, and cast it in many different ways, examine the assembly to precisely understand the next steps, examine the bits to precisely understand the storage (only endianness issues remained tricky to follow)This is not the exclusive domain of GDB. I have all those features in various Windows based IDEs all working in friendly manner.
It isn't a required tradeoff. Most of the gdb frontends I tried display the local variables at all time, but also allow writing arbitrary gdb expressions if I want to. Having both is clearly better.
Really, VS is exceptional even in Windows land. I've tried RemedyDB, an attempted rewrite of debugging on windows, and found it useless. It had similar bugs to this article - no symbols, failure to attach, failed to bind breakpoints at all, failed to display variables.
I think it would be a huge project to replace GDB with a graphical-oriented debugger, but it would be worthwhile. If I were in charge, I'd make it a C lib that didn't come with a frontend. That way, the user can stay in their familiar editor and link the lib. (most programs should be able to use C libraries).
https://headcrab.rs/ is a project to create a modular debugger framework (implemented in Rust, but I think for debugging any native code) which could eventually form a good basis for such a tool.
https://docs.microsoft.com/en-us/windows-hardware/drivers/de...
Mac OS also is another example of having good graphical debuggers, even in the MPW days.
That place is reserved for OWL, VCL and MFC, which WinDbg doesn't use.
But then it was killed because it was linking to gdb internals rather than using gdb's official api or something
Oh? Their git repo[1] seems active.
This goes back a long way too. xxgdb used to be reasonably stable but these days it seems to crash quite frequently. ddd seemed so awesome when I first discovered it, but it too failed spectacularly on the various occasions when I tried actually using it. I occasionally go back to see if they've fixed the bugs but thus far have not had any luck.
Here it is for those who don't like reddit
========================
I think this approach by the programming profession towards tools that are critical to their occupation is somewhat ass-backwards.
Their idea of professionals depending on critical tools which are created by other professionals in their spare time is wrong. It is time software engineers created guilds that fund the development of tools they need and use. It may be that software development is a new profession which is failing to get properly organized on account of the involvement of big corporations. But that is a throwback to an era when computers were expensive resources only big companies (with lashings of DARPA and NSF funding) could afford and thus were able to influence the tools and the outlook.
Those days are long gone in an era where a powerful computer can be had for less than $200, and there is no need for professionals to allow corporate agendas to undermine the proper development of software tools, as it has been since the internet came around, and it is time software developers learned to see themselves as professionals and stop seeing their jobs as gigs as though they are part time semi-employed musicians or something.
I mean it is 2017 and GCC has been available since the 1990s, but where is the graphical C++ debugger rivaling Visual Studio that we would have by now if developers belonged to a well organized profession which saw the need to fund the development of their software tools through membership dues just like any of the professional bodies out there? By that I mean the software developers themselves, wholly independent of any corporations out there, ie no Linux Foundation type f&ckery where BigCo come in and shape the direction to their agenda.
The software could be Free GNU License software but the hard part would be done by paid professionals funded by guild membership fees.
RemedyBG is a cool one-man side-project debugger. It’s crazy impressive for what it is. However it has never worked for me on any professional project. There’s too many little one-off issues that are hard blockers. I wish it was open source. https://remedybg.handmade.network/
The docs are here: https://rr-project.org/
It looks like some changes have been made recently:
Also if you have trouble please file issues!
I haven't had problems getting source locations to work with gdb console, Eclipse, or CLion on Ubuntu 16.04, debugging C++ binaries I built with a shell script.
For dynamic languages, Perl Python and others, I use komodo from ActiveState. Been a customer of theirs since 2007 or so. Excellent tool, though with a few quirks as well.
Julia has/had a native debugger, and an atom plugin, but seems to be moving towards vscode. Vscode is many things, and is highly opinionated. I've gotten the debugger to "work", albeit not being helpful for the Julia I was working on. I tried the C/Fortran plugins for it and was disappointed.
I wasn't aware that totalview went OSS. I thought it was closed.
It's not free, but it looks like a high-quality cross-platform gdb and lldb frontend with an imgui UI.
Edit: just saw that several people mentioned this already. Good, it is a nice tool!
Binaries. Debug Symbols. Source Code.
I wish those three things could be trivially merged and split. For internal builds I want to deploy a single binary that contains symbols and source code. This way issues can be trivially debugged by anyone on any machine. For public builds I wish to split out symbols and source which can be hosted on a symbol server.
You have to build from source but it’s easy to do.
I’m thinking of devoting a summer to writing an Ollydbg-like UI wrapper for LLDB, because I miss Olly so bad when I leave Windows.
Ghidra doesn't have a debugger yet, but it's a planned feature.
Unfortunately, I use Pascal and there it is even worse
GDB tries to parse Pascal syntax in print, but many expressions do not work. It is almost a mix of Pascal and C.
The integration in the Lazarus IDE makes it even worse, when you cannot enter all expressions. And there are so many bugs. You get GDB crashing, Lazarus crashing, or GDB freezing the entire X server if it pauses the program in a bad moment. Then you need to restart the system or kill GDB from outside the X server.
I have to say, though, much as I enjoy working on and with Linux full-blown Visual Studio Enterprise is really in a league of its own but not really complaining that a similar debugger for C++ under Linux doesn't exist yet.
Something I've realized about gdb in general is it gets a lot better once you figure out the python api and use it to ease your repetitive tasks.
For sway, _JAVA_AWT_WM_NONREPARENTING=1 solved most of my issues with java apps.
Anyone got a link to anything that compares things that aren't just gdb frontends or under-developed workalikes?
> The gui doesn't seem to have a way to open an executable.
Activate the "Load Executable" button in the toolbar.
> Using "Open Source Code" produces a file dialog that doesn't seem to have a way to paste paths.
Paste in the location bar or in the file name field, or access the context menu of the location bar and activate the "Paste" menu entry.
> Passing the test exe at the command line (kdbg ./test) open up an editor at start.S but still doesn't seem to have a way to run the exe.
Activate the "Run" button in the toolbar.
----
Verdict: too fucking rushed that he doesn't use common sense and tries the obvious things.
There is not a "Load Executable" button in my toolbar.
I also mentioned that in the article. Maybe you read it in a rush.
> Paste in the location bar or in the file name field, or access the context menu of the location bar and activate the "Paste" menu entry.
The location bar does not accept text. It's just a dropdown. Pressing C-l doesn't replace it either, like it does in the gtk file selector.
> Activate the "Run" button in the toolbar.
There is no "Run" button in my toolbar.
Old Motif/X apps follow "focus on mouse hover" principle, so you can modify text fields only when there is a mouse cursor on them.
But as a long-time Visual Studio developer (C# and C++) I am constantly amazed how bad that status quo is for other languages. I'm probably spoiled by all its features:
* Conditional Breakpoints.
* Move instruction pointer.
* Jump between threads, freeze and thaw them.
* Showing variable Values when hovering over them.
* Inspecting (large) Lists and Dictionaries easily.
* Changing variable values or execute methods while breaking.
* Changing code and continue debugging.
* Historical debugging (moving backward)
I believe that someone who never experience debugging like this cannot possibly imagine how much you could improve debugging in other environments.
- Conditional breakpoints, break main.c:26 if a > 6
- Move instruction pointer, jump main.c:84
- Jump between threads, thread 123
- etc, etc.
I've barely used Visual Studio, but I'm very familiar with windbg which uses the same debugger engine with a different UI.