单片机list文件解析及 hardfalt问题定位
单片机list文件解析
单片机list文件解析.
单片机开发中 lst 文件 在调试中有很高的参考价值, 从list文件总基本可用看出所有的目标文件信息. 看出我们汇编文件在内存中的分布及执行过程. 进而发现一些隐藏的BUG.
st 文件实际是使用 objdump 反汇编 elf 文件得到的输出文件,它拥有比 map 文件更详细的信息。如果你的程序中加入了调试信息,那么你可以在 lst 中看到每一条指令的地址。借助 lst 文件,同时通过查看栈帧结构(可以通过查看相应的手册来确定栈帧的组成),通过在 lst 文件中查找 lr 的地址所在的位置,你就能立刻定位到问题。
以CH582 的工程配置为例, 项目->属性->C/C++构建->设置->工具设置->GNU RISC-V Create Flash Image->General,你可以在这个选项中指定更详细的信息。
文件总含有丰富的信息. listing file中出现的先后顺序加以说明:
1.页头段(Page Header)
每个lst文件都有一个包含了编译器版本号、源文件名称、日期、时间、页号的头部。示例:
EC_BLE_SOC.elf: file format elf32-littleriscvarchitecture: riscv:rv32, flags 0x00000112:EXEC_P, HAS_SYMS, D_PAGEDstart address 0x00000000
还包含内部所有代码块的, 头地址.
Program Header:LOAD off 0x00001000 vaddr 0x00000000 paddr 0x00000000 align 2**12filesz 0x00000004 memsz 0x00000004 flags r-xLOAD off 0x00002000 vaddr 0x20000000 paddr 0x00000004 align 2**12filesz 0x0000287c memsz 0x0000287c flags r-xLOAD off 0x00004880 vaddr 0x00002880 paddr 0x00002880 align 2**12filesz 0x000291bc memsz 0x000291bc flags r-xLOAD off 0x0002e87c vaddr 0x2000287c paddr 0x0002ba3c align 2**12filesz 0x000005ac memsz 0x00002f20 flags rw-
符号列表段(Sections table)
符号表段含有,所有符号的入口地址及大小,符号列表段包含了源程序文件中定义的变量信息,比如变量名称、类别(SFR、structure、typedef、static、public、auto、extern)、存储空间、数据类型、偏移量、占用 字节数等。SYMBOLS 指令控制LST文件产生符号列表段。所有变量及函数的入口都在这里
示例1.段类型
Sections:
Idx Name Size VMA LMA File off Algn Flags0 .init 00000004 00000000 00000000 00001000 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE1 .highcodelalign 00000000 00000004 00000004 0002ee28 2**0 CONTENTS2 .highcode 0000287c 20000000 00000004 00002000 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE3 .text 000291bc 00002880 00002880 00004880 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE4 .fini 00000000 0002ba3c 0002ba3c 0002ee28 2**0 CONTENTS, ALLOC, LOAD, CODE5 .dalign 00000000 2000287c 2000287c 0002ee28 2**0 CONTENTS6 .dlalign 00000000 0002ba3c 0002ba3c 0002ee28 2**0 CONTENTS7 .data 000005ac 2000287c 0002ba3c 0002e87c 2**2 CONTENTS, ALLOC, LOAD, DATA8 .bss 00002974 20002e28 0002bfe8 0002ee28 2**3 ALLOC9 .stack 00000000 20008000 20008000 0002ee28 2**0 CONTENTS10 .debug_info 000399df 00000000 00000000 0002ee28 2**0 CONTENTS, READONLY, DEBUGGING11 .debug_abbrev 00006f9c 00000000 00000000 00068807 2**0 CONTENTS, READONLY, DEBUGGING12 .debug_loc 0000a5a1 00000000 00000000 0006f7a3 2**0 CONTENTS, READONLY, DEBUGGING13 .debug_aranges 00000b40 00000000 00000000 00079d48 2**3 CONTENTS, READONLY, DEBUGGING14 .debug_ranges 00001f40 00000000 00000000 0007a888 2**3 CONTENTS, READONLY, DEBUGGING15 .debug_line 0001c557 00000000 00000000 0007c7c8 2**0 CONTENTS, READONLY, DEBUGGING16 .debug_str 00006518 00000000 00000000 00098d1f 2**0 CONTENTS, READONLY, DEBUGGING17 .comment 00000033 00000000 00000000 0009f237 2**0 CONTENTS, READONLY18 .debug_frame 00002b40 00000000 00000000 0009f26c 2**2 CONTENTS, READONLY, DEBUGGING19 .stab 00000084 00000000 00000000 000a1dac 2**2 CONTENTS, READONLY, DEBUGGING20 .stabstr 00000117 00000000 00000000 000a1e30 2**0 CONTENTS, READONLY, DEBUGGING
示例2.程序及变量符号表
SYMBOL TABLE:
00000000 l d .init 00000000 .init
00000004 l d .highcodelalign 00000000 .highcodelalign
20000000 l d .highcode 00000000 .highcode
00002880 l d .text 00000000 .text
0002ba3c l d .fini 00000000 .fini
2000287c l d .dalign 00000000 .dalign
0002ba3c l d .dlalign 00000000 .dlalign
2000287c l d .data 00000000 .data
20002e28 l d .bss 00000000 .bss
20008000 l d .stack 00000000 .stack
00000000 l df *ABS* 00000000 core_riscv.c
00000000 l df *ABS* 00000000 CH58x_adc.c
00000000 l df *ABS* 00000000 CH58x_clk.c
00000000 l df *ABS* 00000000 CH58x_gpio.c
00000000 l df *ABS* 00000000 CH58x_uart0.c
00000000 l df *ABS* 00000000 CH58x_uart1.c
00000000 l df *ABS* 00000000 CH58x_uart2.c
00000000 l df *ABS* 00000000 CH58x_uart3.c
00000000 l df *ABS* 00000000 Command.c
20002db8 l O .data 00000004 erase_seq
20002dbc l O .data 00000004 p.6140
00000000 l df *ABS* 00000000 bsp_Initial.c
00000000 l df *ABS* 00000000 bsp_adc.c
00000000 l df *ABS* 00000000 bsp_ctrl.c
20002dc0 l O .data 00000004 s.6140
00000000 l df *ABS* 00000000 bsp_key.c
20002e40 l O .bss 00000006 keyc
20002e48 l O .bss 00000006 keys
00000000 l df *ABS* 00000000 bsp_led.c
00000000 l df *ABS* 00000000 bsp_storer.c
20002de3 l O .data 00000001 buz_count
20002de4 l O .data 00000001 led_count
00000000 l df *ABS* 00000000 message.c
00000000 l df *ABS* 00000000 gap.c
0000aae2 l F .text 00000022 disconnectNext
20002ea4 l O .bss 00000006 gapCurrentRandomAddr
20002eb4 l O .bss 00000004 pfnCentralCBs
20002eb8 l O .bss 00000004 pfnCentralConnCBs
20002ebc l O .bss 00000004 pfnPeripheralCBs
20002ec0 l O .bss 00000004 pfnPeripheralConnCBs
20002ec4 l O .bss 00000008 slaveUpdateReq
20002ecc l O .bss 00000001 terminateAllTaskID
20002ecd l O .bss 00000001 terminateReason
00000000 l df *ABS* 00000000 gap_central.c
0000c458 l F .text 0000003a gapSendScanEnable
源码段(Source Code)及汇编代码段(Assembly Listing)
源码段展示了每行源程序及其行号。COND指令,可以控制条件编译代码(#if 作用范围内的代码)被源码段列出,NOCOND指令,可以控制条件编译代码不被源码段列出。用户可以使用 LISTINCLUDE 指令,让源码段显示 #include 所包含的文件内容,默认情况下,#include包含的文件内容不被显示。汇编代码段包含了由C语言程序编译产生的汇编代码,CODE 指令可以控制LST文件产生汇编代码段。
两者信息交错在一起, 可以对照看一下源码及编译好的目标汇编代码. 可以看出编译的情况.
源码及汇编代码段示例:启动代码
Disassembly of section .init:00000000 <_sinit>:.section .init,"ax",@progbits.global _start.align 1
_start:j handle_reset0: 0810206f j 2880 <handle_reset>Disassembly of section .highcode:20000000 <_highcode_vma_start>:...
20000008: 0090 addi a2,sp,64
2000000a: 2000 fld fs0,0(s0)
2000000c: 0938 addi a4,sp,152
2000000e: 2000 fld fs0,0(s0)
20000010: bda9 j 1ffffe6a <_data_lma+0x1ffd442e>
20000012: f5f9 bnez a1,1fffffe0 <_data_lma+0x1ffd45a4>
20000014: 0094 addi a3,sp,64
20000016: 2000 fld fs0,0(s0)
....
主程序编译结果示例:
00006048 <main_task_init>:
//名称: sys_init
//功能: 系统主程序初始化
//参数: 无
//返回值: 无
void main_task_init(void)
{6048: 1141 addi sp,sp,-16SetSysClock( CLK_SOURCE_PLL_60MHz );604a: 04800513 li a0,72
{604e: c606 sw ra,12(sp)SetSysClock( CLK_SOURCE_PLL_60MHz );6050: 1fffa097 auipc ra,0x1fffa6054: 490080e7 jalr 1168(ra) # 200004e0 <SetSysClock>motor_io_Init();6058: 9e3fe0ef jal ra,4a3a <motor_io_Init>DelayMs(100);605c: 06400513 li a0,1006060: 1fffa097 auipc ra,0x1fffa6064: 638080e7 jalr 1592(ra) # 20000698 <mDelaymS>sys_para_init(); //初始化全局参数6068: fcdfe0ef jal ra,5034 <sys_para_init>sys_state_init();606c: ed7fe0ef jal ra,4f42 <sys_state_init>sys_monitor_init();//启动看门狗监视6070: 3e5030ef jal ra,9c54 <sys_monitor_init>
......00006084 <main>:
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void)
{6084: 1141 addi sp,sp,-166086: c606 sw ra,12(sp)main_task_init();6088: 37c1 jal 6048 <main_task_init>systask_Create();608a: 355d jal 5f30 <systask_Create>log("%s\r\n", VER_LIB);608c: 1fffa097 auipc ra,0x1fffa6090: 628080e7 jalr 1576(ra) # 200006b4 <Log_get_pbuff>6094: 00025617 auipc a2,0x256098: 2bc60613 addi a2,a2,700 # 2b350 <VER_LIB>609c: 00025597 auipc a1,0x2560a0: f9058593 addi a1,a1,-112 # 2b02c <DeviceName+0x3ec>60a4: 565220ef jal ra,28e08 <siprintf>60a8: 1fffa097 auipc ra,0x1fffa60ac: 676080e7 jalr 1654(ra) # 2000071e <Log_pbuff_out>log("\r\n系统启动完成2\r\n");60b0: 1fffa097 auipc ra,0x1fffa60b4: 604080e7 jalr 1540(ra) # 200006b4 <Log_get_pbuff>60b8: 4649 li a2,1860ba: 00025597 auipc a1,0x2560be: a5e58593 addi a1,a1,-1442 # 2ab18 <FW_VERSION+0x10>60c2: 36b220ef jal ra,28c2c <memcpy>60c6: 1fffa097 auipc ra,0x1fffa60ca: 658080e7 jalr 1624(ra) # 2000071e <Log_pbuff_out>while(1) {TMOS_SystemProcess();60ce: 1fffb097 auipc ra,0x1fffb60d2: 17a080e7 jalr 378(ra) # 20001248 <TMOS_SystemProcess>60d6: bfe5 j 60ce <main+0x4a>
......
子程序编译结果示例:
20000698 <mDelaymS>:
__HIGH_CODE
void mDelaymS(uint16_t t)
{uint16_t i;for(i = 0; i < t; i++)
20000698: cd09 beqz a0,200006b2 <mDelaymS+0x1a>
2000069a: 4701 li a4,0
2000069c: 6691 lui a3,0x4
2000069e: a9868793 addi a5,a3,-1384 # 3a98 <Log_uart1_txisr+0x5c>__nop();
200006a2: 0001 nop
200006a4: 17fd addi a5,a5,-1} while(--i);
200006a6: fff5 bnez a5,200006a2 <mDelaymS+0xa>for(i = 0; i < t; i++)
200006a8: 0705 addi a4,a4,1
200006aa: 0742 slli a4,a4,0x10
200006ac: 8341 srli a4,a4,0x10
200006ae: fee518e3 bne a0,a4,2000069e <mDelaymS+0x6>{mDelayuS(1000);}
}
200006b2: 8082 ret
参考list文件追踪 hardfalt 问题
从 .lst 文件总可以看到很多有用的信息, 特别是代码的编译结果和在内存中的分布. 结合调试PC信息能很容易追踪到棘手的 hardfalt 问题. 以及找出程序报错的地方
写一段错误代码:
//非对齐的地址取int数据
void hardfault_test(void) {int a,*p;while(1){DelayMs(100);for(int i=0;i<16;i++) {p = (int *)(0x200+i);a = *p;printf("test:%X\r\n",a);}}
}
在hardfalt中断中打印出错点 PC值
hardfault
mepc:000025ca
mcause:00000004
mtval:00000201
编译出来的list结果:
//对非4字节对齐的地址取uint32_t
void hardfault_test(void) {25a4: 1141 addi sp,sp,-1625a6: c226 sw s1,4(sp)25a8: c04a sw s2,0(sp)25aa: c606 sw ra,12(sp)25ac: c422 sw s0,8(sp)DelayMs(100);for(int i=0;i<16;i++) {p = (int *)(0x200+i);a = *p;printf("test:%X\r\n",a);25ae: 00002917 auipc s2,0x225b2: 91a90913 addi s2,s2,-1766 # 3ec8 <cmd_mm+0x78>for(int i=0;i<16;i++) {25b6: 21000493 li s1,528DelayMs(100);25ba: 06400513 li a0,10025be: 1fffe097 auipc ra,0x1fffe25c2: 0da080e7 jalr 218(ra) # 20000698 <mDelaymS>25c6: 20000413 li s0,512printf("test:%X\r\n",a);25ca: 400c lw a1,0(s0)25cc: 854a mv a0,s225ce: 0405 addi s0,s0,125d0: 2d01 jal 2be0 <iprintf>for(int i=0;i<16;i++) {25d2: fe941ce3 bne s0,s1,25ca <hardfault_test+0x26>25d6: b7d5 j 25ba <hardfault_test+0x16>
很明显就在list文件里面,我们可以找到000025ca地址对应的行, 这一行是一条取值的指令, 从0x0201的地址尝试取出一个int. 很明显这个里不对齐的地址会产生了一个hardfault.
单片机list文件解析及 hardfalt问题定位相关推荐
- AUTOSAR从入门到精通100讲(十五)-AURIX TC3xx MCAL中Link文件解析以及代码变量定位方法详解
一 TC3xx系列MCAL中TASKING Link文件解析以及代码变量定位方法 1 TASKING Link文件解析 1.1 DSRAM中的数据存放: 在AURIX™ 2G中(以TC387为例),每 ...
- exe文件解析_PE文件格式之重定位表
一.重定向表的作用: 这个在网上有很多种解释,那我也说一下自己对这个表的解释,程序运行的时候一般有两种方式来调用函数就是OD的那个CALL,一个是基址+偏移,另一种就是写死的函数地址比如 CALL 0 ...
- asp.net中各种类型文件解析 收藏
asp.net中各种类型文件解析 收藏 ASP.NET的页面文件是*.aspx,每个页面对应一个*.resx资源文件和一个*.aspx.cs的代码文件. *.resx是资源文件.每个页面都有一个资源文 ...
- elf文件格式_Android so(ELF) 文件解析
Android so(ELF) 文件解析 Android so(ELF) 文件解析 前言 生成 so 文件 相关工具 objdump readelf 整体结构图 头部结构 段表结构 字符串表结构 程序 ...
- 嵌入式知识-ARM裸机-学习笔记(2):利用GPIO来控制LED(附mkv210_image.c文件解析)
嵌入式知识-ARM裸机-学习笔记(2):利用GPIO来控制LED(附mkv210_image.c文件解析) 首先声明该博客是针对朱有鹏老师的嵌入式课程进行笔记的总结. 一.通过GPIO控制点亮LED( ...
- 三维模型obj文件解析
目录 obj文件简介 文件结构 顶点数据(Vertex data): 自由形态曲线(Free-form curve)/表面属性(surface attributes): 元素(Elements): 自 ...
- 安卓系统文件夹及其文件解析
安卓系统文件夹及其文件解析 打开Android文件管理器,会发现里面数十个英文名称命名的文件夹罗列其中,很多功能我们可以从其名字上略有所知,内部大批量的文件却让我们有些一头雾水.这些文件是什么?有什么 ...
- PDF 与 PS页面描述语言与PDF文件解析(转)
PDF 与 PS页面描述语言与PDF文件解析(转) 页面描述语言 页面描述语言(Page Description Language,简称PDL)是一种面向输出效应的语言,用于描述打印或照排的版面,这种 ...
- Python大文件解析的效率问题
论坛求助与自行摸索相结合,基本解决python大文件解析效率问题.现将过程与结论存档,供有需要者参考. =================前言==================== 看着python ...
最新文章
- 不懂编程可以自学python吗-我不会编程,也可能学会Python吗?
- JSP中四种传递参数的方法
- SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户
- 分析Android银行木马GM Bot的变异过程
- 八十九、常见的圣杯布局和双飞翼布局
- Boost字符串处理
- 17 张程序员专属壁纸,有你喜欢的吗?
- windows自定义快速启动(运行)命令
- 机器视觉及图像处理系列之二(C++,VS2015)——图像级的人脸识别(1)
- Linux系统GCC常用命令和GCC编译过程描述
- JMeter之性能监控插件PerfMon Metrics Collector
- iPhone突然掉电快是什么情况,该如何解决?
- 得到语音下载(dedaodown)
- YOLOv5 anchor 编码(label assign)方式详解
- Quantopian自学笔记03
- 使用连接管理器出现“安装程序无法复制文件”错误的解决方法
- 贷款买二手房 这4笔钱你都准备好了么?
- 使用face-api实现html前端摄像头人脸检测
- 看清大厂面目:美光宣布暂停向华为供货!
- C++ 计166-1 C语言实验——圆柱体计算
热门文章
- python 招聘 海盐_聚焦普高新课标 提升信息核心素养——海盐县初中信息技术Python课堂教学研讨活动在武原中学举行...
- tomcat 6x and 7x https配置
- IOS 世界标准时间UTC /GMT 转为当前系统时区对应的时间
- 秒杀排列组合(上)————排列篇
- JAVA蘑菇西餐,蘑菇的二十二种西餐做法,简单易上手,让你品尝不一样的风味...
- 小程序点击多个指定地方都能关闭弹框
- Python爬虫抓取某音乐网站MP3(下载歌曲、存入Sqlite)
- 饿了么“盛夏之战”,背后的底气是什么? | 一点财经
- 阿里云个人镜像仓库日常基本使用
- 使用阿里云实现短信发送服务(测试版)