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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IBM Watson失败的4大原因

来源&#xff1a;大数医达被称为“认知计算”革命性代表的IBM Watson从诞生那一刻起&#xff0c;就一直在被质疑中发展&#xff0c;在发展中被质疑。近日&#xff0c;坊间传言IBM Watson健康部门将裁员50%-70%&#xff0c;甚至也有传言说&#xff0c;整个健康部门将被关闭&…

[Android源码]Android源码之高仿飞鸽传书WIFI热点搜索与创建(一)

&#xff08;本文详情来源&#xff1a;android源码 http://www.eoeandroid.com/thread-296427-1-1.html 转载请注明出处&#xff01;&#xff09; [Android源码分享]飞鸽传书的Android客户端相信大部分同学都看过并且用过吧&#xff1f;我这里就小小的还原一下一个小模块&am…

谷歌智慧城市之困

来源&#xff1a;网易智能 摘要&#xff1a;谷歌母公司Alphabet旗下创新城市部门Sidewalk Labs目前在信息隐私问题上陷入了困境。他们失去了数据信托首席专家和顾问安卡瓦吉安&#xff08;Ann Cavoukian&#xff09;&#xff0c;该机构将批准和管理多伦多概念智能社区Quayside内…

形态学图像处理(二)

本文主要包括以下内容 二值形态学的经典应用&#xff0c; 细化和像素化&#xff0c; 以及凸壳灰度图像的形态学运算&#xff0c; 包括灰度腐蚀、灰度膨胀、灰度开和灰度闭本章的典型案例分析 在人脸局部图像中定位嘴的中心显微镜下图像的细菌计数利用顶帽变换&#xff08;to…

机器学习实战学习笔记 一 k-近邻算法

k-近邻算法很简单&#xff0c;这里就不赘述了&#xff0c;主要看一下python实现这个算法的一些细节。下面是书中给出的算法的具体实现。 def clssify(inX,dataset,label,k):#计算距离datasetSize dataset.shape[0]diffMat tile(inX,(dataSize,1))-datasetsqdiffMat diffMat …

最全的大数据解决方案(多图)

来源&#xff1a;网络大数据未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&…

Foreach语法

先看例子&#xff1a; Random rand new Random(47);float f[] new float[10];for(int i 0; i < 10; i){f[i] rand.nextFloat();}for(float x: f) {System.out.println(x);} foreach语法&#xff1a; for(float x: f) {System.out.println(x);}转载于:https://www.cnblog…

图像分割

图像分割是指将图像中具有特殊意义的不同区域划分开来&#xff0c; 这些区域互不相交&#xff0c;每个区域满足灰度、纹理、彩色等特征的某种相似性准则。图像分割是图像分析过程中最重要的步骤之一&#xff0c;分割出的区域可以作为后续特征提取的目标对象。 本文主要包括以下…

重磅:IBM 340亿美元收购红帽软件,开源生态或将迎来重大变化

来源&#xff1a;人工智能和大数据北京时间10月29日上午消息&#xff0c;据报道&#xff0c;IBM周日宣布&#xff0c;将以约340亿美元价格收购开源软件和技术主要供应商红帽公司&#xff08;Red Hat&#xff09;。根据两家公司的联合声明&#xff0c;IBM将支付现金&#xff0c;…

ACM/ICPC竞赛

第04篇 ACM/ICPC竞赛之STL--vector 在STL的<vector>头文件中定义了vector&#xff08;向量容器模板类&#xff09;&#xff0c;vector容器以连续数组的方式存储元素序列&#xff0c;可以将vector看作是以顺序结构实现的线性表。当我们在程序中需要使用动态数组时&#xf…

阈值分割与区域分割

本文主要包括以下内容 阈值分割技术基于区域的图像分割技术本章的典型案例 基于LoG和Canny算子的精确边缘检测基于Hough变换的直线检测图像的四叉树分解 阈值分割 我们曾在3.5节学习过灰度阈值变换的相关知识&#xff0c; 利用灰度阈值变换分割图像就称为阈值分割&#xf…

边缘计算芯片格局分析

来源&#xff1a;半导体行业观察 近日&#xff0c;华为和比特大陆纷纷发布了针对边缘计算的新芯片产品。华为的Ascend系列采用达芬奇架构&#xff0c;其中Ascend 310功耗8W算力8TOPS正是针对边缘计算市场。而之后比特大陆发布的BM1682和BM1880也是针对边缘计算市场&#xff0c;…

基于PCA的人脸特征抽取

我们将应用PCA技术来抽取人脸特征。一幅人脸照片往往由比较多的像素构成&#xff0c;如果以每个像素作为1维特征&#xff0c;将得到一个维数非常高的特征向量&#xff0c; 计算将十分困难&#xff1b;而且这些像素之间通常具有相关性。这样&#xff0c;利用PCA技术在降低维数的…

[置顶] 删除:大数据取舍之道读书笔记

1 对于人类而言&#xff0c;遗忘一直是常态&#xff0c;而记忆才是例外。然而&#xff0c;由于数字技术与全球网络的发展&#xff0c;这种平衡已经被打破了。如今&#xff0c;往事正像刺青一样刻在我们的数字皮肤上&#xff0c;遗忘已经变成了例外&#xff0c;而记忆却成了常态…

超市的100年发展史:好日子终结 亚马逊无人店是趋势

来源&#xff1a;网易智能 电商巨头亚马逊已经在旧金山、西雅图和芝加哥等地开设了多家无人便利店Amazon Go&#xff0c;它们向顾客展现了无缝购物体验这种未来购物模式&#xff0c;它依赖于高科技追踪技术&#xff0c;消费者只需将商品从货架上取下&#xff0c;并放入帆布手提…

图像识别初步

本文主要包括以下内容 模式与模式识别的基本概念过度拟合最小距离分类器基于相关的模板匹配本章的典型案例分析 基于最小距离分类器的鸾尾属植物分类基于相关技术的图像模式匹配 模式识别概述 模式识别(Pattern Recognition)是人类的一项基本智能&#xff0c;在日常生活中…

下一个人才大缺口:量子计算研究人员

来源&#xff1a;36Kr初创公司Zapata Computing的创始人兼首席执行官克里斯托弗萨瓦&#xff08;Christopher Savoie&#xff09;表示&#xff0c;他向三位专攻量子计算的外国科学家提供了就业机会&#xff0c;他在等他们的工作签证获得批准。但几个月过去了&#xff0c;这家位…

LIBCMTD.lib与libcpmtd冲突的解决方法。

error: 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2YAPAXIZ) 已经在 LIBCMTD.lib(new.obj) 中定义 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??…

基于PCA和SVM的人脸识别

svm推广到多类情况 一对多的最大响应策略(one against all) 假设有A 、B、C.. D四类样本需要划分。在抽取训练集的时候&#xff0c;分别按照如下4种方式划分。 A. 所对应的样本特征向量作为正集&#xff08;类标签为1), B、C、D所对应的样本特征向量作为负集&#xff08;类…

为何协作机器人能够兴起?“协作机器人-激烈的市场谁能杀出重围”

来源&#xff1a;机器人大讲堂作者&#xff1a;包文涛&#xff0c;哈尔滨工业大学机器人研究所工学硕士&#xff0c;在机器人和工业自动化领域有超过10年的专业经验。曾任职于ABB集团&#xff0c;先后在新加坡、美国、加拿大等地工作&#xff0c;在产品管理、技术方案、项目工程…