CM3:lldb 调试 qemu 跑的程序

embedded/2024/9/23 9:18:05/

正文

环境:macOS M1。
QEMU可以通过启动一个GDB调试端口来允许使用GDB调试正在运行的虚拟机,我们要做的就是通过 gdb 或者 lldb 连接到这个端口,然后进行调试。
我们先写一个简单的CM3 程序:

    .equ STACK_TOP, 0x20000800.text.global _start.code 16.syntax unified_start:.word STACK_TOP,start.type start,function
start:movs r0, #10movs r1, #0
loop:adds r1, r0subs r0, #1bne loop
deadloop:b deadloop.end

这个程序的作用是来计算 10+9+...+1的结果。

我们通过这几个命令来完成汇编、链接、目标拷贝,甚至还可以生成反汇编代码,用来辅助查看:

arm-none-eabi-as -mcpu=cortex-m3 -mthumb example1.s -o example1.o
arm-none-eabi-ld -Ttext=0x0 -o example1.out example1.o
arm-none-eabi-objcopy -O binary example1.out example1.bin
arm-none-eabi-objdump -S example1.out > example1.list

汇编的代码 list:


example1.out:     file format elf32-littlearmDisassembly of section .text:00000000 <_start>:0:	20000800 	.word	0x200008004:	00000009 	.word	0x0000000900000008 <start>:8:	200a      	movs	r0, #10a:	2100      	movs	r1, #00000000c <loop>:c:	1809      	adds	r1, r1, r0e:	3801      	subs	r0, #110:	d1fc      	bne.n	c <loop>00000012 <deadloop>:12:	e7fe      	b.n	12 <deadloop>

然后我们启动调试功能:

qemu-system-arm -M lm3s6965evb -serial stdio -kernel example1.bin -s -S

这个命令使用QEMU模拟器来模拟lm3s6965evb开发板上的ARM处理器,并加载example1.bin文件作为内核镜像。具体来说,这个命令的各个参数的作用如下:

  • -M lm3s6965evb:指定使用QEMU模拟器模拟lm3s6965evb开发板,该开发板基于Cortex-M3处理器。
  • -serial stdio:将串口输出重定向到标准输入输出,这样可以在控制台上查看虚拟机的输出信息。
  • -kernel example1.bin:指定将example1.bin文件作为内核镜像加载到虚拟机中运行。
  • -s:启动GDB服务器,监听默认端口1234,允许通过GDB进行远程调试。
  • -S:在启动时暂停虚拟机,等待GDB连接后再开始执行。

然后我们来通过 lldb 连接到这个端口:

lldb
(lldb) gdb-remote 1234
Process 1 stopped
* thread #1, stop reason = signal SIGTRAPframe #0: 0x00000008
->  0x8: .long  0x2100200a                ; unknown opcode0xc: stmdalo r1, {r0, r3, r11, r12}0x10: udf    #0xed1c0x14: andeq  r0, r0, r0
Target 0: (No executable module.) stopped.

这个信息表明已经成功通过LLDB连接到QEMU的GDB调试端口,并且虚拟机已经被暂停在一个位置。在这个特定的情况下,虚拟机暂停在地址0x00000008处,这是一个未知的指令。下面是对输出信息的解释:

  • Process 1 stopped:虚拟机中的进程已经停止。
  • thread #1, stop reason = signal SIGTRAP:线程1停止的原因是收到了SIGTRAP信号,这通常是由调试器发送给进程的信号,用于暂停执行。
  • frame #0: 0x00000008:当前帧在地址0x00000008处。
  • 0x8: .long 0x2100200a:在地址0x00000008处,存储的是一个未知的指令0x2100200a
  • 0xc: stmdalo r1, {r0, r3, r11, r12}:接下来的指令是stmdalo r1, {r0, r3, r11, r12}
  • 0x10: udf #0xed1c:接下来的指令是udf #0xed1c
  • 0x14: andeq r0, r0, r0:接下来的指令是andeq r0, r0, r0

最后一行Target 0: (No executable module.) stopped.表示当前没有可执行模块,即虚拟机中没有正在执行的程序。
继续单步执行,之后打印寄存器,看看运行情况:

