[suggestion] gdb interfacing with any-editor via GNU screen
Stephane CHAZELAS <[email protected]> Sun, 23 Mar 2003 14:48:09 +0100
| Newsgroups | gmane.comp.gdb.bugs.general |
|---|---|
| Message-ID | <[email protected]> |
This is not a bug report. I didn't find any better address to send this. Being a vi user, I've long tried to interface it with GDB. I had written once a kind of wrapper that opened two pseudo-ttys, catched the \032\032 sequences sent by "gdb -f" and turned them into ":e +line filename" sent to vi. I recently noticed I could use GNU screen to do this. screen provides a special control sequence which allows to run arbitrary screen commands based on output from a command. >From "info -f screen -n 'Control Sequences'": I| ESC ] 83 ; cmd ^G (A) Execute screen command. This only works if I| multi-user support is compiled into screen. I| The pseudo-user ":window:" is used to check I| the access control list. Use "addacl :window: I| -rwx #?" to create a user with no rights and I| allow only the needed commands. My idea was then, that gdb could send something like "\e]83;<a screen command to have vi open the right file at the right line>\a" instead of sending "\032\032filename:line:char:mid:addr\n". That's my suggestion: add a new -F/--annotation-format option to GDB with one required argument only used when the annotation_level is 1 (-f option). The default would be: "\032\032%f:%l:%c:%m:%a\n". Attached, you'll find a quick patch on GDB 5.3, with my suggestion implemented. (%f, %l, %c, %m, %a are replaced by filename, line#, char#, middle/beg, address in the annotation format). vim-gdb-screen is a GNU bash script that sets up a screen environment with a splitted screen (vim above, gdb below) to use this feature. This must be run from within screen, with two optionnal arguments: the executable to debug and its source directory. screenshot.png is a screenshot of an example usage. Tell me what you think of it and don't hesitate to ask more details. Best regards, Stéphane _______________________________________________ Bug-gdb mailing list [email protected] http://mail.gnu.org/mailman/listinfo/bug-gdb
screenshot.png
(image/png, 19.9 KB) - not displayed
gdb-5.3+annotation-format.diff
(text/plain, 2.6 KB)
diff -ur gdb-5.3/gdb/annotate.c gdb-5.3.N/gdb/annotate.c
--- gdb-5.3/gdb/annotate.c Tue Mar 6 09:21:05 2001
+++ gdb-5.3.N/gdb/annotate.c Sun Mar 23 13:52:10 2003
@@ -42,6 +42,7 @@
void (*annotate_exited_hook) (void);
static int ignore_count_changed = 0;
+char *annotation_format = "\032\032%f:%l:%c:%m:%a\n";
static void
print_value_flags (struct type *t)
@@ -415,16 +416,48 @@
void
annotate_source (char *filename, int line, int character, int mid, CORE_ADDR pc)
{
- if (annotation_level > 1)
+ if (annotation_level > 1) {
printf_filtered ("\n\032\032source ");
- else
- printf_filtered ("\032\032");
-
- printf_filtered ("%s:%d:%d:%s:0x", filename,
- line, character,
- mid ? "middle" : "beg");
- print_address_numeric (pc, 0, gdb_stdout);
- printf_filtered ("\n");
+ printf_filtered ("%s:%d:%d:%s:0x", filename,
+ line, character,
+ mid ? "middle" : "beg");
+ print_address_numeric (pc, 0, gdb_stdout);
+ printf_filtered ("\n");
+ } else {
+ char *p;
+ for (p = annotation_format; *p; p++) {
+ if (*p == '%')
+ switch (*++p) {
+ case 'a':
+ puts_filtered("0x");
+ print_address_numeric(pc, 0, gdb_stdout);
+ break;
+ case 'f':
+ puts_filtered(filename);
+ break;
+ case 'l':
+ printf_filtered("%d", line);
+ break;
+ case 'c':
+ printf_filtered("%d", character);
+ break;
+ case '%':
+ putchar_filtered('%');
+ break;
+ case '\0':
+ putchar_filtered('%');
+ return;
+ case 'm':
+ puts_filtered(mid ? "middle" : "beg");
+ break;
+ default:
+ putchar_filtered('%');
+ putchar_filtered(*p);
+ }
+ else
+ putchar_filtered(*p);
+ }
+ }
}
void
diff -ur gdb-5.3/gdb/defs.h gdb-5.3.N/gdb/defs.h
--- gdb-5.3/gdb/defs.h Thu Aug 1 19:18:32 2002
+++ gdb-5.3.N/gdb/defs.h Sun Mar 23 12:00:28 2003
@@ -397,6 +397,7 @@
/* Annotation stuff. */
+extern char* annotation_format;
extern int annotation_level; /* in stack.c */
extern void begin_line (void);
diff -ur gdb-5.3/gdb/main.c gdb-5.3.N/gdb/main.c
--- gdb-5.3/gdb/main.c Sat Sep 28 17:10:31 2002
+++ gdb-5.3.N/gdb/main.c Sun Mar 23 13:01:37 2003
@@ -233,6 +233,8 @@
emacses which use --fullname. */
{"fullname", no_argument, 0, 'f'},
{"f", no_argument, 0, 'f'},
+ {"annotation-format", required_argument, 0, 'F'},
+ {"F", required_argument, 0, 'F'},
{"annotate", required_argument, 0, 12},
{"help", no_argument, &print_help, 1},
@@ -314,6 +316,9 @@
annotation_level = 1;
/* We have probably been invoked from emacs. Disable window interface. */
use_windows = 0;
+ break;
+ case 'F':
+ annotation_format = optarg;
break;
case 's':
symarg = optarg;
vim-gdb-screen
(text/plain, 541 B)
#! /bin/bash
: ${STY?Must be run from screen}
exec_file=${1-$PWD/a.out}
src_dir=${2-$PWD}
shift ${2+2}
export src_dir exec_file
screen -X addacl :window: +x process,stuff
screen -X register N "
"
screen -X only
screen -t VIM 1 sh -c 'cd "$2" && exec vim'
screen -t GDB 1 gdb -f -F \
$'\e]83;focus\a\e]83;stuff ":e +/\%%%ll. %f"\a\e]83;process N\a\e]83;focus\a' \
"$@" "$exec_file"
screen -p VIM -X stuff ":set hls
"
screen -p GDB -X stuff "directory $src_dir
"
screen -X split
screen -X select VIM
screen -X focus
screen -X select GDB