本文讲的是使用Troll对ARM Cortex-M处理器进行系统内核调试

Troll是用于ARM Cortex-M系统的C语言源代码级调试器,可通过高端的blackmagic硬件调试探针进行访问,并且还可以使用blackmagic的定制工具vx / blackstrike。目前Troll只支持以C编程语言编写的源代码程序的源代码级调试,并以ELF格式编译为可执行文件,其中也包含DWARF调试格式信息。

在此请大家注意,Troll是调试器的一个非常特殊的例子:

1. 它只针对基于ARM Cortex-M的系统

2. 源代码调试仅支持C语言

3. 只支持blackmagic和blackstrike硬件调试探针

4. Trevroll本身是用C++编写的

5. Troll本身严重依赖于Qt框架

以下是Troll的图形用户界面截图,截至2017.2.28:

下面是上面截图的注释版本,显示了Troll的各个部分的含义:

以下是一个简化的,更具有实战性质的日常使用的屏幕截图,截至2017. 2.28 :

测试Troll

对Troll的测试是非常简单和容易的,为了方便调试和评估,我会在静态测试驱动模式对Troll进行测试。在这种模式下,我没有建立与实时目标系统的连接,而是让Troll从文件读取目标内存和寄存器的内容。这样,Troll就不会调用任何其他依赖的外部工具,测试所需的所有数据都将从具有硬编码名称的文件中获取。这种静态测试驱动器的操作方式主要是对Troll进行快速原型设计和调试,以及展示其各个功能。

让我首先从github把它的源代码复制过来,并初始化和更新子模块。

git clone https://github.com/stoyan-shopov/troll.gitcd troll
git submodule init
git submodule update

接下来,就是构建Troll。由于Troll利用的是Qt框架,所以我更喜欢在Qt Creator IDE中构建Troll,但也可以直接使用qmake和make实用程序来构建它。

最后,从以下这个链接可以获取一个静态测试驱动的测试文件集:

https://github.com/stoyan-shopov/troll-test-drive-snapshots

在troll的工作目录中提取troll-test-drive-files目录。

现在测试准备都已经设置好了,就让我开始运行Troll吧!

Troll的运行原理

截至目前,Troll已经断断续续地发展了大约六个月,截至目前Troll项目还处于实验阶段,非常不成熟。由于该代码目前看起来非常具有攻击性,且代码很小,所以我认为它看起来很有发展潜力。一般的Troll代码只有两个源代码文件,即troll.cxx和libtroll.hxx。文件troll.cxx中的代码是调试器的前端,它能驱动图形用户界面并与正在调试的目标设备进行通信,troll.cxx文件大致包含1500行代码。文件libtroll.hxx中的代码负责对DWARF调试信息进行解码,并为前端提供易于使用的信息,例如如何展开目标调用栈、数据对象的数据类型、数据对象所在的位置生成的机器代码的目标、生成的地址或地址对应于源代码中的哪一行(这对于在断点上的操作是有用的)、子程序中的局部变量是多少等等。该文件目前大约有2400行代码。这样算起来,troll.调试器前端(在文件troll.cxx中)的代码和调试信息处理引擎(在libtroll.hxx文件中)总共大约有4000行代码。

尽管在许多方面的功能还是不完整的,但这4000行代码当前还是提供了以下这些调试功能:

1. 目标调用栈的展开,包括从中断服务程序中进行的堆栈展开,

2. 结构化的数据显示, 数组显示,数据结构分层显示,支持位字段以及将C语言枚举器的值解码为符号名称

3. 会在正在调试的程序中显示当前源代码位置,并可选择性地拆卸源代码

4. 提供源代码程序中的子程序(C函数),全局和本地(子程序)数据对象的列表,以及源代码映射到子程序和数据对象的定义

5. 目标执行控制,对断点进行设置或清除,步进指令,恢复、暂停和重新启动目标执行,

6. 目标闪存编程和验证

troll的代码需要不断地增长,才能完全顺利地支持上述所有功能,但是如何利用这4000行代码来支持上面描述的这些功能呢?

为了让troll的代码尽可能保持简洁,所以在实现以上那些功能时要注意:

