精华内容
下载资源
问答
  • Debug宏

    2016-01-06 13:39:29
    #include #include #define DEBUG(args) printf args void Dbg(int level, const char *message, ...) { va_list l; if (level ) { return; } va_start(l, message); vp
    #include <stdio.h>
    #include <stdarg.h>
    
    #define DEBUG(args)  printf args
    
    ///
    
    void Dbg(int level, const char *message, ...)
    {
        va_list l;
    
        if (level < 2)
        {
            return;
        }
    
        va_start(l, message);
        vprintf(message, l);
        va_end(l);
    }
    
    #define DBG(arg) Dbg arg
    
    /
    
    void Dbg2(const char *message, ...)
    {
        va_list l;
    
        va_start(l, message);
        vprintf(message, l);
        va_end(l);
    }
    
    
    #define DBG2(level, line) \
        if (level < 2) {}       \
        else Dbg2 line
    
    #define LOGE2(line) DBG2(0, line) 
    
    int main(int argc, char **argv)
    {
        //v1
        DEBUG(("a%s\n", "b"));
    
        //v2
        Dbg(3, "a%s\n", "b");
        DBG((3, "a%s\n", "b"));
    
        //v3
        DBG2(3, ("a%s\n", "b"));
        LOGE2(("a%s\n", "b"));
        return 0;
    }
    


    
    
    展开全文
  • DEBUG宏

    2017-01-11 19:04:00
    (1)DEBUG宏大概的原理是: #ifdef DEBUG #define dbg() printf() #else #define dbg() #endif (2)工作方式是:如果我们要输出DEBUG版本则在条件编译语句前加上#define DEBUG即可,这样程序中的调试语句dbg()就会被...

    4.8.6.运算中的临时匿名变量
    4.8.6.1、C语言和汇编的区别(汇编完全对应机器操作,C对应逻辑操作)
    (1)C语言叫高级语言,汇编语言叫低级语言。
    (2)低级语言的意思是汇编语言和机器操作相对应,汇编语言只是CPU的机器码的助记符,用汇编语言写程序必须拥有机器的思维。因为不同的CPU设计时指令集差异很大,因此用汇编编程的差异很大。
    (3)高级语言(C语言)它对低级语言进行了封装(C语言的编译器来完成),给程序员提供了一个靠近人类思维的一些语法特征,人类不用过于考虑机器原理,而可以按照自己的逻辑原理来编程。譬如数组、结构体、指针····
    (4)更高级的语言如java、C#等只是进一步强化了C语言提供的人性化的操作界面语法,在易用性上、安全性上进行了提升。

    4.8.6.2、C语言的一些“小动作”
    (1)高级语言中有一些元素是机器中没有的
    (2)高级语言在运算中允许我们大跨度的运算。意思就是低级语言中需要好几步才能完成的一个运算,在高级语言中只要一步即可完成。譬如C语言中一个变量i要加1,在C中只需要i++即可,看起来只有一句代码。但实际上翻译到汇编阶段需要3步才能完成:第1步从内存中读取i到寄存器,第2步对寄存器中的i进行加1,第3步将加1后的i写回内存中的i。

    4.8.6.3、使用临时变量来理解强制类型转换

    4.8.6.4、使用临时变量来理解不同数据类型之间的运算


    4.8.7.顺序结构
    4.8.7.1、最浅显的顺序结构:三种结构之一
    (1)代码执行的时候如果没有遇到判断跳转或者循环,默认是顺序执行的。执行完上一句则开始执行下一句。
    (2)顺序结构说明CPU的工作状态,就是以时间轴来顺序执行所有的代码语句直到停机。

    4.8.7.2、选择和循环结构内部的顺序结构
    (1)譬如if(){}在{}内部是if的代码段,在代码段内部还是按照顺序结构来执行的。
    (2)switch case内部也一样,也是按照顺序结构执行的。
    (3)while for内部也是按照顺序结构来执行的。

    4.8.7.3、编译过程中的顺序结构
    (1)一个C程序有多个.c文件组成,编译的时候多个.c文件是独立分开编译的。每个c文件编译的时候,编译器是按照从前到后的顺序逐行进行编译的。
    (2)编译器编程时的顺序编译会导致函数/变量必须先定义/声明才能调用,这也是C语言中函数/变量声明的来源。
    (3)链接过程中呢?应该说链接过程链接器实际上是在链接脚本指导下完成的。所以链接时的.o文件的顺序是由链接脚本指定的。如果链接脚本中明确指定了顺序则会优先考虑这个规则按照这个指定的顺序排布,如果链接脚本中没有指定具体的顺序则链接器会自动的排布。

    4.8.7.4、思考:为什么本质都是顺序结构?
    (1)顺序结构本质上符号CPU的设计原理,CPU又是人设计的,所以CPU的设计符合人的思考原理

    debug宏的实现原理

    (1)DEBUG宏大概的原理是:
    #ifdef DEBUG
    #define dbg() printf()
    #else
    #define dbg()
    #endif
    (2)工作方式是:如果我们要输出DEBUG版本则在条件编译语句前加上#define DEBUG即可,这样程序中的调试语句dbg()就会被替换成printf从而输出;如果我们要输出RELEASE版本则去掉#define DEBUG,则dbg()就会被替换成空,则程序中所有的dbg()语句直接蒸发了,这样的程序编译时就会生成没有任何调试信息的代码。

    分析几个DEBUG宏
    (1)应用程序中DEBUG宏
    #ifdef DEBUG
    #define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)
    #else
    #define DBG(...)
    #endif

    注:__FILE__等是C语言中的预定义宏,就是说这个东西是个宏定义,但是是C语言自己定义的。这些宏具有特殊的含义,譬如__FILE__表示当前正在编译的c文件的文件名。

    (2)内核中的DEBUG宏
    #ifdef DEBUG_S3C_MEM
    #define DEBUG(fmt, args...) printk(fmt, ##args)
    #else
    #define DEBUG(fmt, args...) do {} while (0)
    #endif

     

    转载于:https://www.cnblogs.com/PengfeiSong/p/6274834.html

    展开全文
  • debug

    2013-10-17 12:19:02
    #ifdef DEBUG #define ASSERT(exp) \  do { \  if (!(exp)) {
    #ifdef DEBUG
    #define ASSERT(exp)                                                     \
            do {                                                            \
              if (!(exp)) {                                                 \
                fprintf(stderr, "[ASSERT!][%s:%s:%d]: %s\n",                \
                        __FILE__, __FUNCTION__, __LINE__, #exp);            \
                abort();                                                    \
              }                                                             \
            } while (0)
    #define ERROR(...)                                                      \
            {                                                               \
                fprintf(stderr, "[ERROR  ][%s:%s:%d] ",                     \
                        __FILE__, __FUNCTION__, __LINE__);                  \
                fprintf(stderr, __VA_ARGS__);                               \
            }
    #define WARNING(...)                                                    \
            {                                                               \
                fprintf(stderr, "[WARNING][%s:%s:%d] ",                     \
                        __FILE__, __FUNCTION__, __LINE__);                  \
                fprintf(stderr, __VA_ARGS__);                               \
            }
    #define INFO(...)                                                       \
            {                                                               \
                fprintf(stdout, "[INFO   ][%s:%s:%d] ",                     \
                        __FILE__, __FUNCTION__, __LINE__);                  \
                fprintf(stdout, __VA_ARGS__);                               \
            }
    #else
    #define ASSERT(exp)
    #define ERROR(...)
    #define WARNING(...)
    #define INFO(...)
    #endif
    
    
    
    转载:http://blog.chinaunix.net/uid-13701930-id-336575.html


    展开全文
  • 神秘的 _DEBUG 从何处来?原调试debugwindbgvsdllcrash崩溃全局变量缘起在上一篇文章 《调试实战 —— dll 加载失败之Debug Release争锋篇》中,由于两个工程中的 _ITERATOR_DEBUG_LEVEL 不同,导致了对同一个 map...

    神秘的 _DEBUG 宏从何处来?

    原调试debugwindbgvsdllcrash崩溃全局变量

    缘起

    在上一篇文章 《调试实战 —— dll 加载失败之Debug Release争锋篇》中,由于两个工程中的 _ITERATOR_DEBUG_LEVEL 不同,导致了对同一个 map 的解析不同,从而导致了崩溃。在示例代码中,我是手动更改的该宏的值,在实际工程中,却另有玄机。在上文中故意省略了这部分内容的介绍。现把实际工程的问题在本文中做个相对详细的梳理总结。

    先剧透一下:实际工程中的问题是因为一个工程中定义了 _DEBUG 宏,另外一个工程里没定义。但是我已经核对过,两个工程都没定义 _DEBUG 宏。其中一个工程的 _DEBUG 宏是从哪儿来的呢?

    测试工程简介

    为了查出 _DEBUG 宏从何而来,我特意建了一个超级简单的工程。只包含一个源文件,其内容如下:

    #ifdef _DEBUG

    #pragma message("---- _DEBUG defined.")

    #else

    #pragma message("---- _DEBUG NOT defined.")

    #endif

    int wmain(){

    return 0;

    }

    相信大家都知道,debug 会定义 _DEBUG 宏,而 release 不会定义 _DEBUG 宏。默认的 debug 和 release 中对应的 Preprocessor definition 配置对比如下图:

    preprocessor-definitions-comparation.png

    preprocessor-definitions-comparation

    最开始,我以为简单的删掉 _DEBUG 宏,编译的时候就不会有 _DEBUG 宏了。

    delete-_debug-macro.png

    删除 _DEBUG 宏

    没想到……

    顽强的 _DEBUG 宏

    再次编译的时候, _DEBUG 宏还是被定义了。

    compile-result.png

    compile-result

    误入歧途

    根据经验,工程配置可以直接存储在工程文件(后缀一般是 .vcxproj),也可以存储在 .props 文件中。在 TestDebugMacro.vcxproj 中搜索 _DEBUG 宏,一无所获!会不会存储在 .props 中呢?使用 File Locator 搜索关键字 _DEBUG,搜索条件如下图:

    search-_DEBUG-macro-in-props.png

    search-_DEBUG-macro-in-props

    只搜到了几条相关的记录,因为使用的是 vs2013,对应的版本号是 v120,所以只需要关注高亮的搜索记录。

    虽然,看上去不太可能,但是抱着试试看的心态,删除 Microsoft.Cpp.AppContainerApplication.props 第 104 行的 _DEBUG 宏,

    重新编译。结果, _DEBUG 宏,依然顽强的活着。这里就不截图了。

    会不会记录在注册表里呢?搜索一番,一无所获!

    肯定是记录到哪里了,应该不会动态生成吧?!

    继续搜索

    扩大搜索范围,在所有文件中搜索,经过排查,只有 cl.exe 中的记录比较靠谱。

    search-_DEBUG.png

    search-_DEBUG

    难道写死在 cl.exe 中了?有点儿不可思议。(文中暗表,确实写死在 cl.exe 中了。)

    顺着这条路已经找不到更多有价值的线索了,需要换个思路了。

    换个思路

    会不会是 vs 在编译的时候,根据某些条件自动添加的?为了排除这种情况,直接使用 msbuild.exe 进行构建操作(在 《全局变量初始化顺序探究》里已经介绍过了)。

    build-with-msbuild.png

    build-with-msbuild

    可以发现,直接使用 msbuild.exe 编译也会定义 _DEBUG 宏。可以把 vs 从怀疑名单中划掉了。

    注意看传递给 cl.exe 的参数(上图黄色高亮部分)中也没有 _DEBUG 宏的踪影。

    难道是 msbuild 通过进程通信手段实现的?(真佩服自己的脑洞)

    试试直接使用 cl.exe TestDebugMacro.cpp 编译。

    柳暗花明

    居然 _DEBUG 宏消失了!!!

    compile-with-cl.png

    compile-with-cl

    通过 msbuild.exe 启动的 cl.exe ,从日志可以发现 cl.exe 的参数如下:

    C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\CL.exe /c /ZI /nologo /W3 /WX- /Od /Oy- /D WIN32 /D _CONSOLE /D _LIB

    /D _UNICODE /D UNICODE /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Debug\\" /Fd"Debug\vc120.pdb" /Gd /TP

    /analyze- /errorReport:queue TestDebugMacro.cpp

    而手动执行的 cl.exe 只传递了需要编译的文件名。会不会是哪个神奇的参数搞的鬼呢?好办,二分法排查!

    经过几次尝试,很快定位到是 /MDd 搞得鬼!

    compare-cl-param.png

    compare-cl-param

    /MDd 选项是何方神圣?搜索一下,很快找到了微软官方的介绍。

    /MDd 选项

    官方文档很明确的描述到:/MDd 选项会定义 _DEBUG,_MT 和 _DLL ,并且会使用调试 版本的多线程运行时库。

    具体请介绍参考微软官方文档截图:

    mdd-option-msdn.png

    mdd-option-msdn

    贴一张工程属性设置截图。

    set-mdd-option-in-vs.png

    set-mdd-option-in-vs

    反思

    当时没有严格按照对比的思路进行排查,浪费了很多时间!

    很久之前确实对比过 /MDd 几种选项的不同,当时的关注点主要在于会链接不同的运行时库,忽略了对宏的影响。相信经过这次折腾,我永远也忘不了 /MDd 选项定义 _DEBUG 宏。这个行为不是通过配置文件发生的,而是写到了 cl.exe 的文件中!

    总结

    File Locator 真可谓文件内容搜索神器,经常排错的小伙伴儿必备!

    一种情况是正常,一种情况不正常,最简单粗暴有效的办法就是对比!

    排查问题时,我们要尽量简化问题,尽可能排除无关条件的干扰。

    /MDd 选项不仅会影响链接库,还会定义 _DEBUG 宏。

    参考资料

    展开全文
  • 【宏】【DEBUG宏

    2020-12-08 11:03:33
    debug宏的实现原理 (1)DEBUG宏大概的原理是: #ifdef DEBUG #define dbg() printf() #else #define dbg() #endif (2)工作方式是:如果我们要输出DEBUG版本则在条件编译语句前加上#define DEBUG即可,这样程序中...
  • 通过DEBUG宏定义切换debug与release模式
  • LINUX下DEBUG宏

    2020-07-23 18:56:32
    linux下DEBUG宏使用方法: #define DEBUG #ifdef DEBUG #define debug(...) { fprintf(stderr,"[debug][%s:%s:%d] ",)\ __FILE__,__FUNCTION__,__LINE__); \ fprintf(stderr,__VA_ARGS__); } #else #defin
  • Makefile中关闭DEBUG宏

    千次阅读 2018-09-07 11:24:14
    我在头文件中定义了DEBUG宏,并没有去开启它,但是在编译运行后却打印出来了! 原因是Makefile中的编译参数开启了DEBUG,原来还有这样的操作!Makefile我也是使用的模板,长见识了。 解决办法是在这里把DEBUG...
  • Linux下Debug版不会自动添加 _DEBUG宏,只有NDEBUG宏可用。cmake ../src _DCMAKE_BUILD_TYPE=Debug -D_DEBUG会报错: -D_DEBUG should be: VAR:type=value需要-D_DEBUG=1.改为在CMakeLists.txt中添加:if (CMAKE_...
  • 前言 这是 N 年前遇到的一个问题了。最近跟 DEBUG 对着干上了,正好翻到这篇总结 —— 记录了使用 pragma message 排查 同一个工程不同 CPP 中 DEBUG ...
  • 最近跟 DEBUG 对着干上了,正好翻到这篇总结 —— 记录了使用 pragma message 排查 同一个工程不同 CPP 中 DEBUG 的值不同的过程。现对之前的总结做了更新整理,分享给各位小伙伴儿。pragma message使用 #pragma...
  • 诡异的_DEBUG宏

    2015-11-08 22:40:00
    学习VLD1.0代码,发现Release版本的代码_DEBUG宏是已定义的,查找工程配置确只有NDEBUG宏的定义,不见_DEBUG的踪影。 好吧,最后发现是由于工程Code Generation选项使用的Debug的RT库,其就相当于定义_DEBUG宏。...
  • iOS-#ifdef DEBUG宏定义介绍 一.#ifdef DEBUG代码块 #ifdef DEBUG // Debug模式的代码... #else // Release模式的代码... #endif
  • 根据rL332240提交的申请,LLVM的DEBUG宏将更名为LLVM_DEBUG,原因是为了避免其他工程出现问题。在转换期间,DEBUG宏作为别名依然可以使用。这个更改虽然谈不上什么有技术含量的更新,只是一个更名,但是这个更名却对...
  • 整理自 iOS-#ifdef DEBUG宏定义介绍 代码块结构 #ifdef DEBUG // Debug模式的代码... #else // Release模式的代码... #endif debug 和 release 的区别 debug:调试版本,主要是让程序员使用。在调试的过程中...
  • 使用 DEBUG 屏蔽调试信息

    千次阅读 2014-05-29 16:30:28
    使用 DEBUG 控制调试信息的输出
  • CMake添加-D_DEBUG宏

    万次阅读 2013-07-26 16:31:28
    Linux下Debug版不会自动添加 _DEBUG宏,只有NDEBUG宏可用。cmake ../src _DCMAKE_BUILD_TYPE=Debug -D_DEBUG会报错: -D_DEBUG should be: VAR:type=value需要-D_DEBUG=1.改为在CMakeLists.txt中添加:if (CMAKE_...
  • Directx11教程(11) 增加一个debug宏 原文:Directx11教程(11) 增加一个debug宏 现在我们在common.h中增加一个debug的宏,在每个d3d11函数后调用,如果d3d函数出错,它能够给出程序中错误的代码行数。 ...
  • 一、NDEBUG 和DEBUG宏的用法 1、NDEBUG宏是Standard C中定义的宏,专门用来控制assert()的行为。如果定义了这个宏,则assert不会起作用。 #ifdef NDEBUG #define assert(x) ((void)0) #else ... 2、C Standard中...
  • linuxC debug宏

    2021-03-11 14:36:48
    #ifndef DEBUG #define DEBUG #undef DEBUG #ifdef DEBUG #define debugf(fmt, args...) do { printf("%s(): ", __func__); printf(fmt, ##args); } while (0) #else #define debugf(fmt, args...) #endif #endif
  • 在程序开头添加如下DEBUG宏: #define __DEBUG__ #ifdef __DEBUG__ #define DEBUG(format,...) printf("File: "__FILE__", Line: %05d: "format"/n", __LINE__, ##__VA_ARGS__) ...
  • 源链接:https://viktyz.gitbooks.io/iosnotebook-gitbook/Notes/Note_00176_20160426.html方案名称Xcode - 在 Xcode 里添加和使用 Debug 定义关键字Xcode \ Debug 模式 \ 定义需求场景需要为工程设置仅在 Debug...
  • debug宏作为调试开关在写程序时,为了调试,经常需要加一些输出语句,等调试完成又得注释掉,如果下次还需要调试还得解注释,十分费时费力,为了解决这个麻烦,可以定义一个debug宏作为调试输出的开关。如下面代码所...
  • 今天在做关于Linux的一个小项目,其中要用到debug宏,我在百度上找到相关C语言定义,然后移植到该项目工程中的一个H文件中,该项目有很多C文件,都需要用到此宏,因为我的宏定义在一个头文件中,故我只需在需要用到的...
  • DEBUG宏控制一些调试输出 方法: #include <syslog.h> #ifdef DEBUG #define DBG_INFO(s, a...) syslog(LOG_DAEMON | LOG_INFO, (s), ##a) #define DBG_ERROR(s, a...) syslog(LOG_DAEMON | LOG_ERR,...
  • debug宏定义语句

    2020-01-06 11:14:56
    几天发现了一个大佬使用的debug方法,很好,记录在这里 #include<iostream> using namespace std; #define debug printf("Now is %d\n", __LINE__); #line 59 int main() { debug } 这个语句会返回输出当...
  • 调试用的debug宏,更新。可以显示你debug所在的文件名,函数名,行号。例子里使用的是基于printf函数来做。纯c代码,不多说了,直接上源码: //t.c #include #define MYDEBUG #ifdef MYDEBUG #define myDebug...
  • 某些debug宏

    千次阅读 2013-11-17 18:03:53
    条件编译debug、release版本 微软的编译器定义 _DEBUG 作为debug版本 gcc 定义 DEBUG 作为debug版本。xcode使用gcc,所以也是定义DEBUG,将工程模式设为Debug可以看到GCC_PREPROCESSOR_DEFINITIONS这个变量定义...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,166
精华内容 1,266
关键字:

debug宏