Makefile 不使用 -g 标志生成调试信息

Makefile not generating debugging information with -g flag

我最近从在终端工作转到 VScode,我需要生成调试信息以与 vscode 中的调试器一起使用。

我的 makefile 是:

SRCS =  src/ft_argcheck.c       \
        src/ft_operations.c     \
        src/ft_stcutils.c       \
        src/push_swap.c

NAME    = push_swap
INCS    = inc/push_swap.h
OBJS    = $(SRCS:c=o)
CC      = gcc
CFLAGS  = -g -Wall -Wextra -Werror
RM      = rm -f
LIBFT = libft/libft.a
LIBFT_DIR = libft

.PHONY: all bonus clean fclean re

all: $(NAME)

$(NAME): $(OBJS)
    @make -C $(LIBFT_DIR) --silent
    @$(CC) $(CFLAGS) -I$(INCS) -o $(NAME) $(OBJS) -L $(LIBFT_DIR) -lft

clean:
    @$(RM) $(OBJS)
    @make -s clean -C $(LIBFT_DIR)

fclean: clean
    @$(RM) $(NAME)
    @make -s fclean -C $(LIBFT_DIR)

re: fclean all

但是尽管添加了-g 标志,但没有生成任何调试信息。我可以 运行 lldb.

一个好的建议是删除命令名称前面的 @s 以查看 make 正在执行什么命令....要使程序可调试,您需要检查所有编译步骤都是使用 -g 标志完成的,并且链接步骤还包括 -g 标志。另外一个好的选择是指定不优化,这样你就不会遇到无法修复的断点问题,因为编译器已经删除或更改了最终代码,并且破坏了源代码行和代码中的点之间的对应关系。

如果你把那里的所有 @ 都去掉,你会看到 make 正在执行的命令,你想你现在看不到了。我认为有一个命令(berkeley make 有它)使 make 打印命令,即使 @s 仍然存在。

顺便说一下,正如你所说的,你正在使用 vscode 如果你单独在命令行上执行 make 应该没问题,看看命令的输出,并尝试看看是不是 make 的问题还是 vscode 本身的问题。

由于你没有提供完整的工程,很抱歉我只能用dumb/fake个文件来测试,没有程序可以用gdb来测试。

我猜问题出在你的项目源码放在了和程序构建目录不同的目录下,gdb找不到源码,所以无法进行源码调试,因为gdb找不到源文件。 Gdb 有一些方法可以指定源文件的路径...您应该查看 gdb 文档。

感谢您的所有回答(删除 @ 并没有真正给我更多信息,因为它确实显示了 -g 标志,我已经尝试用 fclean 重新制作所有内容)。在朋友的帮助下,我似乎找到了一个简单的解决方法:

添加规则“调试”

debug: 
    $(CC) -g $(CFLAGS) -I$(INCS) $(LIBFT) $(SRCS) -o $(NAME)

我们可以 运行 就在我们想要生成调试信息时 运行 直接使用 $(SRCS) 而不是 运行 在 $(OBJS) 上生成调试信息与正常命令一样。