首页 > 解决方案 > 在 Visual Studio Code 中调试 c++ 时未命中断点

问题描述

系统: POP OS IDE: Visual Studio Code

我正在尝试调试一个简单的 c++ 项目。当我最初设置项目时,调试器将按预期运行。当我添加一个生成文件时,断点不再被命中。在添加 makefile 之前,我使用g++ -g -o main.o main.cpp从 task.json 文件编译。这个命令显然没有做makefile正在做的事情,但是在我的环境中调试DID工作。

将 launch.json 设置为 stopAtEntry 也不起作用。所以我的假设是我编译不正确。

生成文件输出:

g++ -Wall -I./header -L./lib -c -o 源/MqttManager.o 源/MqttManager.cpp

g++ -g -o bin/debug/GenericMqttClient source/main.o source/MqttManager.o -Wall -I./header -L./lib -lpaho-mqtt3c

rm -r ./source/*.o

以下是相关文件:

启动.json

   {
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++ - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/bin/debug/GenericMqttClient",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++ build active file",
            "miDebuggerPath": "/bin/gdb"
        }
    ]
}

生成文件

CXX = g++
EXENAME = GenericMqttClient

#   Directories
HDIR = ./header
LDIR = ./lib
ODIR = ./obj
SDIR = ./source
BIN = ./bin
DEBUGDIR = $(BIN)/debug
RELDIR = $(BIN)/release

# Project Files
SRC = $(wildcard $(SDIR)/*.cpp)
OBJ = $(SRC:.cpp=.o)

# Includes
DEPS = $(HDIR)/MqttManager.h
LIBS = -lpaho-mqtt3c

#flags
CXXFLAGS = -Wall -I$(HDIR) -L$(LDIR)
# DEBUGFLAGS = $(CXXFLAGS) -g

# Object files
$(SDIR)/%.o: %.cpp $(DEPS)
    $(CXX) -c -o $@ $< $(CXXFLAGS) $(LIBS)

# Release
release: prep $(RELDIR)/$(EXENAME) objclean
$(RELDIR)/$(EXENAME): $(OBJ)
    $(CXX) -o $@ $^  $(CXXFLAGS) $(LIBS) 

# Debug
debug: prep $(DEBUGDIR)/$(EXENAME) objclean
$(DEBUGDIR)/$(EXENAME): $(OBJ)
    $(CXX) -g -o $@ $^ $(CXXFLAGS)  $(LIBS)

#
#   Other Rules
#
all: clean debug release objclean

prep:
    @mkdir -p $(DEBUGDIR) $(RELDIR)

objclean:
    rm -r $(SDIR)/*.o

clean:
    rm -rf $(BIN)/*

让我知道是否应该包含更多文件。

标签: c++debuggingvisual-studio-codemakefilebreakpoints

解决方案


-g您曾经在编译 CPP 文件时给 g++开关。现在你没有。它需要重新添加。

您编写 Makefile 的方式,您可以取消注释 的定义DEBUGFLAGS,然后在您的目标中更改$(CXXFLAGS)为。但是,这也会影响发布版本,因此您可能希望找到一种不同的方法来执行此操作,例如仅替换目标的定义(这也会影响其依赖项):$(DEBUGFLAGS)$(SDIR)/%.oCXXFLAGSdebug

debug: CXXFLAGS=$(DEBUGFLAGS)
debug: prep $(DEBUGDIR)/$(EXENAME) objclean
$(DEBUGDIR)/$(EXENAME): $(OBJ)
    $(CXX) -o $@ $^ $(CXXFLAGS)  $(LIBS)

我也-g从链接阶段删除了。开关需要在编译阶段(不是链接阶段,由debug目标执行)给出,因为它负责将调试信息写入程序。这只能从源代码生成,没有它,您的调试器将无法执行断点。


tl;博士

在您引用的结果命令中,您需要将其-g从第二个命令移动到第一个命令:

g++ -Wall -I./header -L./lib -c -o source/MqttManager.o source/MqttManager.cpp
g++ -g -o bin/debug/GenericMqttClient source/main.o source/MqttManager.o -Wall -I./header -L./lib -lpaho-mqtt3c
rm -r ./source/*.o

推荐阅读