KDB支持单步调试功能(ARM架构)
0
实践发现KDB不支持step调试功能 (本文针对的是arm CotexA9架构,各种架构的实现方式不一样,
X86的好像已经支持,不过本人没有验证过)
1
首先看下要调试的代码段
1.1 C语言
int testPara_7(int a, int b,int c,int d, int e,int f,int g)
{
printk(KERN_ERR “hit one \n”);
printk(KERN_ERR “hit two \n”);
printk(KERN_ERR “hit three \n”);
printk(KERN_ERR “hit four \n”);
return 3;
}
1.2 对应的汇编语言 (objdump -d vmlinux)
c0339bf8 <testPara_7>:
c0339bf8: e1a0c00d mov ip, sp
c0339bfc: e92dd800 push {fp, ip, lr, pc}
c0339c00: e24cb004 sub fp, ip, #4 ; 0×4
c0339c04: e59f0020 ldr r0, [pc, #32] ; c0339c2c <testPara_7+0×34>
c0339c08: eb05bbef bl c04a8bcc <printk>
c0339c0c: e59f001c ldr r0, [pc, #28] ; c0339c30 <testPara_7+0×38>
c0339c10: eb05bbed bl c04a8bcc <printk>
c0339c14: e59f0018 ldr r0, [pc, #24] ; c0339c34 <testPara_7+0×3c>
c0339c18: eb05bbeb bl c04a8bcc <printk>
c0339c1c: e59f0014 ldr r0, [pc, #20] ; c0339c38 <testPara_7+0×40>
c0339c20: eb05bbe9 bl c04a8bcc <printk>
c0339c24: e3a00003 mov r0, #3 ; 0×3
c0339c28: e89da800 ldm sp, {fp, sp, pc}
c0339c2c: c060bd96 .word 0xc060bd96
c0339c30: c060bda3 .word 0xc060bda3
c0339c34: c060bdb0 .word 0xc060bdb0
c0339c38: c060bdbf .word 0xc060bdbf
3
通过分析汇编发现指令的地址都是以4的步长递增的,这种情况就比较号解决了,
不用去根据不同的汇编指令,改变PC的值。而只需要简单的PC=PC+4即可。
4
在Debug_core.c 增加函数如下:
并在头文件中声明: extern void do_my_step(unsigned long addr);
void do_my_step(unsigned long addr)
{
int i=0;
for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++)
{
if (kgdb_break[i].bpt_addr != addr)
continue;
//找到地址相匹配的,修改其地址值
kgdb_break[i].bpt_addr=kgdb_break[i].bpt_addr+4;
kgdb_break[i].state = BP_SET;
printk(KERN_ERR “i is %d kgdb_break[i].bpt_addr is %p\r\n”,i, kgdb_break[i].bpt_addr);
break;
}
}
5 修改 kdb_bp.c 中的 kdb_handle_bp 函数如下:
static void kdb_handle_bp(struct pt_regs *regs, kdb_bp_t *bp)
{
if (KDB_DEBUG(BP))
kdb_printf(“regs->ip = 0x%lx\n”, instruction_pointer(regs));
//此处是新增的调用单步实现函数
do_my_step(instruction_pointer(regs));
/*
* Setup single step
*/
kdb_setsinglestep(regs);
/*
* Reset delay attribute
*/
bp->bp_delay = 0;
bp->bp_delayed = 1;
}
6
实际应用,进入kdb模式后 ,(echo g > /proc/sysrq-trigger)
输入ss即可实现单步模式(汇编级别的):
kdb>bp c0339bf8 (在testPara_7函数处设置一个断点)
kdb>go
之后kernel运行到此函数,系统进入KDB模式,就可以进行单步调试
kdb>ss
….
与预想的一致,按两次ss即可打印出一条语句:(可通过串口及minicom观察)
如: hit one
hit two
…..
7
7.1 总的来说实现了step功能,但是还是存在一些小bug
7.2 有时间的话,希望能够实现C语言级别的step(对我来说难度太大)
8
kgdb_arch_handle_exception函数和自己实践,ARM结构的GKDBb,并没有
实现step调试功能。
曾试图去实现kgdb的step功能,由于条件及能力限制没能实现(
kgdb需要用的一个串口通讯,调试本来也需要单独一条,但是现在只有
一条共用的),
int kgdb_arch_handle_exception(int exception_vector, int signo,
int err_code, char *remcom_in_buffer,
char *remcom_out_buffer,
struct pt_regs *linux_regs)
{
unsigned long addr;
char *ptr;
switch (remcom_in_buffer[0]) {
case ‘D’:
case ‘k’:
case ‘c’:
ptr = &remcom_in_buffer[1];
if (kgdb_hex2long(&ptr, &addr))
linux_regs->ARM_pc = addr;
else if (compiled_break == 1)
linux_regs->ARM_pc += 4;
compiled_break = 0;
return 0;
}
return -1;
}
转载于:https://www.cnblogs.com/pangblog/p/3312929.html
KDB支持单步调试功能(ARM架构)相关推荐
- 给Arm生态添把火,腾讯Kona JDK Arm架构优化实践
前言 Arm架构以其兼具性能与功耗的特点,在智能终端以及嵌入式领域得到了广泛的使用,不断扩大其影响力.而在PC端以及数据中心,之前往往是x86架构在其中发挥着主要的作用.最近,随着人工智能.云计算等技 ...
- 技术控,看这里,一款支持断点调试的数据科学工具
数据科学是一门利用统计学.机器学习.数据挖掘.数据可视化等技术和方法,从数据中提取知识和信息的交叉学科.自上世纪60年代,统计学家John W.Tukey首次提出"数据分析"(Da ...
- 超详细的ARM架构适配介绍
本文主要介绍云联壹云平台如何适配ARM,并运行在ARM CPU架构的机器上. 背景介绍 1.平台服务运行架构 云联壹云平台采用容器化,分布式的架构运行在 Kubernetes(K8s)之上.下面是平台 ...
- python逐行调试_python单步调试
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文由腾讯云+社区自动同步,原文地址 https:stackoverflow.c ...
- 华为云麒麟arm架构docker启动redis报错:<jemalloc>: Unsupported system page size
在 ARM 架构的华为云服务器上,运行 Redis 容器时出现 "jemalloc: Unsupported system page size" 错误,这通常是因为服务器的页面大小 ...
- android平台从froyo 2.2开始支持jni单步调试了
一.写在前面的话(可以理解为废话) 前段时间从网上看了google的io大会,亲眼看到了google在it技术发展和创新领域所做的工作(在此也问候一下apple公司的美术家门,你们辛苦了).虽然goo ...
- ARM DS-5单步调试ARM64 linux 内核
目录 1 介绍 2 开发环境 3 准备工作 3.1 Ubuntu环境准备 3.2 源代码准备 3.3 DS-5准备 3.4 使用DS-5调试源码 3.4.1 建立源码工程 3.4.2 创建debug配 ...
- arm架构linux进程调试,gdb-multiarch + gdbserver调试linux arm应用程序
首先安装gdb-multiarch sudo apt-get install gdb-multiarch 把编译好的gdbserver发送到板子目录下 查看gdbsever版本 gdbserver - ...
- arm a7 支持虚拟化吗_ARM处理器架构和天梯图解析
ARM架构是当今世界上最受欢迎的处理器架构之一,每年出货数十亿个基于ARM的设备.共有三个体系结构配置:A.R和M.通常,一个终端设备使用多个ARM处理器,并且这些处理器实现不同的体系结构配置文件.例 ...
最新文章
- Html5游戏框架createJS组件--EaselJS
- leetcode530. 二叉搜索树的最小绝对差
- sox处理mp3_SoX 音频处理工具使用方法
- Tidb慢日志显示不全
- java substring_java 中 substring()方法
- 距离度量方式(马氏距离,欧式距离,曼哈顿距离)
- Strings_append_学习
- Firefox Javascript引擎变成单线程
- 元素定位-XPATH定位方法总结
- SQl触发器 声明变量。
- V2X协议栈介绍及说明(含框图)
- 印度文明的继承和交溶
- Microsoft Teams安装教程
- 重写drf的ValidationError, 改变抛出异常的状态码
- 我是如何学习计算机编程的
- 腾讯云DevOps流水线的应用与实践
- 互联网运营面试题_网站运营面试问题
- ANT DESIGN VUE upload 上传excel (使用upliad组件,上传excel到页面表格)
- day10-字符串作业-复写
- 我看《肖申克的救赎》
热门文章
- JS数据结构与算法——选择排序(把小的数字依次往前放)
- Vue3 Composition API(三)——生命周期钩子、Provide函数 和 Inject函数、封装Hook案例、setup顶层编写方式
- Express Session 的基本使用
- Nodejs 路由封装 封装一个类似 express 的路由
- LeetCode 1685. 有序数组中差绝对值之和(前缀和)
- LeetCode 800. 相似 RGB 颜色
- LeetCode 1025. 除数博弈(动态规划)
- LeetCode 893. 特殊等价字符串组
- LeetCode 1290. 二进制链表转整数
- 剑指Offer - 面试题32 - III. 从上到下打印二叉树 III(BFS,queue+stack)