1.  troll不会尝试支持除ARM Cortex-M以外的任何目标架构,以及除C语言之外的任何目标源代码语言,此外,troll以C ++编写,并大量使用Qt框架,以及Qt框架提供的功能

2. 在正常情况下,调试器会利用一些库来提供对编译器生成的可执行文件的结构化访问,例如,以ELF文件格式。除此之外,调试器还会访问调试信息部分和驻留在目标中生成的机器代码。例如,libbfd库、二进制文件描述符库或libelf库。由于troll不使用这样的库,所以为了在ELF文件格式的编译器生成的可执行文件中找到DWARF调试信息部分,troll将简单地执行objdump实用程序,以显示调试信息部分的位置,然后解析objdump的函数输出,并最终使用objdump实用程序提供的信息来简单地读取调试信息部分(通过简单的文件访问操作)。利用几行C ++代码,而不是整合和利用库,如libbfd / libelf库。此外,为了提取驻留在目标中的机器代码,troll会执行objcopy实用程序,以生成ELF可执行文件中的s-record文件(通常用于编程目标芯片)。解析s-record文件非常简单,只需要几行C ++代码,并且不需要使用库,如libbfd / libelf。

3. 同样,troll不使用反汇编库,例如,libopcodes库,而是运行objdump实用程序,以生成目标可执行ELF文件的反汇编列表,最后解析出反汇编输出,为此输出构建一个索引,并使用索引为目标地址提供反汇编文本。这种方法非常简单,只需几行源代码即可实现,避免了对外部库进行重组。

4. 存在访问DWARF调试信息的高级通用库,如libdwarf库。troll的一个关键设计就是不使用这样的库,特别是libdwarf库。troll是我第三个尝试编写的调试器,所以我知道,当创建一个功能非常有限的专用调试器,如troll 时,解码和处理DWARF调试信息就会变得更简单,更有效率,例如:

(1)在现在的程序中,可以对调用栈进行追溯,

(2)显示本地和全局变量的位置,

(3)变量的数据类型是什么,

(4)目标设备地址对应于源代码中的哪一行,以便可以在那里设置一个断点,

(5)通过目标设备地址所对应的源代码文件,显示出源代码的反汇编。

通用库(如libdwarf)很难提供这样的功能,因为它们只能提供对DWARF调试信息的相对较低级别的访问。

总而言之,就是不要使用通用库来通过troll访问DWARF调试信息,因为这会使troll代码更简单、更小、更直接、更高效、更容易维护、理解和修改。

5.  FORTH,这一步实现起来,需要非常复杂的技术,因为由编译器生成的设备代码程序中的变量的位置以及如何展开目标调用栈都可能是复杂的。在DWARF中,通过定义一个虚拟的,面向堆栈的设备以及为该设备定义的一组指令来解决这个问题。这实质上是FORTH语言。在troll中,数据对象位置的计算和调用栈unwind都会被写入FORTH。

原文发布时间为:2017年6月4日
本文作者:xiaohui
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
原文链接

