C语言中的debug调试宏

本文介绍了一种自定义的调试宏实现方法,通过设置不同的调试级别,可以在代码中方便地插入不同等级的调试信息输出,有助于定位和解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

综合了网上能找到的几个版本,我自己改写了如下的调试宏。

 

#ifndef MYDEBUG
#define MYDEBUG
#endif

#define MYDEBUG_PREFIX "--Hank Gong--"

//Debug information verbosity: lower values indicate higher urgency
#define MYDEBUG_OFF 0
#define MYDEBUG_ERR 1
#define MYDEBUG_WRN 2
#define MYDEBUG_TRC 3
#define MYDEBUG_INF 4

extern int MYDEBUG_LEVEL;

#define mydebug_off(msg...) \
do{ \
    if (MYDEBUG_LEVEL>=MYDEBUG_OFF) { \
        printf(MYDEBUG_PREFIX msg); \
    } \
 }while(0)
            
#define mydebug_err(msg...) \
do{ \
    if (MYDEBUG_LEVEL>=MYDEBUG_ERR) { \
        printf(MYDEBUG_PREFIX msg); \
    } \
 }while(0)

#define mydebug_wrn(msg...) \
do{ \
    if (MYDEBUG_LEVEL>=MYDEBUG_WRN) { \
        printf(MYDEBUG_PREFIX msg); \
    } \
 }while(0)

#define mydebug_trc(msg...) \
do{ \
    if (MYDEBUG_LEVEL>=MYDEBUG_TRC) { \
        printf(MYDEBUG_PREFIX msg); \
    } \
 }while(0)

#define mydebug_inf(msg...) \
do{ \
    if (MYDEBUG_LEVEL>=MYDEBUG_INF) { \
        printf(MYDEBUG_PREFIX msg); \
    } \
 }while(0)

#define mydebug(level, msg...) mydebug_##level(msg)

#undef assert
#define assert(x) { \
    if (!(x)) { \
        printf(__FILE__ ":%d assert " #x " failed\n", __LINE__);    \
    }\
}


//Usage:
//just include this file and define MYDEBUG_LEVEL like
//
//int MYDEBUG_LEVEL=MYDEBUG_ERR
//
//in the program use the command by
//mydebug(off|err|wrn|trc|inf, "test %d with %s", 100, "this");
### C语言 Debug 调试方法与断点使用教程 #### 什么是调试调试是在软件开发过程中用于识别、定位并解决程序错误或缺陷的技术。它通过逐步执行代码和分析程序的行为来帮助开发者找到潜在的问题[^1]。 #### 基本概念 在C语言中,调试通常涉及以下几个方面: - **逐步执行代码**:逐行运行程序以便观察每一步的状态变化。 - **变量监控**:实时查看特定变量的值及其变化情况。 - **断点设置**:指定某些位置暂停程序运行以深入检查逻辑。 #### 如何启用调试模式? 为了支持更全面的功能,在编译阶段可以定义 `_DEBUG` ,这相当于开启了一个特殊的调试环境,允许 `assert()` 函数发挥作用[^3]: ```bash gcc -g your_program.c -o your_program /D "_DEBUG" ``` 这里的 `-g` 参数告诉编译器生成额外的信息供调试工具使用;而 `/D "_DEBUG"` 则手动启用了定义。 #### 使用IDE进行调试 (以Visual Studio为例) 对于初学者来说,集成开发环境(IDE)提供了直观易用的界面来进行复杂的操作。以下是基于 Visual Studio 的具体步骤说明[^4]: 1. 打开项目文件; 2. 在目标语句前点击左侧空白区域或者按快捷键 F9 来插入断点; 3. 启动调试会话(F5 键启动应用程序直到遇到第一个断点为止); 4. 当到达某个断点时,可以通过窗口面板查看当前栈帧内的局部变量、全局变量等内容; 5. 双击某一行号可移除已存在的断点; 6. 如果需要进一步研究底层实现细节,则可以选择进入反汇编视图选项卡。 #### 关于断点的具体行为解释 当设置了断点之后,即使该处存在条件判断或者其他控制流结构也不会影响其触发时机——只要正常流程能够触及到此行代码就会停止下来等待下一步指令输入[^5]。因此合理安排这些特殊标记非常重要! --- ### 示例代码展示 下面给出一段简单的例子演示如何利用上述提到的知识点完成基本的任务需求: 假设我们有如下源码片段: ```c #include <stdio.h> int main() { int a = 10; int b = 0; // 故意制造零除异常 printf("Result:%d\n",a/b); return 0; } ``` 此时如果尝试直接运行这段程序很可能会崩溃退出。那么现在让我们借助之前学到的内容去排查问题所在吧! 首先确保已经按照前面描述的方式开启了相应的配置项(-g参数),接着加载进对应的编辑平台后分别在这两处添加好相应类型的中断标志位即可开始探索之旅啦~ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值