一. 介绍
data breakpoint是一种特殊的断电,在处理检查到预设地址的值发生R/W操作时,发生断点中断。
二. 使用方法1
kernel有示例代码,在data_breakpoint.c中,在这里,kernel检查的是symbol的值发生变化,但是实际上测试发现直接使用寄存器地址也是可以的。
看看.config里面,CONFIG_SAMPLES是否选中。
位置在Kernel Hacking/Sample kernel code。
samples目录好像不在缺省编译的范围内,自己手动编译就行了。
make M=samples即可。
aarch32 linux4.9
kernel 有breakpoint的编码实例data_breakpoint.c
相关函数:
register_wide_hw_breakpoint //kernel space 地址
register_user_hw_breakpoint //user space 地址
breakpoint 与 watchpoint 的原理需要查阅armv7_architecture_reference_manual
watchpoint:If the cause of the debug exception is a Watchpoint debug event, then a Data Abort exception is generated
————————————————
版权声明:本文为CSDN博主「shenhuxi_yu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shenhuxi_yu/article/details/83155106
/*
#include <linux/perf_event.h>
#include <linux/hw_breakpoint.h>
struct perf_event * __percpu *sample_hbp;
static char ksym_name[KSYM_NAME_LEN] = “pid_max”;
module_param_string(ksym, ksym_name, KSYM_NAME_LEN, S_IRUGO);
MODULE_PARM_DESC(ksym, “Kernel symbol to monitor; this module will report any”
" write operations on the kernel symbol");
static void sample_hbp_handler(struct perf_event *bp,
struct perf_sample_data *data,
struct pt_regs *regs)
{
printk(KERN_INFO “%s value is changed\n”, ksym_name);
dump_stack();
printk(KERN_INFO “Dump stack from sample_hbp_handler\n”);
}
static int __init hw_break_module_init(void)
{
int ret;
struct perf_event_attr attr;
hw_breakpoint_init(&attr);
attr.bp_addr = kallsyms_lookup_name(ksym_name);
attr.bp_len = HW_BREAKPOINT_LEN_4;
attr.bp_type = HW_BREAKPOINT_W | HW_BREAKPOINT_R;
sample_hbp = register_wide_hw_breakpoint(&attr, sample_hbp_handler, NULL);
if (IS_ERR((void __force *)sample_hbp)) {
ret = PTR_ERR((void __force *)sample_hbp);
goto fail;
}
printk(KERN_INFO "HW Breakpoint for %s write installed\n", ksym_name);
return 0;
fail:
printk(KERN_INFO “Breakpoint registration failed\n”);
return ret;
}
static void __exit hw_break_module_exit(void)
{
unregister_wide_hw_breakpoint(sample_hbp);
printk(KERN_INFO “HW Breakpoint for %s write uninstalled\n”, ksym_name);
}
module_init(hw_break_module_init);
module_exit(hw_break_module_exit);
MODULE_LICENSE(“GPL”);
MODULE_AUTHOR(“K.Prasad”);
MODULE_DESCRIPTION(“ksym breakpoint”);
三. 使用方法2
上面是使用kernel的hw_breakpoint走watchpoint来注册的,实际上这里有一层封装,我们直接使用arch/arm下面的hw_breakpoint也是可以的。
这里直接给代码链接了:https://elixir.bootlin.com/linux/v4.6/source/arch/arm/kernel/hw_breakpoint.c
有很多操作寄存器的地方,比较底层了,不过便于理解。
三. 使用方法2
上面是使用kernel的hw_breakpoint走watchpoint来注册的,实际上这里有一层封装,我们直接使用arch/arm下面的hw_breakpoint也是可以的。
这里直接给代码链接了:https://elixir.bootlin.com/linux/v4.6/source/arch/arm/kernel/hw_breakpoint.c
有很多操作寄存器的地方,比较底层了,不过便于理解。
四. 第一种方法的结果
pid_max value is changed
CPU: 2 PID: 439 Comm: kworker/u8:3 Tainted: P W O 4.19.166 #2
Hardware name: xxxx (DT)
Workqueue: events_unbound call_usermodehelper_exec_work
Call trace:
dump_backtrace+0x0/0x164
show_stack+0x20/0x2c
dump_stack+0xb8/0xf0
sample_hbp_handler+0x28/0x3c [data_breakpoint]
__perf_event_overflow+0x94/0xe0
perf_swevent_event+0x98/0x104
perf_bp_event+0x6c/0x98
watchpoint_report+0x80/0x94
watchpoint_handler+0x100/0x208
do_debug_exception+0xe8/0x174
el1_dbg+0x18/0xa8
alloc_pid+0x80/0x284
copy_process+0xb48/0x1960
_do_fork+0xa0/0x434
kernel_thread+0x40/0x50
call_usermodehelper_exec_work+0x40/0xd8
process_one_work+0x210/0x3e8
worker_thread+0x228/0x3c4
kthread+0x13c/0x14c
ret_from_fork+0x10/0x18
Dump stack from sample_hbp_handler
六. 注意的地方
data breakpoint不同于breakpoint,发生异常后,因为寄存器中的值不会被清除,所以会一直循环中断
一般的,我们通过调用单步执行,并且清掉异常寄存器的值,让程序可以继续执行,这样在下次发生异常的时候还可以继续进入data watchpoint
一、软通动力面试笔答 1.白箱测试和黑箱测试是什么?什么是回归测试? 2.单元测试、集成测试、系统测试的侧重点是什么? 单元测试的重点是系统的模块,包括子程序的正确性验证等。 集成测试的重点是模块间的衔接以及参数的传递等。 系统测试的重点是整个系统的运行以及与其他软件的兼容性。 3.设计用例的方法、依据有那些? 白盒测试用例设计有如下方法:基本路径测试\...
程序中每隔3秒读取文件内容,显示并写入另一个文件,同时,写入时间戳!#include <stdio.h>#include <time.h>#include <unistd.h>#include <errno.h>#include <stdlib.h>#include <string.h>#include <windows.h>#define N 64int main(int argc, char **arg
基本概念Docker 包括三个基本概念镜像(Image)容器(Container)仓库(Repository)先理解了这三个概念,就理解了 Docker 的整个生命周期。1、docker安装与启动yum install -y epel-releaseyum install docker-io # 安装docker# 配置文件 /etc/sysconfig/dockerchkconfig
存储-ISCSI简介:由于SAN技术是基于光环境实现的存储;ISCSI是将数据块映射成以太网数据包,从而实现IP协议上运行的指令集。将SCSI数据块映射成以太网数据包。在centos7环境部署iscsi:实验1:1个导出端,1个导入端角色IPstorage172.16.0.50node1172.16.0.51准备工作要完成。1. 配置存储端[ro...
前提是知道非终端结点(分支结点)的个数,假设非终端结点的个数为n1.对于树转二叉树:因为转化规则是“左孩子右兄弟”,如果有n个分支结点,因为每个分支结点都会有孩子,这些孩子都是兄弟,然而最右边的孩子已经没有右兄弟了,没有右兄弟就意味着在转化为二叉树后这个孩子没有右孩子——即右指针域为空。又因为每个分支结点都存在一个没有右兄弟的孩子,所以n个分支结点就存在n个没有右兄弟的孩子,在转化为二叉树后这些孩子的右指针域都为空。最后,不要忘记树的根结点是没有兄弟的,所有在转化为二叉树后根结点的右指针域也
摘要本文主要介绍张量(Tensor)相关技术以及张量在数据恢复(missing data)、推荐中的应用。在文章的最后,简单介绍怎么通过ADMM算法吧把张量应用在大规模数据上。文章的内容来自于葛瀚骋博士、现任美国亚马逊资深科学家。我们现在所处的时代是一个信息爆炸的时代,许多现代的信息系统,比如物联网,电子健康记录,以及社交网络,每天都在不断产生着新的数据,这些数据是以指数级的方式去增长的。它的特点...
记录关于获取宽高以及距离父元素距离的方法记录原因,在拖动的时候经常会使用到距离父元素的距离,以及宽高等一些方法。offsetWidth,offsetHeight,offsetTop,offsetLeft等相关属性。关于offsetWidth和offsetHight 、 offsetTop和offsetLeft关于clientWidth和clientHeigh 、 clientTop和clientL...
使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析使用搜索引擎计数构建快速、高效和可扩展的数据驱动应用程序Apache Lucene 和 Solr 是强大的开源搜索技术,使组织能够轻松地显著增强数据访问。借助 4.x 版的 Lucene 和 Solr,向数据驱动应用程序中添加可扩展的搜索功能变得比以往更加轻松。Lucene 和 Solr 提交者 G...
【安装工具】 JDK Eclipse 或直接下一个 ADT集成开发工具 SDK NDK9r ADT CDT 安装方法自行百度。【正文】 1、由 Cocos2D-X 和 VS2010 环境配置——1 中提到的python方法,创建新项目。 然后将你开发好的win项目相应的文件Classes和R...
1. 使用Dockerfile构建微服务镜像1. 打包微服务1、使用maven把eureka服务打包为 ***.jar 包2、上传jar到linux 文件目录下 例如:/usr/local/micro2. 创建Dockerfile文件添加如下内容FROM java:8 VOLUME /usr/local/docker/microADD eurekaser...