使用Troll对ARM Cortex-M处理器进行系统内核调试相关推荐

  1. ARM Cortex M3M4处理器复位流程

    ARM规定,M3和M4处理器复位后,首先从0x00000000和0x00000004地址读取Main Stack Pointer(MSP)和reset vector(the starting addr ...

  2. [转] 高性能嵌入式处理器时代来临!多家中国芯片设计公司选择ARM® Cortex™-A9和Mali™图形处理器技术

    ARM公司(伦敦证交所:ARM:纳斯达克:ARMH)近日宣布,在过去一年多时间内,海思(Hisilicon).晶晨半导体(Amlogic).中天联科(Availink).海尔(Haier)等多家中国知 ...

  3. 意法半导体STM32 ARM Cortex 32位微控制器

    STM32系列32位微控制器基于Arm® Cortex®-M处理器,旨在为MCU用户提供新的开发自由度.它包括一系列产品,集高性能.实时功能.数字信号处理.低功耗/低电压操作.连接性等特性于一身,同时 ...

  4. ​ ARM Cortex系列那么多处理器,该怎么区分?

    关注.星标公众号,直达精彩内容 来源:嵌入式资讯精选 最近因为要为芯片选定核,所以就在了解哪些核合适且性价比好,这是一个需要结合产品各类技术.市场分析的活,看似简单却还是需要一些储备的,今天选了一篇A ...

  5. ARM Cortex系列(A8/A9/A15/A7) NEON多媒体处理SIMD引擎优化

    出处: http://houh-1984.blog.163.com/blog/static/31127834201211275111378/ Cortex-A9的NEON多媒体处理器是基于ARMv7的 ...

  6. i.MX6UL: i.MX 6UltraLite处理器 - 低功耗,安全,Arm® Cortex®-A7内核

    i.MX6UL: i.MX 6UltraLite处理器 - 低功耗,安全,Arm® Cortex®-A7内核 概述 i. MX6UltraLite作为i.MX6系列的扩展,一系列高性能.超高效的处理器 ...

  7. ARM Cortex A/R/M全系列处理器型号概览(截止2020年4月)

    因为工作需要,要对ARM Cortex全系列的处理器进行一些收集和对比,找了半天没找到什么合适的资料,只好自己去ARM官网上,从网页上截了这张图作为一个参考,记录在此便于日后查询.

  8. 关于ARM Cortex系列产品

    ARM Cortex系列的三款产品全都集成了Thumb®-2 指令集,可满足各种不同的日益增长的市场需求.ARM Cortex系列的三款处理器: • ARM Cortex-A 系列:针对复杂操作系统以 ...

  9. ARM® Cortex®-M内核单片机STM32家族介绍,覆盖STM32F、STM32H、STM32L全系列

     STM32是ARM®Cortex®-M内核单片机.目前提供10大产品线(F0, F1, F2, F3, F4, F7, H7, L0, L1, L4),超过700个型号.STM32产品广泛应用于 ...

最新文章

  1. android javamail获取邮件太多太慢_结合 Spring 发送邮件的4种正确姿势,你知道几种?...
  2. 四大价值观和12准则
  3. 使用Linux lvm
  4. Windows 下 Conda install 安装出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url解决措施
  5. python json数据格式数组内元素递增赋值_利用Python实现JSON格式数据的编码与解码操作...
  6. 批量从网上下载图片、zip等文件到本地[java爬虫]
  7. PSNR和SSIM的matlab源代码,图像质量评价指标之 PSNR 和 SSIM
  8. 【Data guard】Switchover切换
  9. html中文字空心如何设置,css 中字体文本小诀窍
  10. jbpm hibernate.cfg.xml 连接mysql配置_hibernate.cfg.xml文件连接mySql、Oracle、SqlServer配置...
  11. Prometheus Operator 架构 - 每天5分钟玩转 Docker 容器技术(178)
  12. Apache JMeter使用教程
  13. 密码攻防系列文章27-web后台登录口令暴力破解及防御
  14. html5 游戏 响应式,关于html5:响应式游戏网页有什么特点呢
  15. Typescript浅尝
  16. 软件工程 | 第六章 系统集成与测试
  17. ExtJS各个版本官方API文档
  18. python locust在linux下的安装
  19. 2022.09.01 最新配置maven阿里云仓库配置
  20. [ XJTUSE ]JAVA语言进阶知识—— 8.6 多线程

热门文章

  1. python硬件编程智能家居_利用 Python 的力量,实现 Tableau 与智能家居系统集成
  2. python编程300例_经典编程100例——python版(例9例10)
  3. Layout动画:在android布局发生变化时添加动画效果
  4. 第三章 PLSQL Developer 安装前oracleclient客户端的配置,在用plsql 连接oracle服务器
  5. linux中mtools工具_Linux mtools命令
  6. keycode值对照表_JavaScript中键盘字母与keyCode值(键值)的对照表
  7. android 检测当前wifi是否又网络,android判断连接的wifi是否能访问网络
  8. mysql autocommit 脚本_mysql autocommit的差异
  9. php 检测密码,php检测密码强度
  10. Spring 详解(二):IOC 和DI