[英]Breakpoints not hit while debugging c++ in Visual Studio Code
系統: POP OS IDE: Visual Studio Code
我正在嘗試調試一個簡單的 C++ 項目。 當我最初設置項目時,調試器會按預期運行。 當我添加一個 makefile 時,斷點不再被命中。 在添加 makefile 之前,我使用g++ -g -o main.o main.cpp從 task.json 文件編譯。 這個命令顯然沒有做 makefile 正在做的事情,但在我的環境中調試確實有效。
將 launch.json 設置為 stopAtEntry 也不起作用。 所以我的假設是我編譯不正確。
生成文件輸出:
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
以下是相關文件:
啟動文件
{
"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
目標$(DEBUGFLAGS)
$(CXXFLAGS)
更改$(CXXFLAGS)
$(DEBUGFLAGS)
。 但是,這也會影響發布版本,因此您可能希望找到一種不同的方法來執行此操作,例如替換僅用於debug
目標的CXXFLAGS
定義(這也會影響其依賴項):
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.