CLion Debug 调试 Makefile 构建的 C 语言程序断点不起作用

最近在研究 jattach,打算在本地调试项目,发现 CLion 可以正常编译运行代码,却无法断点 Debug。由于笔者对 C/C++ 项目不熟悉,在此记录研究过程中遇到的一些基本问题与解决方法。

解决方式

在 Makefile 中的编译命令增加参数 -g

diff --git a/Makefile b/Makefile
index 7ff43df..fb44679 100644
--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,7 @@ else
 
   UNAME_S:=$(shell uname -s)
   ifeq ($(UNAME_S),Darwin)
-    CFLAGS ?= -O3 -arch x86_64 -arch arm64 -mmacos-version-min=10.12
+    CFLAGS ?= -g -O3 -arch x86_64 -arch arm64 -mmacos-version-min=10.12
     JATTACH_DLL=libjattach.dylib
   else
     CFLAGS ?= -O3

尝试过的手段

笔者环境为 macOS aarch64。

【未解决】找 Native Debugging Support 相关插件

曾经在 GoLand 使用 Rust 也遇到过无法 Debug 的问题,安装 Native Debugging Support 插件后问题解决。
搜了一下貌似 C 语言没有相关的插件。

【未解决】尝试安装 gdb

brew install gdb

发现 gdb 没有适用于 Apple Silicon 的版本:

gdb: The x86_64 architecture is required for this software.

在这里插入图片描述

【未解决】配置 CLion 使用 macOS CommandLineTools

CLion 的 Toolchains 提供了一个默认配置,使用的都是 CLion 内置的编译工具。
在这里插入图片描述

笔者猜测:是不是应该使用 CommandLineTools 中提供的 clangLLDB?我理解那是苹果专门为 Apple Silicon 准备的版本。

于是创建了一个新的 Toolchains,路径都指定 macOS 的开发者工具。
在这里插入图片描述

程序可以运行,但如果 Debug 就会报错:

error: unknown option: --interpreter=mi2
Use 'lldb --help' for a complete list of options.

在这里插入图片描述