(lldb) register read
general:r0 = 0x00000006r1 = 0x00000022r2 = 0x00000000r3 = 0x00000000r4 = 0x00000000r5 = 0x00000000r6 = 0x00000000r7 = 0x00000000r8 = 0x00000000r9 = 0x00000000r10 = 0x00000000r11 = 0x00000000r12 = 0x00000000sp = 0x20000800lr = 0xffffffffpc = 0x00000010xpsr = 0x21000000msp = 0x20000800psp = 0x00000000primask = 0x00000000control = 0x00000000basepri = 0x00000000faultmask = 0x00000000

可以看到,r0 此时为 6,这也和 r1 = 10+9+8+7=0x22 吻合。

这就是一次简单的调试任务。


http://www.ppmy.cn/embedded/28738.html

相关文章

TinyML之Hello world----基于Arduino Nano 33 BLE Sense Rev2的呼吸灯

早期版本的Hello World 这应该是一个逼格比较高的呼吸灯了&#xff0c;用ML来实现呼吸灯功能&#xff0c;之前已经有大佬发过类似的文章&#xff1a;https://blog.csdn.net/weixin_45116099/article/details/126310816 当前版本的Hello World 这是一个ML的入门例程&#xff…

结构方程模型(SEM)时间重复测量数据分析

张老师&#xff08;研究员&#xff09;&#xff0c;长期从事R语言结构方程模型、群落生态学、保护生物学、景观生态学和生态模型方面的研究和教学工作&#xff0c;已发表了多篇论文&#xff0c;拥有丰富的科研及实践经验。 很多研究需要进行多个时间点&#xff08;如天/月/年&…

【书生·浦语大模型实战营第二期】LMDeploy量化部署LLM实践——学习笔记5

文章目录 LMDeploy环境部署LMDeploy模型对话使用Transformers库运行模型使用LMDeploy与模型对话 LMDeploy量化部署(lite)设置最大KV Cache缓存大小使用W4A16量化 LMDeploy服务(serve)启动API服务器命令行客户端连接FASTAPI服务器网页客户端连接FASTAPI服务器 Python代码集成参考…

ubuntu开启message文件

环境&#xff1a;ubuntu 20.04 1、首先需要修改 /etc/rsyslog.d/50-default.conf 文件&#xff1b;源文件中message被注释&#xff0c;如下图&#xff1a; 2、打开注释&#xff1a; 3、重启服务 systemctl restart rsyslog.service 如此即可&#xff01;

【设计模式】之责任链模式

系列文章目录 【设计模式】之策略模式 文章目录 系列文章目录 前言 一、什么是责任链模式 二、有什么使用场景呢 三、如何使用责任链模式 总结 前言 上次我们了解了设计模式中的策略模式&#xff0c;今天我们继续学习责任链模式。&#x1f308; 一、什么是责任链模式 为…

企微SOP新风尚:构建高效、精准的营销流程

随着企业微信&#xff08;企微&#xff09;在营销领域的广泛应用&#xff0c;越来越多的企业开始重视企微SOP&#xff08;Standard Operating Procedure&#xff0c;标准操作流程&#xff09;的建设。一个完善的企微SOP不仅能够帮助企业实现营销流程的标准化和规范化&#xff0…

TDengine写入2000万数据查询体验

最近在寻找时序数据库&#xff0c;想应用在公司的项目上。 上一篇文章实验了InfluxDB:windows上使用influx2.7学习,还学习了flux语言&#xff0c;最后发现宽表查询比较困难&#xff0c;就放弃了&#xff0c;于是决定试试国产时序数据库TDengine 参考 官方文档&#xff1a;htt…

QT-QTCreator环境配置

准备工作&#xff1a; 下载QT: 链接&#xff1a;https://pan.baidu.com/s/1prJcsC4DGqhKiXvLuPQFVA?pwd60b3 提取码&#xff1a;60b3下载WindowsKits&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1QNiS3HpbH5M5kXx5AhkqnQ?pwde2h8 提取码&#xff1a;e2h8安装的…