ARM学习(18) Jink Ozone调试总结

2023-05-16

笔者来聊聊Jink Ozone调试

1、Ozone加载选择elf或者bin

在这里插入图片描述
Ozone调试的时候可以设置PC的位置,主要有上面两种

  1. 从ELF读取PC位置,调试时直接设置PC的初始位置
  2. 从向量表中读取pc的初始值,例如cortex-m3/m4 就是bin文件第二个u32值,第一个是sp的值

加载elf/axf

axf其实遵循的就是elf的格式,大概可以理解为改了后缀名而已。

如果加载axf,可以download或者也可以直接attach上去,不reset。

总共有三种模式:

  1. download and Rreset Program :下载代码和 复位程序
  2. attach to running program :链接到正在运行的程序,程序也一直保持运行
  3. attach & Halt Program:链接到正在运行程序,但是停止程序
    在这里插入图片描述

笔者这个是直接download程序,可以看到下面Console中的内容

  1. Elf.GetBaseAddr(),return 0值
  2. read U32 (0x0)return 0x30000,这是sp值,
  3. Elf.GetEntryPointPC() return 0x25C,ELF格式中会带有初始程序值(下图2) Entry Point Address:0x25d,所以设置pc 为该值。
  4. Startup complete (pc=0x54c),因为程序断点设置在main函数这个符号,看图1右下角,所以pc此时停在该位置,图3 通过符号表也可以看到这个信息
  5. 假如将该断点的符号设置为ResetISR,复位中断函数,则会看到断点会停在该函数,如图4,0x25C。

说明:因为CortexM4- 都是thumb2指令,所以地址都是奇地址,看到0x25C和0x25D是一样的在这里插入图片描述图1在这里插入图片描述图2
在这里插入图片描述
图3
在这里插入图片描述
图4

加载bin

如果是下载bin,建议就选择从向量表中读出pc(Read from Base Address Vector Table),地址就填加载地址即可,STM32:0x08000000 LPC则可以填:0x0地址

在这里插入图片描述
因为bin文件中没有符号表,所以会提示无法断在main这个符号这里,所以他的断点就停在了开始位置,即从向量表里面read出来的地址,即0x25C位置。其他的显示和axf加载是一样的。
在这里插入图片描述

STM32 axf Download问题

在这里STM32使用Ozone的时候,碰到一个问题,axf下载程序运行不正常,但是bin下载则正常。
首先分析:查看各自下载的是程序启动情况,图1是bin下载,图2是axf下载。

  1. 首先发现SP的值都是设置的正常的,
  2. axf设置的PC的是0x08000150,最终pc停在main函数,地址是0x0800C2E8,但是bin设置的PC是0x080001CD,初始PC就不一样,执行效果肯定不同
  3. 经过定位,发现axf设置pc的位置在__main,如图3,bin下载设置的pc位置在Reset_handler,如图4,符合预期,则验证了为什么bin下载的是正常的,因为程序执行正常,但是axf下载执行异常,是因为其下载的就异常。
  4. 追其根本原因,发现axf文件头的位置就是0x08000151,说明axf编译有问题,导致Ozone按照axf调试则出现问题,如图5
  5. 查询ARMCC 编译器手册,发现链接选项 --entry 可以指定程序入口点,如图6,增加之后,编译出程序运行正常,axf显示入口点也是正常,图7图8显示。

在这里插入图片描述
图1
在这里插入图片描述
图2
在这里插入图片描述
图3
在这里插入图片描述
图4
在这里插入图片描述
图5

在这里插入图片描述
图6
在这里插入图片描述
图7
在这里插入图片描述
图8

2、Ozone远程调试

远程调试的端口是19020,jink与板子的链接方式是USB,Ozone与Jink通过TCP/IP方式进行链接,地址是xxx:19020
在这里插入图片描述
在这里插入图片描述

3、Ozone断点调试正常,全速运行就异常

遇到正常情况,有几种情况,

3.1 调试运行正常,但是全速无法进中断

情况如1中所介绍的STM32问题情况一样,

  1. SystemInit函数中设置中断向量表的偏移, SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */,图2
  2. 由于误操作,VECT_TAB_OFFSET改为其他值,导致全速运行时,无法找到中断向量表,无法跳入到函数入口,一中断就卡主(疑似跑飞)。如图1
  3. 调试的时候为什么正常呢,因为跳过了system_init的执行,中断向量表偏移默认值是0,则不偏移,程序正常可以跳入中断执行。
    在这里插入图片描述
    图一
    在这里插入图片描述
    图二