<think>首先,用户的问题是关于CLion调试模式运行时生成d.dll文件的机制。用户想知道这个具体过程是由谁或哪个组件完成的。回顾系统级指令:-所有行内数学表达式使用$...$格式。 -独立公式使用$$...$$格式并单独成段。 -LaTeX语法正确。-使用中文回答。-生成相关问题。 -在回答中引用的段落末尾自然地添加引用标识。-回答结构清晰,帮助用户逐步解决问题。 -参考站内引用,但用户提供的引用是关于QT和.dll文件的,可能与CLion相关但不直接针对调试模式生成d.dll。 用户提供的引用: -[^1]:关于Clion生成动态链接库.dll文件的过程。- [^2]: QT编译后缺少.dll文件的解决办法。- [^3]:运行Qt程序缺少.dll文件的问题。用户的问题焦点是CLion debug模式运行时生成d.dll文件的机制。d.dll可能是一个占位符,实际指的是调试版本的动态链接库,通常命名为带"d"后缀的.dll文件,比如MyLibraryd.dll,表示调试版本。在CLion中,生成动态链接库(DLL)涉及CMake构建系统。CLion使用CMake来管理项目构建。关键点: -当在CLion中运行调试模式时,它会触发构建过程(如果代码有更改),然后启动调试器。 -生成DLL文件是由构建系统(CMake)和编译器(如GCC或Clang)完成的。 -调试模式下,通常会生成调试版本的二进制文件,包括带调试信息的DLL。 具体机制:1.**CMake配置**:用户需要在CMakeLists.txt文件中定义目标为SHARED库,例如:```cmakeadd_library(MyLibrarySHARED source.cpp)```对于调试版本,CMake会自动处理不同的构建类型(Debug, Release等)。2.**构建过程**:当用户在CLion中启动调试模式时:- CLion调用CMake生成构建文件(如Makefile)。-然后调用构建工具(如make或ninja)来编译和链接代码。-Debug构建类型下,编译器生成调试版本的DLL,通常带有调试信息(如.pdb文件在Windows上)和可能的命名约定(如添加"d"后缀)。 3. **调试模式**:在调试模式下运行,CLion会确保构建Debug配置,然后启动调试器(如GDB或LLDB)附加到生成的可执行文件或DLL。 4. **生成d.dll**:具体生成d.dll文件是由编译器完成的。例如:-在Windows上,使用MinGW或MSVC编译器时,构建系统会根据配置生成不同的输出。-在CMake中,可以通过变量控制输出命名,如:```cmakeset_target_properties(MyLibraryPROPERTIES DEBUG_POSTFIX "d")```这会在调试版本中添加"d"后缀。 5. **CLion的角色**:CLion作为IDE,协调整个过程:-解析CMakeLists.txt。-生成构建脚本。-调用构建工具。-管理调试会话。 回答结构: -逐步解释机制。 -保持清晰和可靠。-使用中文。-生成相关问题。 -在引用段落末尾添加引用标识(但用户提供的引用可能不直接相关,所以我需要谨慎使用)。由于用户引用是关于QT和.dll的,但问题焦点是CLion,我可以参考[^1]因为它提到Clion生成.dll文件。 生成相关问题: -基于主题,生成3个相关问题。 最终回答应包含:1.解释机制。2.引用(如果适用)。 3.相关问题。</think>### CLion调试模式下生成d.dll文件的机制 在CLion中,当以调试模式(Debug Mode)运行项目时,生成调试版本的动态链接库文件(通常命名为`xxxd.dll`,其中`d`表示调试版本)的过程涉及多个组件的协同工作。以下是具体机制的逐步分析,确保回答真实可靠,基于CMake构建系统和CLion的IDE功能。 #### 1. **构建配置的触发** - 当您在CLion中选择调试模式(点击Debug按钮)时,IDE首先检查项目是否需要重新构建。如果代码或配置有更改,CLion会自动触发构建过程。 - 构建类型默认为`Debug`,这会启用编译器选项(如`-g`),生成带调试信息的二进制文件,包括调试版DLL(如`MyLibraryd.dll`)。此过程由**CMake构建系统**主导,CMake根据`CMakeLists.txt`文件中的配置生成构建脚本[^1]。 - 示例CMake配置: ```cmake add_library(MyLibrary SHARED src.cpp) # 定义共享库 set_target_properties(MyLibrary PROPERTIES DEBUG_POSTFIX "d") # 为调试版添加"d"后缀 ``` 这里,`DEBUG_POSTFIX "d"`确保调试版输出为`MyLibraryd.dll`。 #### 2. **编译和链接过程** - **编译器(如GCC或MSVC)**:实际生成DLL文件的核心组件。在调试模式下,编译器: - 添加调试符号(例如,Windows上的`.pdb`文件)。 - 优化级别降低(如`-O0`),以便调试器(如GDB)能跟踪变量和断点- 输出文件路径通常在`cmake-build-debug`或`cmake-build-debug`目录下。 - **构建工具(如Make或Ninja)**:由CMake生成的构建脚本(如`Makefile`)调用编译器执行编译和链接。链接器将对象文件(`.o`或`.obj`)合并为DLL。 - 整个过程遵循公式:$$ \text{源代码} \xrightarrow{\text{编译器}} \text{对象文件} \xrightarrow{\text{链接器}} \text{DLL文件} $$。 #### 3. **CLion的协调角色** - **IDE集成层**:CLion作为前端,协调整个流程: - 解析`CMakeLists.txt`,确定构建目标和类型(Debug/Release)。 - 调用CMake生成构建文件。 - 启动构建工具(如运行`make`或`ninja`)。 -调试会话中,CLion调试器组件(集成GDB或LLDB)加载生成的`d.dll`,并注入调试逻辑。 - **调试模式特殊性**:在调试运行时,CLion确保: - 优先使用`Debug`配置构建- 如果DLL依赖其他库,CLion会处理路径解析(如设置`PATH`环境变量包含`cmake-build-debug`),避免运行时缺失DLL的错误[^2][^3]。 #### 4. **生成文件的输出和验证** - 构建完成后,`d.dll`文件默认输出到`cmake-build-debug`目录(例如`cmake-build-debug\MyLibraryd.dll`)。 - CLion调试启动前自动验证文件完整性。如果构建失败(如语法错误),IDE会显示错误日志,中止调试会话。 - **性能考虑**:大型项目可能构建缓慢,建议在测试时使用小型项目验证机制[^1]。 #### 关键组件总结 | 组件 | 角色 | 输出示例 | |------|------|----------| | **CMake** | 配置构建规则,生成构建脚本 | `Makefile` | | **编译器(GCC/MSVC)** | 编译源代码,添加调试信息 | `.obj`文件 | | **链接器** | 合并对象文件为DLL | `MyLibraryd.dll` | | **CLion IDE** | 协调构建调试会话 | 管理路径和调试器 | 此机制确保了调试版DLL的生成与调试需求一致,如变量检查和断点支持。如果遇到问题(如缺失DLL),检查CMake配置和环境变量设置[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[email protected]

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值