I just use M-x gdb in emacs, and its very simple debug buffer modes to single step code, set breakpoints and such. For anything not built in, like printing values, evaluating arbitrary expressions, setting conditional breakpoints or watchpoints, casting structure types, ad-hoc function calls, checking ARM core status registers such as to find a trap reason, etc, I just use the gdb command line directly.