3.2 调试运行正常,但是全速程序卡住在异常函数口出

这个可能每个调试器都会存在这样的情况,调试器会干预CPU的执行,强制程序跳入下一行,

  1. 很明显的例子比如 :乱序执行,接上调试器之后,则按照正常执行,就不会乱序执行了
  2. 再说回来,程序卡在异常入口函数出,由于调试器的原因,会因为将数据识别为函数符号,程序继续执行了,但是全速运行,无法识别为函数,则跳入异常,,每次都进去异常,表现为卡在函数口。
    在这里插入图片描述
    图1

在这里插入图片描述
图2
正常 Ozone 调试看到的地址,异常情况下,图4函数由于没有声明为function,所以运行时,无法认为是函数(最低位不是0,thumb指令)所以出现异常,使用异常,企图切到arm状态,如图5,而且由于状态错误,反复进入异常,反复进不去,导致异常,现象就是卡在异常入口处。
在这里插入图片描述
图3
在这里插入图片描述

图4
在这里插入图片描述

图5

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM学习(18) Jink Ozone调试总结 的相关文章

  • ARM 汇编 SOS 中的 64 位除法

    我正在计算 16 个 64 位数字相加的平均值 我认为我已经正确完成了所有加法 但现在我需要弄清楚如何将 64 位数字除以 16 但我被困住了 任何帮助都会非常感谢你 到目前为止 这是我的代码 tableSize EQU 16 sum EQ
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

    我正在使用codesourcery g lite 基于gcc4 7 2版本 为stm32 Cortex m3 编程 我希望动态加载可执行文件 我知道我有两个选择 1 可重定位的elf 需要一个elf解析器 2 具有全局偏移寄存器的位置无关代
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 手臂“版本”之间的差异? (仅限 ARMv7)

    基本上我想知道ARMv7l和ARMv7之间的区别hl 我有一个带有armv7l的arm处理器 并且有很多armv7的rpmhl 我完全不知道我必须搜索什么才能获得相关信息 这个 后缀 叫什么 还有其他类型吗 他们的做法有何不同 我假设它指示
  • 如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

    我对这个已经咬牙切齿了 我需要在 ARM 板上进行分析并需要查看调用图 我尝试使用 OProfile Kernel perf 和 Google 性能工具 一切正常 但不输出任何调用图信息 这使我得出结论 我没有正确编译代码 我在编译 C 代
  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include
  • M1 MacBook Pro 上的 Android Studio 无法使用 ABI armeabi-v7a 模拟系统映像

    我的 M1 Macbook Pro 上的 Android Studio 可以很好地模拟 ABI arm64 v8a 的所有系统映像 API 24 29 30 31 但是 它无法使用 ABI armeabi v7a 运行所有映像 例如 API
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • DS-5:什么是 FVP、RTSM、基础模型、AEM 模型、快速模型、CADI?

    DS 5 模拟器使用了很多术语 如 FVP RTSM 快速模型 基础模型 AEM 模型 CADI Arm的文档中提供的解释不是很清楚 这些术语的含义是什么 作为 DS 5 的最终用户我应该关心哪些术语 Model 软件模拟的行业术语 就 A
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 交叉编译armv5,但它创建v7二进制文件

    我设法为arm926ej s创建了一个目标文件我在 qemu 上使用 Debian Arm arm linux gnueabi gcc 4 4 static O c mcpu arm926ej s hello c o hello root
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • A64 Neon SIMD - 256 位比较

    我想将两个小端 256 位值与 A64 Neon 指令 asm 进行有效比较 平等 为了平等 我已经有了解决方案 bool eq256 const UInt256 lhs const UInt256 rhs bool result 首先 将

