Linux内核调试方法总结之调试宏
本文介绍的内核调试宏属于静态调试方法,通过调试宏主动触发oops从而打印出函数调用栈信息。
1) BUG_ON 查看bug处堆栈内容,主动制造oops
Linux中BUG_ON,WARN_ON用于调试,比如
#define BUG_ON(condition) do { /
if (unlikely((condition)!=0)) /
BUG(); /
} while(0)
如果觉得该condition下是一个BUG,可以添加此调试信息,查看对应堆栈内容
具体的BUG_ON最终调用__bug
__bug
{
*(int*)0=0;
}
从而地址非法访问,例如在你的驱动中调用BUG_ON(1),dmesg会出现下面类似信息:
[ 19.360000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 19.360000] pgd = c0004000
[ 19.360000] [00000000] *pgd=00000000
函数的调用流程为
fault.c
__do_kernel_fault--------[ 19.360000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
traps.c
die--->__die--->__show_regs / dump_mem
2) WARN_ON 调用dump_stack打印堆栈信息,不会oops
#define WARN_ON(condition) do{/
if(unlikely((condition) != 0)) {/
printk(“Badness in %s at %s:%d\n”, __FUNCTION__, __FILE__, __LINE__);/
dump_stack();/
}
}while(0)
3) BUILD_BUG_ON 编译调试宏
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
BUILD_BUG_ON宏中的condition如果为真就会报错。假设条件为真,则BUILD_BUG_ON变化为:(void) sizeof (char[-1]),这种语法是在难理解,因为char[-1]本来就是非法的。结果导致编译错误。
例子:
#define condition 0
static int __init main_init(void)
{
printk("in %s function\n", __func__);
BUILD_BUG_ON(condition);/*if the macro "confition" is not zero, the program can not be compiled to success. so the BUILD_BUG_ON used for the build of program*/
WARN_ON(!condition);/*if the macro "confition" is not zero, there will dump the satck information for this program. so the WARN_ON used for debugof program*/
BUG_ON(condition); /*if the macro "confition" is not zero, The kernel will occur an Oops errro "Unable to handle kernel NULL pointer dereference at virtual address 00000000". so the BUG_ON used for ending the bug program*/
return 0;
}
Linux内核调试方法总结之调试宏的更多相关文章
- Linux内核中的fastcall和asmlinkage宏
代码中看见:#define _fastcall 所以了解下fastcall -------------------------------------------------------------- ...
- Linux内核配置编译及基本调试方法
一.Linux内核配置编译 1. 交叉编译设置:make ARCH=arm CROSS_COMPILE=arm-linux- 注:也可以直接修改顶层Makefile ARCH ?= arm CROSS ...
- Linux内核分析——第十八章 调试
第十八章 调试 18.1 准备开始 1.在用户级的程序里,bug表现比较直接:在内核中却不清晰. 2.内核级开发的调试工作远比用户级开发艰难的多. 3.准备工作需要的是: (1)一个bug (2 ...
- Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动
姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/a ...
- Linux内核分析方法谈
本文来自 http://blog.csdn.net/ouyang_linux007/article/details/7422346 Linux的最大的好处之一就是它的源码公开.同时,公开的核心源码也吸 ...
- Linux 内核预备知识:浅析 offsetof 宏以及新手的所思所想
最近一头扎进了 Linux 内核的学习中,对于我这样一个没什么 C 语言基础的新生代 Java 农民工来说实在太痛苦了.Linux 内核的学习,需要的基础知识太多太多了:C 语言.汇编语言.数据结构与 ...
- 使用yum更新时不升级Linux内核的方法
RedHat/CentOS/Fedora使用 yum update 更新时,默认会 升级内核 .但有些服务器硬件(特别是组装的机器)在升级内核后,新的内核可能会认不出某些硬件,要重新安装驱动,很麻烦. ...
- 分享几个日常调试方法让js调试更简单
下面分享几个日常调试代码的时候在Console命令行显示你的操作,让你的js调试更简单. console显示信息的命令 在浏览器按f12在console上显示你的文本. <!DOCTYPE ht ...
- Linux内核中_IO,_IOR,_IOW,_IOWR宏的用法与解析【转】
转自:http://blog.csdn.net/hzn407487204/article/details/7995041 在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设 ...
随机推荐
- mui前端框架下拉刷新分页加载数据
前台 mui.init(); (function($) { //阻尼系数 var deceleration = mui.os.ios?0.003:0.0009; $('.mui-scroll-wrap ...
- Django @csrf_exempt不适用于基于通用视图的类(Django @csrf_exempt does not work on generic view based class)
class ChromeLoginView(View): def get(self, request): return JsonResponse({'status': request.user.is_ ...
- Let's encrypt 通配域名DNS验证方式的证书自动更新
通配符域名不同于一般的单域名证书. 为了解决之前一篇短文中通配域名通过DNS方式验证的证书自动更新问题. 需要使用到第三方域名提供商的API, 用于自动添加域名的TXT记录, 实现自动验证并完成证书更 ...
- 基于 Redux + Redux Persist 进行状态管理的 Flutter 应用示例
好久没在 SegmentFault 写东西,唉,也不知道 是忙还是懒,以后有时间 再慢慢写起来吧,最近开始学点新东西,有的写了,个人博客跟这里同步. 一直都在自己的 React Native 应用中使 ...
- wordpress添加自定义菜单栏
1. 以下代码是wordpress的wp_nav_menu(); <?php $defaults = array( 'container'=>false, //父级div为空 'link_ ...
- Vue 变量,成员,属性监听
Vue变量 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF ...
- [七月挑选]IntelliJ IDEA常用设置
title: IntelliJ IDEA常用设置 设置idea的类注释快捷键 File -> Settings -> Live Templates 1.右边的 + -> Templa ...
- Nginx 配置状态信息虚拟主机
可以在浏览器中查看并发数量 [root@Liangenyu conf]# vim nginx.conf server { listen 80; server_name status.etiantian ...
- Windows 开启 winrm
# Windows 开启 winrm ``` Enable-PSRemoting winrm enumerate winrm/config/listener winrm quickconf ...
- [转]走近0day
首先,需要大家端正一下学习态度-也就是对于破解的态度.每一个有一定修为的软件破解者,也就是CRACKER,都很清楚,我们破解掉软件的序列号,功能限制,时间限制等等东西都不是最终的目的,一个真正的CRA ...