在 Visual Studio 代码中调试 c++ 时未命中断点

Breakpoints not hit while debugging c++ in Visual Studio Code

系统:POPOS IDE: Visual Studio代码

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

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

Makefile 输出:

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

相关文件如下:

launch.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)/*

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

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

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

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

我还从 link 阶段删除了 -g。 switch需要在编译阶段给出(notlink阶段,由debugtarget执行)因为它负责写调试信息进入你的程序。这只能从源代码生成,没有它,您的调试器将无法处理断点。


tl;dr

在您引用的结果命令中,您需要将 -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