陷入 Stallman 的 GDB 书中尝试调试 m4(宏处理器)“bug”示例:我的 m4 可执行文件是 /bin 中的直接 bin(没有“.../gnu/ ./m4”)

问题描述 投票:0回答:1

(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

有什么有用的(直接切中要点)帮助吗? 有什么解决办法吗? 有等效的路径吗?

gdb debian
1个回答
2
投票

非常简单的解释:Stallman GDB 书中的第一个示例引用了“./m4”可执行文件(“./”的第一个奇怪的感觉),据称存在于某些(也许是一些旧的标准安装?)

你是用错误的假设来解决这个问题的。

一般来说,您“最常”在“您自己的程序”(即您自己编写的程序)上使用 GDB。您通常在构建这些程序的目录中调试这些程序,即 current 目录。在 UNIX 上,当前目录名为 .,如果要引用当前目录中的程序,可以使用 ./program 表示法。

在书中,Stallman 正在调试他参与并构建的 
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 才能构建它。

    

© www.soinside.com 2019 - 2024. All rights reserved.