CLion全远程调试Makefile项目GDB断点无法命中求助
问题描述
- 已尝试Full Remote Host、Remote Debug、Remote GDB Server等所有
remote debug连接模式,点击debug按钮后,运行Debian系统的树莓派LoRaWAN设备上的程序可正常拉起,但设置的断点始终无法命中。 - 调试目标为树莓派上稳定运行的LoRa包转发程序,程序原生监听1680端口运行无异常;本地已下载对应项目源码,在CLion中完成项目构建,尝试所有已知远程调试配置组合均未解决问题,推测遗漏关键配置项,现附项目Makefile与Full Remote Host模式配置截图供排查。
附:项目Makefile
### get external defined data include ../target.cfg ### Application-specific constants APP_NAME := lora_pkt_fwd ### Environment constants LGW_PATH ?= ../libloragw LIB_PATH ?= ../libtools ARCH ?= CROSS_COMPILE ?= OBJDIR = obj INCLUDES = $(wildcard inc/*.h) ### External constant definitions # must get library build option to know if mpsse must be linked or not include $(LGW_PATH)/library.cfg RELEASE_VERSION := `cat ../VERSION` ### Constant symbols CC := -g $(CROSS_COMPILE)gcc AR := $(CROSS_COMPILE)ar CFLAGS := -O2 -Wall -Wextra -std=c99 -Iinc -I. -I../libtools/inc VFLAG := -D VERSION_STRING="\"$(RELEASE_VERSION)\"" ### Constants for Lora concentrator HAL library # List the library sub-modules that are used by the application LGW_INC = ifneq ($(wildcard $(LGW_PATH)/inc/config.h),) # only for HAL version 1.3 and beyond LGW_INC += $(LGW_PATH)/inc/config.h endif LGW_INC += $(LGW_PATH)/inc/loragw_hal.h ### Linking options LIBS := -lloragw -ltinymt32 -lparson -lbase64 -lrt -lpthread -lm -lcursor ### General build targets all: $(APP_NAME) clean: rm -f $(OBJDIR)/*.o rm -f $(APP_NAME) ifneq ($(strip $(TARGET_IP)),) ifneq ($(strip $(TARGET_DIR)),) ifneq ($(strip $(TARGET_USR)),) install: @echo "---- Copying packet_forwarder files to $(TARGET_IP):$(TARGET_DIR)" @ssh $(TARGET_USR)@$(TARGET_IP) "mkdir -p $(TARGET_DIR)" @scp lora_pkt_fwd $(TARGET_USR)@$(TARGET_IP):$(TARGET_DIR) install_conf: @echo "---- Copying packet_forwarder conf files to $(TARGET_IP):$(TARGET_DIR)" @ssh $(TARGET_USR)@$(TARGET_IP) "mkdir -p $(TARGET_DIR)" @scp global_conf.json.sx1250.* $(TARGET_USR)@$(TARGET_IP):$(TARGET_DIR) @scp global_conf.json.sx1257.* $(TARGET_USR)@$(TARGET_IP):$(TARGET_DIR) else @echo "ERROR: TARGET_USR is not configured in target.cfg" endif else @echo "ERROR: TARGET_DIR is not configured in target.cfg" endif else @echo "ERROR: TARGET_IP is not configured in target.cfg" endif ### Sub-modules compilation $(OBJDIR): mkdir -p $(OBJDIR) $(OBJDIR)/%.o: src/%.c $(INCLUDES) | $(OBJDIR) $(CC) -c $(CFLAGS) -I$(LGW_PATH)/inc $< -o $@ ### Main program compilation and assembly $(OBJDIR)/$(APP_NAME).o: src/$(APP_NAME).c $(LGW_INC) $(INCLUDES) | $(OBJDIR) $(CC) -c $(CFLAGS) $(VFLAG) -I$(LGW_PATH)/inc $< -o $@ $(APP_NAME): $(OBJDIR)/$(APP_NAME).o $(LGW_PATH)/libloragw.a $(OBJDIR)/jitqueue.o $(CC) -L$(LGW_PATH) -L$(LIB_PATH) $< $(OBJDIR)/jitqueue.o -o $@ $(LIBS) ### EOF
附:Full Remote Host模式配置截图






问题排查与解决方案
断点无法命中的核心原因基本集中在编译配置不符合调试要求、二进制与源码不匹配两点,按以下步骤逐一排查修复即可:
- 修正Makefile编译配置(最核心问题)
- 原Makefile存在写法错误:
CC := -g $(CROSS_COMPILE)gcc将调试参数-g错误写在编译器变量最前端,会导致编译时参数顺序异常,调试符号可能无法正确生成。将该行修改为CC := $(CROSS_COMPILE)gcc,所有编译参数统一放到CFLAGS中。 - 原
CFLAGS中开启了-O2级优化,GCC会在该优化等级下执行指令重排、函数内联、无用代码消除,直接导致源代码行和二进制指令无法一一对应,断点无法命中。将-O2替换为-O0关闭所有优化,同时补充完整的调试符号编译参数,修改后的CFLAGS为:CFLAGS := -O0 -g3 -ggdb3 -fno-omit-frame-pointer -Wall -Wextra -std=c99 -Iinc -I. -I../libtools/inc - 所有依赖的静态库(
libloragw.a、libtools下的链接库)必须使用上述同样的-O0 -g3参数重新编译,禁止使用之前预编译的、不带调试符号的库版本,否则打在依赖库源码中的断点无法命中。 - 执行
make clean彻底清除所有历史构建产物后重新编译,编译完成后在树莓派上执行file lora_pkt_fwd,确认输出包含with debug_info, not stripped,证明二进制携带完整调试符号、未被裁剪。
- 原Makefile存在写法错误:
- 核对CLion Full Remote Host配置
- 确认工具链选择的是远端树莓派的原生GCC工具链,不要使用本地x86工具链交叉编译后上传二进制,避免架构不匹配、符号路径不一致问题。
- 确认调试配置中的远端目标路径指向本次重新编译生成的、带调试符号的二进制绝对路径,不要指向之前部署的生产环境旧版本二进制。
- 确认部署规则会将最新编译的二进制同步到配置的远端运行路径,避免出现本地源码和远端运行二进制版本不一致的情况——GDB检测到源码与二进制符号表不匹配时,会直接将断点标记为无效。
- 其他兼容项排查
- 临时关闭树莓派的地址空间随机化,执行
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space,避免程序每次运行加载地址偏移导致断点映射错误,调试结束后可将值改回2恢复默认配置。 - 若断点打在头文件内联函数、静态函数中,检查CLion的路径映射配置,确保本地源码路径和远端源码路径一一对应,未自动配置时可在GDB启动参数中添加
set substitute-path 本地源码根路径 远端源码根路径手动映射。 - 确认断点位置属于实际可执行的代码行,不要打在空行、注释、未触发的条件分支、被宏屏蔽的代码段中。
- 临时关闭树莓派的地址空间随机化,执行
内容的提问来源于stack exchange,提问作者Farukest
相关产品推荐
相关产品推荐

