全栈的我技术贴

C/C++ 调试技巧

2014-06-14  本文已影响484人  Amrzs

C/C++ 调试技巧

from my csdn blog

调试宏

assert()

参数为一个断言为真的表达式,如果断言不为真,则发出一个错误信息告诉断言是什么并且程序终止。

#include <iostream>
#include <cassert>

using namespace std;

int main(){

    int i = 100;
    assert(i != 100);
    cout << i << endl;

    return 0;
}
amrzs@ubuntu:cc$ g++ main.cpp
amrzs@ubuntu:cc$ ./a.out 
a.out: main.cpp:11: int main(): Assertion `i != 100' failed.
已放弃 (核心已转储) 

消除宏代码

#include<cassert>之前插入#define NDEBUG

或者在编译器命令行中定义ndebug,可以消除宏产生的代码

#include <iostream>

#define NDEBUG
#include <cassert>

using namespace std;

int main(){

    int i = 100;
    assert(i != 100);
    cout << i << endl;

    return 0;
}
amrzs@ubuntu:cc$ g++ main.cpp
amrzs@ubuntu:cc$ ./a.out 
100

变量字符串转换宏

变量表达式转换为字符串

在一个预处理器的宏中的参数前面使用一个#,预处理器会把这个参数转换成一个字符数组

#define P(A) cout << #A << ": " << (A) << endl;

当不想调试时,也可以插入一个#ifdef使得定义的P(A)不起作用。

调试标记:预处理器调试标记 和 运行期调试标记

常用的标记名为DEBUG(不能使用NDEBUG,是C中的保留字)

#define DEBUG
//...
#ifdef DEBUG 
//...debugging code 
#endif // DEBUG

C/C++还允许在编译器的命令行中使用#define#undef标记,使用可以用一个单独的命令重新编译代码并插入调试信息

上一篇下一篇

猜你喜欢

热点阅读