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;
}
KDB支持单步调试功能(ARM架构)的更多相关文章
- 支持源码单步调试QT库编译笔记
支持源码单步调试QT库编译笔记 编译环境:windows 10 编译工具:mingw_4_4_0 Qt源码版本:qt-everywhere-opensource-src-4.8.5(下载地址:http ...
- 给 Arm 生态添把火,腾讯 Kona JDK Arm 架构优化实践
前言 Arm 架构以其兼具性能与功耗的特点,在智能终端以及嵌入式领域得到了广泛的使用,不断扩大其影响力.而在 PC 端以及数据中心,之前往往是 x86 架构在其中发挥着主要的作用.最近,随着人工智能. ...
- 手把手教你使用eclipse+qemu+gdb来单步调试ARM内核【学习笔记】
平台信息:linux4.0 平台:qemu 作者:庄泽彬 说明:笨叔叔的Linux视频的笔记 一.编译linux源码 export CROSS_COMPILE=arm-linux-gnueabi- e ...
- Python的功能模块[4] -> pdb/ipdb -> 实现 Python 的单步调试
pdb / ipdb 模块 / pdb / ipdb Module pdb 和 ipdb 的主要作用是用于 Python 程序的单步调试,Python 的调试可参考链接. 下面是一个简单的使用示例 i ...
- 最好用的koa2+mysql的RESTful API脚手架,mvc架构,支持node调试,pm2部署。
#基于webpack构建的 Koa2 restful API 服务器脚手架 这是一个基于 Koa2 的轻量级 RESTful API Server 脚手架,支持 ES6, 支持使用TypeSc ...
- ARM架构解析
ARM架构解析 (2014-11-23 21:56:53) 转载▼ 标签: francis_hao arm架构 arm核 soc 分类: MCU 先来谈一下ARM的发展史:1978年12月5日,物理学 ...
- Anroid逆向学习从编写so到静动态调试分析arm的一次总结
Anroid逆向学习从编写so到静动态调试分析arm的一次总结 一.前言 最近跟着教我兄弟学逆向这篇教程学习Android逆向,在第七课后作业反复折腾了好几天,正好在折腾的时候对前面的学习总结一波,动 ...
- X86 架构和 ARM 架构
1.关于x86架构 X86是一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合,X86是由Intel推出的一种复杂指令集,用于控制芯片的运行的程序,现在X86已经广泛运用到了家 ...
- zend+xdebug单步调试
也允许使用第三方调试工具,今天以PHP教程形式分享如何使用zend studio配置Xdebug来调试PHP程序. 使用Xdebug在zend studio中调试PHP源码之前,请务必安装配置Xdeb ...
随机推荐
- 详解iOS7升级细节:引领视觉革命
下星期我们将看到的正式版将和WWDC上看到的大不相同.苹果六月份发布了全新版本的iOS操作系统——这是从2007年首次发布以来的最大的一次调整和改进.这次的改变招致许多批评.许多设计师在网站上晒出了他 ...
- Android Dialog详解
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- Poj 2777 Count Color(线段树基础)
又毁三观了.......虽然题目数据有坑:区间[a,b]可能会有a>b的情况,但是我一开始没有考虑它也能过. 此外莫名其妙的TLE #include <iostream> #incl ...
- android网络编程注意事项之一:移动网络下,防止网络超时甚至连接不上,解决办法--为网络请求设置代理
Android应用程序访问互联网资源时,在Wifi的情况下处理网络连接按照上文所讲述的方法步骤即可顺利实现:但如果当前Android设备的联网方式是通过移动运营商的网络服务为中转,间接访问的互联网资源 ...
- 简易视频播放器2 (基于Qt、opencv)
因项目需要,需要实现一个对以保存的监测视频快速查看功能. 查询网上一些资料,初步简易的实现了一下. 实际效果图: 该程序基于Qt5.4,opencv248,开发环境为win8.1 结构为: video ...
- 自己用js写的两个日历控件
前一阵写了两个日历控件,做了简单的封装,发出来共朋友们参考. 第一个日历控件,条状的日历. (使用方法:调用initBarTime(id,evn),第一个参数是要渲染div的id,第二个参数是点击日期 ...
- SQL - 将NULL设置为 NOT NULL
在有些时候,我们在创建表的时候,会忘掉设置某一个列的属性,比如忘了设置为非空,但是默认情况下系统会自动的设置为NULL.这样我们该怎样通过语句设置呢?? 例如有一个表,其中的一个属性为WM CHAR( ...
- HDOJ 1598 Kruscal
贪心思想的Kruscal:先对边排序,再从第一条边开始,一旦start point 和 end poiont 连上,就break #include <stdio.h> #include & ...
- 怎样获取浏览器上次的会话数据(session)
怎样获取浏览器上次的会话数据: 要知道上次会话session_id是多少? 让cookie保存的PHPSESSID的值不要浏览器一退出就被删除了? 所以我们要设置自己的session_id,不要系统自 ...
- 【JSP】JSP与oracle数据库交互案例
************************************************************************ ****原文:blog.csdn.net/clark_ ...