Various small improvement suggestions (mainly UI)

Posting a bunch of possible “quality of life” improvements that I think would be useful yet not hard to implement.

Remember list sorting
The Ctrl-L popup, the various structure and enum selectors, the union member picker… All of these initially get displayed with an ordering that, to the user, is essentially random. This means that names with the same prefix are not displayed together, making the keyboard navigation pretty useless. (If they are sorted, you can press Ctrl-L in the disassembly/pseudocode, type the start of a class name, use the up/down arrow keys to select a specific function of that class, and press Enter.)

I’ve clicked so many “Name” column headers in the past that I actually ended up writing a plugin to do it for me. There is Ctrl-F for filtering, but once you’re in the textbox, the up/down arrow keys no longer work so you end up losing time anyway.

Of course, sorting can result in a noticeable delay if there are a lot of items, so always sorting by name will probably upset someone else. As such, I’d suggest a compromise where the various popup lists remember their sort setting across invocations (and ideally across IDA sessions). This could also be extended to lists that are permanently visible, like the Local Types list, the Functions list and so on.

A special mention goes to the “Structure offsets” window that appears when you select some text in the disassembly and press T. The list there isn’t sortable at all.

Remember the state of the Create Structure “Fixed layout” checkbox
Most of the time when I encounter a new structure, I don’t yet know its size - so with the introduction of the “Fixed layout” checkbox, every new structure creation now involves an extra click to disable it.
The window already remembers which tab you were on last time, so it would be nice if it also remembered the state of this checkbox.

Make decompiler’s “Convert to struct *” even more useful
I use this command so much that I assigned it a shortcut - it’s much quicker than pressing Y and typing a declaration by hand. It could be made even better, however:

  • Right now, it’s only available for structure fields and local variables, but it would be useful for global variables too.
  • Unlike other selector popups (like the T popup in the disassembly), this one doesn’t let you confirm by double-clicking an item.
  • The command can only assign simple pointer types, but pointer-to-pointer types aren’t uncommon either (e.g. std::vector<MyClass*> { MyClass** data; }). Such types could be supported by adding a checkbox or a “pointer depth” textbox at the bottom.

Show function names for Src breakpoints
If you set an “Abs” breakpoint from the disassembly, the “Breakpoints” window shows both the address and the function name. If you set a “Src” breakpoint from pseudocode, however, the window only shows the address.

Reattach to <last process>
As you know of course, Visual Studio has a quite useful item in its Debug menu: “Reattach to <lastprocess>.exe”, which instantly finds and attaches to whatever process you attached to last time (by image name rather than process ID), skipping the process list. It would be nice to have this in IDA as well.

Also, it would be great if the current “Choose process to attach” list were initially sorted.

Better Vtable naming for multi-inheritance classes
(Talking about MSVC specifically, but I’m sure this goes for other compilers as well.)
If a C++ class derives from multiple virtual base classes, it receives a virtual method table for each of them. IDA detects all of these – but it gives them all the same name, making it hard to distinguish between them. Especially during debugging, when you stumble across a pointer to a structure that “starts” with a vtable pointer, it’s hard to tell whether that’s really the start of the class or just the start of some derived fields in the middle.

There should be enough RTTI information to give vtables a more complete name, such as “const MyClass::vftable for ISomeAdditionalInterface.” Maybe this could even include the offset of the vtable pointer within the class.

Thank you in advance for considering these.

1 Like

For me, having this always on is a delight. Despite its name the checkbox only prevents the structure to shrink when last item is undefined. What problems do you encounter when you leave the checkbox checked?

Aha - going by the name of the checkbox and the behavior of the UI, I assumed you had to enter a Structure Size when Fixed Layout is enabled, and that this size could afterwards only be changed by editing the structure properties (not by appending extra fields). But you’re right, it seems the name is misleading and you can in fact append fields. I simply never tried.

In that case, this suggestion can be reduced to “Change the name of the Fixed Layout checkbox to something that better reflects its effect.”

“Fixed layout” means that the structure layout won’t be changed unless the user explicitly requests it. Naturally, we could forbid it in this case too but then the user’s experience will be less pleasant:

  • turn off “fixed layout”
  • add a new field
  • turn on “fixed layout”

We decided to trust the user: if s/he wants to add a field to a fixed structure, it is possible without additional actions.

Hello @MatthewHinson

Thank you for your input and thoughtful feedback on UI! We appreciate the effort in listing the ideas, as well as sharing your plugin with the community.

We’re currently reviewing everything internally, and we’ll follow up if we take any next steps based on your suggestions. Stay tuned!

1 Like

Two more in the meantime:

Demangle function name in pseudocode status bar
When you load a C++ program into IDA for which you have the PDB, the status bar shows the demangled name of the current function when viewing the disassembly, but the mangled name when viewing the pseudocode. Ideally it would of course show the demangled name in both.

Resize breakpoint condition textbox together with window
When you widen the Breakpoint Settings window, the “…” button next to the Condition textbox moves to the right as though to make room for a wider textbox, but the textbox doesn’t actually grow.

1 Like

Do you have an example? Normally it should be demangled in the pseudocode too.

This mini C++ program compiled in debug mode:

namespace Test
{
    class Cls
    {
    public:
        Cls()
        {
            _m = 0;
        }

    private:
        int _m;
    };
}

int main()
{
    Test::Cls cls;
    return 0;
}

results in this for me (IDA 9.1):