(Stackoverflow 中还有另一篇文章:(《使用 GDB 进行调试》的作者使用的是哪个版本的 m4?),但是答案引用的链接已损坏,解决方案看起来不太深入或切题。我有可以说我尝试过它们,也尝试查看 gnu 存储库中的其他 m4 版本,但即便如此:“len_lquote = strlen(lquote);”自 2006 版本以来看起来已被弃用,这是我发现的最旧的版本)。
非常简单的解释:Stallman GDB 书中的第一个示例引用了“./m4”可执行文件(对“./”的第一个奇怪的感觉),据称存在于某些(也许是一些旧的标准安装?)中: /gnu/m4 (?) 或者 /工作/社论/gdb/gnu/m4/(?) (正如我所指出的,它看起来是用“./”执行的,就像它确实不像一个环境可执行文件[就像我的。我的“m4”是我通过“sudo apt install m4”安装的])。
问题是,如果我运行“gdb m4”,它不会执行与本书的 m4 类似的操作: 应该是(例如,在已知函数中设置断点。已知,因为我猜它应该是一些 .c 或类似的东西,GDB 应该与可执行文件并行加载/咨询,不是吗?):
(gdb) break m4_changequote
Breakpoint 1 at 0x62f4: file builtin.c, line 879.
我的:
$ gdb m4
GNU gdb (Debian 12.1-4+b1) 12.1 Copyright (C)
2022 Free Software Foundation, Inc. (......) Reading symbols from
m4... (No debugging symbols found in m4)
(gdb) break m4_changequote
Function "m4_changequote" not defined. Make breakpoint pending on
future shared library load? (y or [n]) n
有什么有用的(直接切中要点)帮助吗? 有什么解决办法吗? 有等效的路径吗?
非常简单的解释:Stallman GDB 书中的第一个示例引用了“./m4”可执行文件(“./”的第一个奇怪的感觉),据称存在于某些(也许是一些旧的标准安装?)
你是用错误的假设来解决这个问题的。
一般来说,您“最常”在“您自己的程序”(即您自己编写的程序)上使用 GDB。您通常在构建这些程序的目录中调试这些程序,即 current 目录。在 UNIX 上,当前目录名为 .
,如果要引用当前目录中的程序,可以使用 ./program
表示法。
m4
。
您正在尝试调试您
没有构建的
m4
,因此您在阅读本书时遇到了问题。
我建议你实际下载m4
源代码并自己构建它(它应该像./configure && make
一样简单),然后
然后按照本书进行操作。调试系统提供的
m4
也是可以的,但这不是本书的内容。
更新:
我做了功课,浏览了 m4 版本的许多文件夹中的许多文件(.c、.h 等),但我找不到像您在 2009 年帖子中指出的那样的内容:“...您可以下载任何m4 版本,将 set_quotes() 中的 len_lquote = strlen(lquote); 更改为 len_lquote = strlen(rquote);,然后重做示例调试会话。...”。
上面提到的 2009 年的帖子显然是这个
。
我使用以下方式下载了m4
版本:
git clone git://git.sv.gnu.org/m4
cd m4
git checkout branch-1.4
src/input.c
中,我看到了这段代码:
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 }
len_lquote = strlen(lquote);
,但等效的语句现在是第741行的
lquote.length = strlen (lquote.string);
。
要引入错误,您可以将第 741 行更改为lquote.length = strlen (rquote.string);
但是假设您确实希望源代码与书中描述的内容相符。这本书首次出版于 1988 年,Git 存储库中
input.c
的第一个版本是 2000 年的,因此我们需要找到旧版本的 m4
源代码。
我在 1992 年找到了对m4-1.0.3.tar.Z
的引用,以及文件本身:http://www.nic.funet.fi/index/gnu/funet/historical-funet-gnu-area-from- 1990 年代初/m4-1.0.3.tar.Z在该 TAR 文件中,m4-1.0.3/input.c
确实有您正在寻找的源代码:
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 }
注意:该源代码非常旧,并且不能使用现代编译器构建(在我的例子中是 GCC-12.2.0)。您需要获得旧版本的 GCC 才能构建它。