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架构)相关推荐

  1. 给Arm生态添把火,腾讯Kona JDK Arm架构优化实践

    前言 Arm架构以其兼具性能与功耗的特点,在智能终端以及嵌入式领域得到了广泛的使用,不断扩大其影响力.而在PC端以及数据中心,之前往往是x86架构在其中发挥着主要的作用.最近,随着人工智能.云计算等技 ...

  2. 技术控,看这里,一款支持断点调试的数据科学工具

    数据科学是一门利用统计学.机器学习.数据挖掘.数据可视化等技术和方法,从数据中提取知识和信息的交叉学科.自上世纪60年代,统计学家John W.Tukey首次提出"数据分析"(Da ...

  3. 超详细的ARM架构适配介绍

    本文主要介绍云联壹云平台如何适配ARM,并运行在ARM CPU架构的机器上. 背景介绍 1.平台服务运行架构 云联壹云平台采用容器化,分布式的架构运行在 Kubernetes(K8s)之上.下面是平台 ...

  4. python逐行调试_python单步调试

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文由腾讯云+社区自动同步,原文地址 https:stackoverflow.c ...

  5. 华为云麒麟arm架构docker启动redis报错:<jemalloc>: Unsupported system page size

    在 ARM 架构的华为云服务器上,运行 Redis 容器时出现 "jemalloc: Unsupported system page size" 错误,这通常是因为服务器的页面大小 ...

  6. android平台从froyo 2.2开始支持jni单步调试了

    一.写在前面的话(可以理解为废话) 前段时间从网上看了google的io大会,亲眼看到了google在it技术发展和创新领域所做的工作(在此也问候一下apple公司的美术家门,你们辛苦了).虽然goo ...

  7. 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配 ...

  8. arm架构linux进程调试,gdb-multiarch + gdbserver调试linux arm应用程序

    首先安装gdb-multiarch sudo apt-get install gdb-multiarch 把编译好的gdbserver发送到板子目录下 查看gdbsever版本 gdbserver - ...

  9. arm a7 支持虚拟化吗_ARM处理器架构和天梯图解析

    ARM架构是当今世界上最受欢迎的处理器架构之一,每年出货数十亿个基于ARM的设备.共有三个体系结构配置:A.R和M.通常,一个终端设备使用多个ARM处理器,并且这些处理器实现不同的体系结构配置文件.例 ...

最新文章

  1. Html5游戏框架createJS组件--EaselJS
  2. leetcode530. 二叉搜索树的最小绝对差
  3. sox处理mp3_SoX 音频处理工具使用方法
  4. Tidb慢日志显示不全
  5. java substring_java 中 substring()方法
  6. 距离度量方式(马氏距离,欧式距离,曼哈顿距离)
  7. Strings_append_学习
  8. Firefox Javascript引擎变成单线程
  9. 元素定位-XPATH定位方法总结
  10. SQl触发器 声明变量。
  11. V2X协议栈介绍及说明(含框图)
  12. 印度文明的继承和交溶
  13. Microsoft Teams安装教程
  14. 重写drf的ValidationError, 改变抛出异常的状态码
  15. 我是如何学习计算机编程的
  16. 腾讯云DevOps流水线的应用与实践
  17. 互联网运营面试题_网站运营面试问题
  18. ANT DESIGN VUE upload 上传excel (使用upliad组件,上传excel到页面表格)
  19. day10-字符串作业-复写
  20. 我看《肖申克的救赎》

热门文章

  1. JS数据结构与算法——选择排序(把小的数字依次往前放)
  2. Vue3 Composition API(三)——生命周期钩子、Provide函数 和 Inject函数、封装Hook案例、setup顶层编写方式
  3. Express Session 的基本使用
  4. Nodejs 路由封装 封装一个类似 express 的路由
  5. LeetCode 1685. 有序数组中差绝对值之和(前缀和)
  6. LeetCode 800. 相似 RGB 颜色
  7. LeetCode 1025. 除数博弈(动态规划)
  8. LeetCode 893. 特殊等价字符串组
  9. LeetCode 1290. 二进制链表转整数
  10. 剑指Offer - 面试题32 - III. 从上到下打印二叉树 III(BFS,queue+stack)