Linux Kernel Source - __FILE__ __LINE__ 妙用
来源:互联网 发布:windows批处理命令 编辑:程序博客网 时间:2024/06/14 17:46
在Linux 2.4内核代码wait.h,看到如下定义
#define WQ_BUG() BUG()
其中BUG()是在page.h中定义的,定义如下:
#define BUG() do { printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); *(int *)0=0; } while (0)
看到这句,我就纳闷了printk打印出错的文件名和行号,那么*(int *)0=0;是做什么用的呢?写一个小程序你就知道了:
dance@dance-desktop:~/testc/bug$ cat bug.c #include <stdio.h>int main(void){ //printf("kernel BUG at %s:%d!\n", __FILE__, __LINE__); *(int *)0=0; return 0;}dance@dance-desktop:~/testc/bug$ gcc bug.c dance@dance-desktop:~/testc/bug$ ./a.out Segmentation faultdance@dance-desktop:~/testc/bug$
看到上面的demo相信你已经知道了*(int *)0=0;会产生Segmentation fault错误,事实上任何向(int *)0进行写操作都会产生Segmentation fault错误。
此时我们将printf哪行的注释去掉,演示如下:
dance@dance-desktop:~/testc/bug$ cat bug.c #include <stdio.h>int main(void){ printf("kernel BUG at %s:%d!\n", __FILE__, __LINE__); *(int *)0=0; return 0;}dance@dance-desktop:~/testc/bug$ gcc bug.c dance@dance-desktop:~/testc/bug$ ./a.out kernel BUG at bug.c:4! //打印出了出错文件名和行号 Segmentation faultdance@dance-desktop:~/testc/bug$总结:
当我们遇到需要打印调试信息的时候__FILE__ __LINE__和文章开头定义的两个宏是不错的选则,例如在遇到空指针时:
Linux 2.4 wait.hstatic inline void init_waitqueue_head(wait_queue_head_t *q){#if WAITQUEUE_DEBUGif (!q) // Notice HereWQ_BUG();#endifq->lock = WAITQUEUE_RW_LOCK_UNLOCKED;INIT_LIST_HEAD(&q->task_list);#if WAITQUEUE_DEBUGq->__magic = (long)&q->__magic;q->__creator = (long)current_text_addr();#endif}
- Linux Kernel Source - __FILE__ __LINE__ 妙用
- __FILE__,__LINE__,__FUNCTION__的妙用
- linux driver: __FILE__, __FUNCTION__, __LINE__
- __FILE__,__LINE__
- __FILE__ __LINE__
- __FILE__, __LINE__,
- __FILE__、__LINE__
- __FILE__,__LINE__
- __FILE__,__LINE__
- __FILE__,__LINE__
- __FILE__,__LINE__
- __FILE__,__LINE__
- __FILE__,__LINE__
- __FILE__,__LINE__
- __FILE__,__LINE__
- __FILE__,__LINE__
- __FILE__,__LINE__
- __FILE__,__LINE__
- 用户只可输入整数 并求出它们的乘积
- 第一周:项目3 学生成绩的结构体数组(包括学号、姓名、三门课成绩、总分、均分)
- chrome、firefox等浏览器下使用“发送到onenote”
- php5与mysql5 web 开发技术详解-8 php国际化与本地化
- 树莓派制作廉价AirPlay
- Linux Kernel Source - __FILE__ __LINE__ 妙用
- 很奇怪CSDN为什么不能提供HTTPS访问
- IT网站收集
- Java中唯一一个重载过的操作符+
- jQuery+ajax+servlet实现4级联动
- 亚里士多德的名言
- Linux Glibc(学习笔记四)
- Android如何获取Wifi名称即SSID
- 二分查找 12年的bug