硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1931|回复: 23
收起左侧

[MDK] 用脚本自动调试运行

  [复制链接]

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
发表于 2024-9-1 10:29:44 | 显示全部楼层 |阅读模式
在调试代码的时候突发奇想。就是能不能搞个自动化的脚本程序,实现有目的的断点调试。

比如,keil+stlink这种。一般调试都是直接在某处代码上打个断点等待运行到断点处停止。这种情况有个限制,就是没有开优化等级的时候是准确的。
一旦开了-o3这种优化的话,那断点打的就基本不准确了。
所以,这个时候,如果想要断点观察某个状态的内核状态和寄存器值时,就没法进行了。
如果能写个脚本的话,就是一直单步运行,然后单步后就读取R0~R12这些寄存器的值。这样一直运行到某个特定状态,比如 R0=0xaa55时自动停止。
像cubeprogrammer这个软件也是可以观察内核寄存器的值的。也可以手动单步运行这些操作。但好多不支持类似python脚本这种自动程序的处理。
这种调试想法能不能实现啊

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-9-2 08:49:39 | 显示全部楼层
帮顶。
回复

使用道具 举报

0

主题

33

回帖

33

积分

新手上路

积分
33
发表于 2024-9-2 09:15:00 | 显示全部楼层
用  pyocd 做应该可以
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-9-2 09:17:22 | 显示全部楼层
一直读内核寄存器太慢了,内核速率起码几十M,一般仿真器顶多就几M,如果一直单步跑,外设跑得比内核还快,程序都没法正常运行。
应该没有针对内核寄存器的断点和watchpoint,如果是变量的话断点和watchpoint就能搞定大部分情况了。
O3优化这个没啥太好的办法,如果楼主比较懂汇编可以根据反汇编用jlinkcommander自己手动打断点和watchpoint
回复

使用道具 举报

3

主题

78

回帖

87

积分

初级会员

积分
87
发表于 2024-9-2 11:18:41 | 显示全部楼层
openocd结合GDB,可以用脚本实现你说的,但是这种方式是上古时期的,没有图形化,只能通过按键的方式,类似vim!
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2024-9-8 08:48:03 | 显示全部楼层
skyshine 发表于 2024-9-2 09:17
一直读内核寄存器太慢了,内核速率起码几十M,一般仿真器顶多就几M,如果一直单步跑,外设跑得比内核还快, ...

像keil+stlink的调试原理,或是 stlink ulitily 这种内核状态信息读取软件这种,有没有什么文档和资料可以参考呀。是只能看arm内核的技术文档吗?
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-9-9 10:17:41 | 显示全部楼层
jplzl10000 发表于 2024-9-8 08:48
像keil+stlink的调试原理,或是 stlink ulitily 这种内核状态信息读取软件这种,有没有什么文档和资料可 ...

可以看daplink源码解析,网上挺多的
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-9-9 10:23:20 | 显示全部楼层
核心是swd_read_dp和swd_read_ap
回复

使用道具 举报

219

主题

1109

回帖

1776

积分

至尊会员

More we do, more we can do.

积分
1776
发表于 2024-9-9 18:30:24 | 显示全部楼层
听你需求,感觉用汇编断点就可以了。
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2024-9-10 14:39:04 | 显示全部楼层
skyshine 发表于 2024-9-9 10:17
可以看daplink源码解析,网上挺多的

这种是swd的协议,不是stlink/jlink这种通讯协议。
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2024-9-10 14:39:43 | 显示全部楼层
emwin 发表于 2024-9-9 18:30
听你需求,感觉用汇编断点就可以了。

只是举个例子,核心是通过python这种脚本来自动化的单步运行
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2024-9-10 14:40:40 | 显示全部楼层
跟着硬汉学 发表于 2024-9-2 11:18
openocd结合GDB,可以用脚本实现你说的,但是这种方式是上古时期的,没有图形化,只能通过按键的方式,类似 ...

找到个pyswd的好像可以用。就是不知道这个stlink的协议说明哪里找的到。找不到的话,只能去看这个pyswd的源码了
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-9-10 15:41:49 | 显示全部楼层
jplzl10000 发表于 2024-9-10 14:39
这种是swd的协议,不是stlink/jlink这种通讯协议。

你的意思是link的usb协议吗,还是gdb和link之间的协议?jlink有usb协议的文档,用wireshark可以抓包。gdb这里是通过gdbserver实现的,上位机进行gdb调试的时候,gdbserver就负责把gdb调试指令转换成link的指令下发给link,这部分可以看openocd源码
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-9-10 16:06:40 | 显示全部楼层
jplzl10000 发表于 2024-9-10 14:40
找到个pyswd的好像可以用。就是不知道这个stlink的协议说明哪里找的到。找不到的话,只能去看这个pyswd的 ...

