VERY EASY EXPLANATION: first example in Stallman GDB book refers to a "./m4" executable (first weird sensation with that "./"), allegedly to be present in some (some old standard installation, perhaps?)
You are coming to this problem with the wrong set of assumptions.
In general, you most often use GDB on your own programs, i.e. programs you coded yourself. You usually debug these programs in the directory in which you built them, which is the current directory. On UNIX, current directory is named .
, and if you want to refer to a program in your current directory, you use ./program
notation.
In the book, Stallman is debugging m4
which he worked on and built.
You are trying to debug m4
which you didn't build, and thus you are having problems following the book.
I suggest that you actually download m4
sources and build it yourself (it should be as simple as ./configure && make
), and then follow the book.
Debugging the system-provided m4
is also possible, but that's not what the book is about.
Update:
I did my homework and went through many files (.c, .h, etc) in many folders of m4 versions and i couldn't find anything like what you pointed back in your 2009 post: "...You can download any version of m4, change len_lquote = strlen(lquote); to len_lquote = strlen(rquote); in set_quotes(), and then redo the sample debugging session. ...".
The 2009 post referenced above is apparently this one.
I downloaded m4
version using:
git clone git://git.sv.gnu.org/m4
cd m4
git checkout branch-1.4
In src/input.c
, I see this code:
719 void
720 set_quotes (const char *lq, const char *rq)
721 {
722 free (lquote.string);
723 free (rquote.string);
724
725 /* POSIX states that with 0 arguments, the default quotes are used.
726 POSIX XCU ERN 112 states that behavior is implementation-defined
727 if there was only one argument, or if there is an empty string in
728 either position when there are two arguments. We allow an empty
729 left quote to disable quoting, but a non-empty left quote will
730 always create a non-empty right quote. See the texinfo for what
731 some other implementations do. */
732 if (!lq)
733 {
734 lq = DEF_LQUOTE;
735 rq = DEF_RQUOTE;
736 }
737 else if (!rq || (*lq && !*rq))
738 rq = DEF_RQUOTE;
739
740 lquote.string = xstrdup (lq);
741 lquote.length = strlen (lquote.string);
742 rquote.string = xstrdup (rq);
743 rquote.length = strlen (rquote.string);
744 }
Obviously there is no longer len_lquote = strlen(lquote);
, but the equivalent statement is now lquote.length = strlen (lquote.string);
on line 741.
To introduce a bug, you would change line 741 to read lquote.length = strlen (rquote.string);
But suppose you really want the source to match what was described in the book. The book was first published in 1988, and the very first version of input.c
in the Git repo is from 2000, so we need to find older version of m4
sources.
I found a reference to m4-1.0.3.tar.Z
from 1992 here, and the file itself here: http://www.nic.funet.fi/index/gnu/funet/historical-funet-gnu-area-from-early-1990s/m4-1.0.3.tar.Z
In that TAR file, m4-1.0.3/input.c
does have the source you are looking for:
555 void
556 set_quotes (char *lq, char *rq)
557 {
558 if (lquote != def_lquote)
559 xfree (lquote);
560 if (rquote != def_rquote)
561 xfree (rquote);
562
563 lquote = (lq == NULL) ? def_lquote : xstrdup (lq);
564 rquote = (rq == NULL) ? def_rquote : xstrdup (rq);
565
566 len_lquote = strlen (lquote);
567 len_rquote = strlen (rquote);
568 }
Beware: that source is very old and does not build with modern compilers (GCC-12.2.0 in my case). You'll need to get an ancient version of GCC to build it.