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
标记,使用可以用一个单独的命令重新编译代码并插入调试信息