summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorkre <kre@NetBSD.org>2022-08-22 17:33:11 +0000
committerkre <kre@NetBSD.org>2022-08-22 17:33:11 +0000
commitbf6c3c8987e7a7afa4e073c8afa18d5062a252fd (patch)
treeea80e0b482436d5eb963c9acb9af7ef075a44a0a /bin
parent2378cec4b4a2607ad152b910c785bc19cd968192 (diff)
Add debugging trace points for history and the editline interface.
NFC for any normal shell (not compiled with debugging (sh DEBUG) enabled. We have had a defined debug mode for this for years, but since I have not often played in this arena, never used it. Until recently (relatively). This (or a small part of it) played a part in discovering the fc -e bug cause. I have had it in my tree a while now - recent changes kept causing merge conflicts (all because I hadn't bothered to commit this), so I think now is the time...
Diffstat (limited to 'bin')
-rw-r--r--bin/sh/histedit.c45
1 files changed, 42 insertions, 3 deletions
diff --git a/bin/sh/histedit.c b/bin/sh/histedit.c
index b855efd35c8..5a1b9649bbd 100644
--- a/bin/sh/histedit.c
+++ b/bin/sh/histedit.c
@@ -1,4 +1,4 @@
-/* $NetBSD: histedit.c,v 1.64 2022/08/21 21:35:36 nia Exp $ */
+/* $NetBSD: histedit.c,v 1.65 2022/08/22 17:33:11 kre Exp $ */
/*-
* Copyright (c) 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)histedit.c 8.2 (Berkeley) 5/4/95";
#else
-__RCSID("$NetBSD: histedit.c,v 1.64 2022/08/21 21:35:36 nia Exp $");
+__RCSID("$NetBSD: histedit.c,v 1.65 2022/08/22 17:33:11 kre Exp $");
#endif
#endif /* not lint */
@@ -65,6 +65,7 @@ __RCSID("$NetBSD: histedit.c,v 1.64 2022/08/21 21:35:36 nia Exp $");
#ifndef SMALL
#include "eval.h"
#include "memalloc.h"
+#include "show.h"
#define MAXHISTLOOPS 4 /* max recursions through fc */
#define DEFEDITOR "ed" /* default editor *should* be $EDITOR */
@@ -97,6 +98,9 @@ histedit(void)
#define editing (Eflag || Vflag)
+ CTRACE(DBG_HISTORY, ("histedit: %cE%cV %sinteractive\n",
+ Eflag ? '-' : '+', Vflag ? '-' : '+', iflag ? "" : "not "));
+
if (iflag == 1) {
if (!hist) {
/*
@@ -152,6 +156,8 @@ histedit(void)
else
unsetenv("TERM");
el = el_init("sh", el_in, el_out, el_err);
+ VTRACE(DBG_HISTORY, ("el_init() %sed\n",
+ el != NULL ? "succeed" : "fail"));
if (el != NULL) {
if (hist)
el_set(el, EL_HIST, history, hist);
@@ -172,6 +178,7 @@ bad:
INTOFF;
el_end(el);
el = NULL;
+ VTRACE(DBG_HISTORY, ("line editing disabled\n"));
INTON;
}
if (el) {
@@ -180,6 +187,7 @@ bad:
el_set(el, EL_EDITOR, "vi");
else if (Eflag)
el_set(el, EL_EDITOR, "emacs");
+ VTRACE(DBG_HISTORY, ("reading $EDITRC\n"));
el_source(el, lookupvar("EDITRC"));
el_set(el, EL_BIND, "^I",
tabcomplete ? "rl-complete" : "ed-insert", NULL);
@@ -196,6 +204,7 @@ bad:
hist = NULL;
}
INTON;
+ VTRACE(DBG_HISTORY, ("line editing & history disabled\n"));
}
}
@@ -263,10 +272,13 @@ setterm(const char *term)
int
inputrc(int argc, char **argv)
{
+ CTRACE(DBG_HISTORY, ("inputrc (%d arg%s)", argc-1, argc==2?"":"s"));
if (argc != 2) {
+ CTRACE(DBG_HISTORY, (" -- bad\n"));
out2str("usage: inputrc file\n");
return 1;
}
+ CTRACE(DBG_HISTORY, (" file: \"%s\"\n", argv[1]));
if (el != NULL) {
INTOFF;
if (el_source(el, argv[1])) {
@@ -310,6 +322,7 @@ histcmd(volatile int argc, char ** volatile argv)
if (hist == NULL)
error("history not active");
+ CTRACE(DBG_HISTORY, ("histcmd (fc) %d arg%s\n", argc, argc==1?"":"s"));
if (argc == 1)
error("missing history argument");
@@ -319,18 +332,23 @@ histcmd(volatile int argc, char ** volatile argv)
switch ((char)ch) {
case 'e':
editor = optarg;
+ VTRACE(DBG_HISTORY, ("histcmd -e %s\n", editor));
break;
case 'l':
lflg = 1;
+ VTRACE(DBG_HISTORY, ("histcmd -l\n"));
break;
case 'n':
nflg = 1;
+ VTRACE(DBG_HISTORY, ("histcmd -n\n"));
break;
case 'r':
rflg = 1;
+ VTRACE(DBG_HISTORY, ("histcmd -r\n"));
break;
case 's':
sflg = 1;
+ VTRACE(DBG_HISTORY, ("histcmd -s\n"));
break;
case ':':
error("option -%c expects argument", optopt);
@@ -355,12 +373,17 @@ histcmd(volatile int argc, char ** volatile argv)
savehandler = handler;
if (setjmp(jmploc.loc)) {
active = 0;
- if (*editfile)
+ if (*editfile) {
+ VTRACE(DBG_HISTORY,
+ ("histcmd err jump unlink temp \"%s\"\n",
+ *editfile));
unlink(editfile);
+ }
handler = savehandler;
longjmp(handler->loc, 1);
}
handler = &jmploc;
+ VTRACE(DBG_HISTORY, ("histcmd was active %d (++)\n", active));
if (++active > MAXHISTLOOPS) {
active = 0;
displayhist = 0;
@@ -378,6 +401,8 @@ histcmd(volatile int argc, char ** volatile argv)
sflg = 1; /* no edit */
editor = NULL;
}
+ VTRACE(DBG_HISTORY, ("histcmd using %s as editor\n",
+ editor == NULL ? "-nothing-" : editor));
}
}
@@ -389,6 +414,8 @@ histcmd(volatile int argc, char ** volatile argv)
pat = argv[0];
*repl++ = '\0';
argc--, argv++;
+ VTRACE(DBG_HISTORY, ("histcmd replace old=\"%s\" new=\"%s\""
+ " (%d args)\n", pat, repl, argc));
}
/*
@@ -428,6 +455,10 @@ histcmd(volatile int argc, char ** volatile argv)
last = first;
first = i;
}
+ VTRACE(DBG_HISTORY, ("histcmd%s first=\"%s\" (#%d) last=\"%s\" (#%d)\n",
+ rflg ? " reversed" : "", rflg ? laststr : firststr, first,
+ rflg ? firststr : laststr, last));
+
/*
* XXX - this should not depend on the event numbers
* always increasing. Add sequence numbers or offset
@@ -448,6 +479,8 @@ histcmd(volatile int argc, char ** volatile argv)
close(fd);
error("can't allocate stdio buffer for temp");
}
+ VTRACE(DBG_HISTORY, ("histcmd created \"%s\" for edit buffer"
+ " fd=%d\n", editfile, fd));
}
/*
@@ -470,6 +503,7 @@ histcmd(volatile int argc, char ** volatile argv)
fc_replace(he.str, pat, repl) : he.str;
if (sflg) {
+ VTRACE(DBG_HISTORY, ("histcmd -s \"%s\"\n", s));
if (displayhist) {
out2str(s);
}
@@ -502,9 +536,12 @@ histcmd(volatile int argc, char ** volatile argv)
cmdlen = strlen(editor) + strlen(editfile) + 2;
editcmd = stalloc(cmdlen);
snprintf(editcmd, cmdlen, "%s %s", editor, editfile);
+ VTRACE(DBG_HISTORY, ("histcmd editing: \"%s\"\n", editcmd));
evalstring(editcmd, 0); /* XXX - should use no JC command */
stunalloc(editcmd);
+ VTRACE(DBG_HISTORY, ("histcmd read cmds from %s\n", editfile));
readcmdfile(editfile); /* XXX - should read back - quick tst */
+ VTRACE(DBG_HISTORY, ("histcmd unlink %s\n", editfile));
unlink(editfile);
INTON;
}
@@ -522,6 +559,7 @@ fc_replace(const char *s, char *p, char *r)
char *dest;
int plen = strlen(p);
+ VTRACE(DBG_HISTORY, ("histcmd s/%s/%s/ in \"%s\" -> ", p, r, s));
STARTSTACKSTR(dest);
while (*s) {
if (*s == *p && strncmp(s, p, plen) == 0) {
@@ -534,6 +572,7 @@ fc_replace(const char *s, char *p, char *r)
}
STACKSTRNUL(dest);
dest = grabstackstr(dest);
+ VTRACE(DBG_HISTORY, ("\"%s\"\n", dest));
return dest;
}