随机推荐

  • redhat-8-0重置root密码

    前导 如果你忘记了RHEL 8系统中的root密码 xff0c 那就得重置root密码 xff0c 以下为在Grub启动菜单中在RHEL 8上进行手动密码恢复 引导 重启RHEL 8系统 将系统重启 xff0c 在看到grub菜单后 xff
  • Debian10使用本地ISO搭建APT源

    前言 这是个坑 xff01 是个大坑 xff01 如果在配置debian10本地源的时候 xff0c 直接使用apt cdrom add命令创建本地源后 xff0c 在安装软件的时候会有很大几率找不到软件包的位置然后报错 报错 E The
  • Debian10.x创建Raid5

    技术简介 RAID5技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中 RAID 5磁盘阵列组中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中 xff0c 而是存储到除自身以外的其他每一块硬盘设备上 xff0c 这样的好处是其中任何
  • Debian10.x创建NFS

    技术简介 NFS xff08 网络文件系统 xff09 服务可以将远程Linux系统上的文件共享资源挂载到本地主机的目录上 xff0c 从而使得本地主机 xff08 Linux客户端 xff09 基于TCP IP协议 xff0c 像使用本地
  • Windows下 gcc编译环境的构建(Sublime + Mingw)

    1 起源 Windows 7下VC 6 0装起来很困难 xff0c 不得不装了个Visual Studio 2010 Express 但感觉比庞大 xff0c 并且在程序运行的最后不会暂停 2 计划采用Sublime加Mingw构建一个gc
  • Linux下安装xrdp

    Linux下安装xrdp 使用rdp协议访问远程Linux桌面 一般情况下 xff0c 如果需要登陆远程Linux系统 xff0c 我们会使用ssh telnet来完成 xff0c 如果需要登陆到远程Linux系统的桌面环境 xff0c 我
  • bootstrap模态对话框宽度设置

    39 addFormbox 39 modal css width 39 auto 39 39 margin left 39 function return this width 2
  • Debian10.x简易配置DHCP服务器

    环境 Client 网卡1 系统 xff1a debian10 Server xff1a 三网卡IP 10 10 100 254 IP 172 16 100 254 IP xff1a 192 16 100 254 实施步骤 安装 apt i
  • haproxy各个指标的打印报告解析

    1 使用这个命令就可以获取haproxy所有的数据 span class hljs keyword echo span span class hljs string 34 show stat 34 span socat span class
  • CentOS7使用firewalld打开关闭防火墙与端口火墙与端口

    CentOS7使用firewalld打开关闭防火墙与端口火墙与端口 启动 xff1a systemctl start firewalld 关闭 xff1a systemctl stop firewalld 查看状态 xff1a system
  • poj 1752 Advertisement (区间差分约束+最长路 输出可行解)

    Advertisement Time Limit 1000MS Memory Limit 10000KTotal Submissions 919 Accepted 331 Special Judge Description The Depa
  • OSI 七层模型详解

    大家好 xff0c 我是蛋蛋 3T 43 技术学习视频资源 xff0c 500 43 技术电子书 xff0c 大量高效工具及网站 xff0c 私信回复 资源 即可免费获取 OSI xff08 Open System Interconnect
  • WebService的简单示例

    今天 xff0c 看到需求需要WebService进行通信 xff0c 所以我就先看看WebService是怎样的一个流程 xff0c 这里做个简单实例 首先我创建了两个工程 xff0c 一个为服务端 xff0c 另一个为客户端 part1
  • 今日头条2018校园招聘后端开发工程师 (第二批) 编程题 - 字母交换

    题目描述 xff1a 编码题 字符串S由小写字母构成 xff0c 长度为n 定义一种操作 xff0c 每次都可以挑选字符串中任意的两个相邻字母进行交换 询问在至多交换m次之后 xff0c 字符串中最多有多少个连续的位置上的字母相同 xff1
  • php 报错:A non-numeric value encountered

    意思是 39 遇到了非数值异常 39 xff0c 可能是你的代码里字符串拼接习惯性的将 39 39 写成了 39 43 39 所导致
  • linux系统变为只读,提示Read-only file system的解决办法

    mount o rw remount
  • 修改Debian登录窗口背景图片

    仅记录以便日后使用 xff1a 执行gresource export sh xff0c 将资源文件备份到 HOME shell theme目录将导出的 HOME shell theme theme中的所有文件 xff0c 保存到gnome
  • 【MySQL】Navicat修改数据库名称

    假设 xff1a 有一个数据库 xff0c 名称为A xff0c 需要修改为B 在Navicat中不可以按F2修改数据库的名称 xff0c 我们必须新建一个库 xff0c 命名为B 下面4种方式都可以实现目标 如果数据库中有远程表和权限设置
  • CityScapes数据集介绍

    CityScapes Cityperson数据集 xff0c 在16年CVPR上被提出 xff0c 是张姗姗一波人在CityScapes数据集上进行标注得到的行人检测数据集 做行人检测的应该都不陌生 在Replusion Loss和NMS
  • ARM学习(18) Jink Ozone调试总结

    笔者来聊聊Jink Ozone调试 1 Ozone加载选择elf或者bin Ozone调试的时候可以设置PC的位置 xff0c 主要有上面两种 从ELF读取PC位置 xff0c 调试时直接设置PC的初始位置从向量表中读取pc的初始值 xff