>>>>> "David" == David Malcolm <dmalc...@redhat.com> writes:
Tom> Naughty. David> We chatted about this at Cauldron; I haven't yet had a chance to David> implement the magic bullet approach we discussed there. In the David> meantime, is there a API I can call to determine how safe this kludge David> is? Not right now. You can just call the function and catch the exception that occurs if it can't be done. I think you can still run into trouble sometimes. For example if the user puts a breakpoint in one of the functions used by the pretty-printer, and then does "bt", hitting the breakpoint while printing the backtrace... not sure what happens then, maybe a crash. Tom> I think you could set up the safe-path in the gcc .gdbinit. David> Interesting idea - but .gdbinit itself seems to get declined, so I don't David> think this can help. Haha, I didn't think of that :-) David> So I implemented a similar scheme, with all the prettyprinters in a David> top-level "gcc" holder, but doing precise string matching on the David> "unqualified" type, like in the original patch. David> This works as before, and presumably works with the pretty-printer David> management facilities; running this gives sane-looking output: [...] Nice. David> How would one go about toggling the enabledness of a prettyprinter? Is David> this something that can only be done from python? You can use "enable pretty-printer" and "disable pretty-printer". David> I did see references to gdb.parameter("verbose") in gdb.printing David> - how would one go about setting this? "set verbose on" I think few people use this setting though; probably best to do what you're doing now. David> +# Convert "enum tree_code" (tree.def and tree.h) to a dict: David> +tree_code_dict = gdb.types.make_enum_dict(gdb.lookup_type('enum tree_code')) One other subtlety is that this doesn't interact well with all kinds of uses of gdb. For example if you have a running gdb, then modify enum tree_code and rebuild, then the pretty-printers won't notice this change. I guess it would be nice if we had pre-built caches for this kind of this available upstream. But meanwhile, if you care, you can roll your own using events to notice when to invalidate data. David> + def __call__(self, gdbval): David> + type_ = gdbval.type.unqualified() David> + str_type_ = str(type_) FWIW I think for RegexpCollectionPrettyPrinter you could write a subclass whose __call__ first dereferenced a pointer, then called super's __call__. But your approach is just fine. Tom