C编程:如何在Makefile和命令行参数中使用gdb?

7
为了创建 .out 可执行文件,我需要输入以下命令:
$: make
$: myprogram.out name.ged

我的程序包含一个命令行参数,因此是"name.ged"。

每当我在收到段错误(核心已转储)后运行gdb时,我输入:

$: gdb a.out core
(gdb): bt

我将使用回溯命令,gdb返回以下内容:
#0 0x4a145155 in ?? ()
#1 0x08a16ce0 in ?? ()

我甚至尝试使用up命令移动堆栈,但仍然没有运气。我无法确定程序中哪一行导致了段错误。gdb可以处理不涉及Makefile和命令参数的其他程序,因此我想知道我的命令是否有误。


4
你需要使用“-g”标志进行编译。由于你未发布Makefile,因此我无法提供进一步的帮助。 - Ed Heal
那么命令是gcc -g myprogram.out name.ged吗? - Bonnie
在 make 文件中有一个编译代码的命令(gcc ...)。该命令需要 -g 标志来添加额外的信息,以便 gdb 有效地工作。 - Ed Heal
1
此外,如果程序是 myprogram.out,则应该是 gdb myprogram.out core 而不是 gdb a.out core。那里可能会有任何旧的 a.out - luser droog
1个回答

11

概括评论(在其他人之前:)。

您的可执行文件缺少gdb需要显示相关源代码的符号信息。 您需要将 -g 选项添加到编译命令并生成新的可执行文件。 然后重新运行失败的测试以生成新的核心文件。 使用此可执行文件和核心文件, gdb 将能够使用 backtrace 显示函数调用的堆栈。

在makefile中,最简单的方法是将 CFLAGS 变量添加(到)与隐式.o.c规则一起使用。

CFLAGS= -g -Wall -Wextra

如果您的命令行环境好用的话,也可以直接在命令行中添加这个变量。这种方法可以在执行 make 命令及其子命令期间将该值设置为环境变量。

$ CFLAGS='-g -Wall -Wextra' make

我实际上建议您将此添加到您的bash .profile中,这样您就可以始终从编译器中获得最多的信息。

CFLAGS='-Wall -Wextra'

然后,在需要时,将此放入makefile中以生成可调试的可执行文件:

CFLAGS+= -g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接