搜了下stlink似乎没有公开usb协议文档,jlink有泄露的usb协议文档,网上很容易找到,实际使用也不难,都不用分析usb协议,直接调用现成的jlink的dll就行,可以实现断点和单步调试。你要直接通过usb控制link的话有点难度,可以借助openocd或者pyocd,参考xivn1987大佬的:https://github.com/XIVN1987/DAPCmdr
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2024-9-11 08:15:12 | 显示全部楼层
skyshine 发表于 2024-9-10 16:06
搜了下stlink似乎没有公开usb协议文档,jlink有泄露的usb协议文档,网上很容易找到,实际使用也不难,都 ...

试了下这个pyswd的效果,还可以,可以用python来控制stlink实现基本操作,reset/halt/run/read-write-core-register这些都实现了。抓了下usb的通信包,和stlink ulitily软件的包是一样的。不知道写这个pyswd的哪来的协议。只能在pyswd源码中找找看有没有蛛丝马迹了
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2024-9-11 10:02:10 | 显示全部楼层
跟着硬汉学 发表于 2024-9-2 11:18
openocd结合GDB,可以用脚本实现你说的,但是这种方式是上古时期的,没有图形化,只能通过按键的方式,类似 ...

openocd的好像可以设置运行断点,就是设置个地址,运行到后停止。但我找的这个pyswd没有这个功能。类似keil里面调试,运行到断点就停止这种是个什么原理呢。要怎么实现这种运行到目标地址后halt住pc
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2024-9-12 08:22:02 | 显示全部楼层
skyshine 发表于 2024-9-10 16:06
搜了下stlink似乎没有公开usb协议文档,jlink有泄露的usb协议文档,网上很容易找到,实际使用也不难,都 ...

看了下pyswd的源码,只有这种分段式的协议说明,如下图


回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-9-12 10:12:47 | 显示全部楼层
jplzl10000 发表于 2024-9-11 10:02
openocd的好像可以设置运行断点,就是设置个地址,运行到后停止。但我找的这个pyswd没有这个功能。类似ke ...

硬件断点是往FPB寄存器写目标地址,cpu运行到这地址就会停下来。软件断点是往目标地址改写成BKPT指令,程序运行到这里就停
回复

使用道具 举报

0

主题

126

回帖

126

积分

初级会员

积分
126
发表于 2024-9-12 10:19:23 | 显示全部楼层
KEIL是支持调试脚本的,语法跟C语言大同小异,也许能实现你的想法。
https://developer.arm.com/docume ... g-Scripting?lang=en
回复

使用道具 举报

5

主题

269

回帖

284

积分

高级会员

积分
284
发表于 2024-9-12 17:20:00 | 显示全部楼层
J-Trace Pro可以实时读取内核寄存器,也可以在不打断点的情况下调试感兴趣的函数,功能很强大,就是有亿点贵
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2024-9-15 14:31:05 | 显示全部楼层
keil调试最头疼的是变量在R1-R9内,根本没法通过变量名观察,不管是-O几优化
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2024-9-18 08:28:51 | 显示全部楼层
DX3906 发表于 2024-9-12 17:20
J-Trace Pro可以实时读取内核寄存器,也可以在不打断点的情况下调试感兴趣的函数,功能很强大,就是有亿点 ...

他这种是怎么实现的呢。就是SWD速率够快吗。我现在是用pyswd下使用step运行。调试速度确实慢。
回复

使用道具 举报

5

主题

269

回帖

284

积分

高级会员

积分
284
发表于 2024-9-18 14:24:11 | 显示全部楼层
jplzl10000 发表于 2024-9-18 08:28
他这种是怎么实现的呢。就是SWD速率够快吗。我现在是用pyswd下使用step运行。调试速度确实慢。

用的不是swd是jtag+1个专门的trace接口,比4pin的jtag还多接5条线,而且它接电脑用的是usb3.0
用swd调试慢确实有可能是swd速度不够快,这个要看调试器最大支持多高速度了,也有可能pyswd本身就比较慢
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-9-18 14:29:13 | 显示全部楼层
jplzl10000 发表于 2024-9-18 08:28
他这种是怎么实现的呢。就是SWD速率够快吗。我现在是用pyswd下使用step运行。调试速度确实慢。

Jtrace实现指令追踪是利用芯片的ETM模块,是另一种机制了,需要另外接好几根线
调试速度慢这个没啥好办法,一般调试器是usb2.0,速度本来就慢
解决办法还是我一开始说的,看反汇编知道函数具体地址,自己手动打breakpoint和watchpoint,平常全速运行,满足条件就自动停下
keil里实现非常简单,自己仿写一下表达式:https://cloud.tencent.com/developer/article/2165687
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 19:18 , Processed in 0.066271 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表