在Visual Studio Code中调试C ++时未达到断点

问题描述

系统:POP OS 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源/main.o源/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的注释,然后在$(CXXFLAGS)目标中将$(DEBUGFLAGS)更改为$(SDIR)/%.o。但是,这也会影响发行版的构建,因此您可能希望找到一种不同的方式来执行此操作,例如通过仅为CXXFLAGS目标替换debug定义(这也会影响其依赖性) :

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

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


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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...