本文介绍如何使用ARM平台的硬件watchpoint定位踩内存问题,特别是如何在运行过程中自动对特定内存区域添加watchpoint。 在踩内存问题中,最困难的就是找出元凶。 一、首先确认是否支持硬件watchpoint 这个必须查对应芯片的技术手册。 要想使用硬件watchpoint,必须先打开监控模式。 ®-A9 Technical Reference Manual》 10.5.3 (Watchpoint Value Registers)和 10.5.4(Watchpoint Control Registers 硬件watchpoint功能,是由Watchpoint Value Register(WVR)和Watchpoint Control Register(WCR)两个寄存器配对实现的,前者设置被监控地址(
2.问题描述 在程序运行异常的时候,可以借助watchpoint来进行辅助调试。 4.解决办法 (1)使能watchpoint的宏开关:export __CONFIG_WATCHPOINT:=y (2)调用watchpoint_add函数添加观察点 以下是代码使用示例: #include <debug/watchpoint.h> static int watchpoint_test_value; static struct watchpoint wp; static enum cmd_status cmd_watchpoint_value_init(char *cmd) { int ret; watchpoint_test_value = 1; wp.address = ; ret = watchpoint_add(&wp); if (ret) { printf("watchpoint_add fail.
这时候最好的办法就是用watchpoint。我们可以用他观察这个属性的地址。如果地址里面的东西改变了,就让程序中断 watchpoint set:用于添加一个watchpoint。 command add:和breakpoint一样,给watchpoint添加命令 //设置一个watchpoint (lldb) watchpoint set variable _string 我们可以用watchpoint command add -o添加单条命令 watchpoint command add -o 'bt' 1 //我们也可以一次添加多条命令 (lldb) watchpoint command delete:删除某个watchpoint所有的command watchpoint list:查看当前所有watchpoint watchpoint disable/enable :使某个watchpoint失效/生效 watchpoint delete:删除watchpoint,删除单个或多个,用法同breakpoint delete
不过一般我都是直接在Xcode左边点击某个frame,这样更方便 九、watchpoint watchpoint breakpoint有一个孪生兄弟watchpoint。 这时候最好的办法就是用watchpoint。我们可以用他观察这个属性的地址。如果地址里面的东西改变了,就让程序中断。 watchpoint set命令用于添加一个watchpoint。 watchpoint set variable 通过这个命令可以为array对象设置观察点 watchpoint set variable传入的是变量名。需要注意的是,这里不接受方法。 设置成功后可以通过watchpoint list 可以查看到所有被标记的watchpoint。 例如: watchpoint disable watchpoint enable watchpoint delete 十 、thread thread backtrace & bt 有时候我们想要了解线程堆栈信息
命令 子命令 命令操作 命令选项 命令参数 常用命令: expression:表达式 thread backtrace:堆栈 thread:线程 frame:栈帧 breakpoint:符号断点 watchpoint breakpoint disable 断点编号 // 禁用断点 breakpoint enable 断点编号 // 启用断点 breakpoint delete 断点编号 // 删除断点 8、内存断点:watchpoint watchpoint set variable 变量 watchpoint set expression 地址 watchpoint list watchpoint diable 断点编号 watchpoint enable 断点编号 watchpoint delete 断点编号 watchpoint command add 断点编号 watchpoint command list 断点编号 watchpoint
set var self->_testA Watchpoint created: Watchpoint 1: addr = 0x7fda62504708 size = 4 state = enabled type = w watchpoint spec = 'self->_testA' new value: 0 这样当有变化的时候便会断下来,控制台会输出如下 Watchpoint 1 ->_testA Watchpoint created: Watchpoint 1: addr = 0x7fc181c04238 size = 4 state = enabled type = rw watchpoint spec = 'self->_testA' new value: 0 当然也可以管理watchpoint watchpoint list //列出所有的watchpoint watchpoint del //删除所有的watchpoint 5.打印当前显示的ViewController po [[[UIApplication sharedApplication] keyWindow
Watchpoint 优化 transition 很难优化。 每个 structure 都有任意数目的 watchpoint 集。 一个 watchpoint 集就是一个 bool 型的字段(从 valid 开始,变成 invalid),和一组 watchpoint。 大多数时候,watchpoint 集会告诉我们它们已经被无效化了,甚至会在优化 JIT 编译器试图安装任何 watchpoint 之前。我们希望在稳定态下几乎不会有 watchpoint 无效化。 我们已经在非 null 的 frame上安装了 watchpoint。
局部变量无效后,观察点无效 Watchpoint 2 deleted because the program has left the block in which its expression Hardware watchpoint 2: mem Old value = “\000\000\000\000\000\000\000” New value = “0\000\000\000 Hardware watchpoint 2: mem Old value = “0\000\000\000\000\000\000” New value = “01\000\000\000\ Hardware watchpoint 2: mem Old value = “01\000\000\000\000\000” New value = “012\000\000\000\000 Hardware watchpoint 2: mem Old value = “0123456” New value = “01234567” initBuf (pBuf=0x6010a0
-- Set use of remote protocol `Z4' (access-watchpoint) packet set remote agent-packet -- Set use of -- Set the maximum length (in bytes) of a target hardware watchpoint set remote hardware-watchpoint-limit -- Set use of remote protocol `Z3' (read-watchpoint) packet set remote reverse-continue-packet -- Set -- Set use of remote protocol `Z2' (write-watchpoint) packet set remoteaddresssize -- Set the maximum -- Show the maximum length (in bytes) of a target hardware watchpoint show remote hardware-watchpoint-limit
还有高大上的 Field Watchpoint ? ? 你有关注过Android Studio旁边断点的区别吗?比如上图三个断点有什么不同?且听我一一道来。 Field WatchPoint 在上面我们添加异常断点的时候,点击加号的时候,有四个选项;第一个就是我们前面所说的第二种方法断点的添加方式,第三个是异常断点,那么第二个 Field WatchPoint 那就是这个 Field WatchPoint的功能了;使用它我们可以在某个Field被访问或者修改的时候让程序断下来;完美解决这个问题。
还有高大上的 Field Watchpoint ? 几种不同的断点 你有关注过Android Studio旁边断点的区别吗?比如上图三个断点有什么不同?且听我一一道来。 或者使用快捷键打开断点设置窗口;如下图: 断点设置窗口 点击左上角的 ➕ ,会出现一个选择框;选择Exception Breakpoint;然后会出现一个对话框,选择你感兴趣的异常: 异常断点 Field WatchPoint 在上面我们添加异常断点的时候,点击加号的时候,有四个选项;第一个就是我们前面所说的第二种方法断点的添加方式,第三个是异常断点,那么第二个 Field WatchPoint 是干什么的呢? 那就是这个 Field WatchPoint的功能了;使用它我们可以在某个Field被访问或者修改的时候让程序断下来;完美解决这个问题。 下断点的方式和方法断点类似,也有两种;第一种是直接在某个字段的声明处下断点,这时候断点图标会改变,如下图: Field WatchPoint 右键这个断点我们可以进行一些设置,比如默认是被修改的时候断下来
GDB与LLDB命令对照表 ---- GDB 与 LLDB 命令对照表1 GDB 与 LLDB 命令对照表2 ---- 设置观察点 wa s v 变量名 或 watchpoint set variable
Sum (s=32767, e=-7136) at mycmd.c:5 5 { (gdb) n 6 int result = 0; (gdb) watch result Hardware watchpoint Hardware watchpoint 2: result Old value = -6896 New value = 0 Sum (s=1, e=100) at mycmd.c:7 7 for Hardware watchpoint 2: result Old value = 0 New value = 1 Sum (s=1, e=100) at mycmd.c:7 7 for(int Hardware watchpoint 2: result Old value = 1 New value = 3 Sum (s=1, e=100) at mycmd.c:7 7 for(int Hardware watchpoint 2: result Old value = 3 New value = 6 Sum (s=1, e=100) at mycmd.c:7 7 for(int
gdb) x/2x &y 0x7fffffffe430: 0x00000002 0x00000001 (gdb) awatch x Hardware access (read/write) watchpoint Hardware access (read/write) watchpoint 2: x Old value = 1 New value = 0 set_zero (t=PARAM) at main.cpp
在26行代码处lldb输入watchpoint set variable self->_p->_name。 watchpoint set variable观察某个值是否修改 然后过掉26行代码断点。
keep y 0x00000000004005fc in printNum2 at test.c:17 breakpoint already hit 1 time 2 hw watchpoint 例如: watch a 这个时候,让程序继续运行,如果a的值发生变化,则会打印相关内容,如: Hardware watchpoint 2: a Old value = 12 New value = 11
watch 实时地监视对象、方法或变量的变化 9.我们常说的断点(breakpoints)是指line breakpoints,除了line breakpoints,还有其他的断点类型:field(watchpoint )breakpoint,method breakpoint ,exception breakpoint. 10.field breakpoint 也叫watchpoint(监视点) 当成员变量被读取或修改时暂挂
Cortex-M中的DWT 在Cortex-M里面有一个外设叫DWT(Data Watchpoint and Trace),是用于系统调试及跟踪, 它有一个32位的寄存器叫CYCCNT,它是一个向上的计数器 0xE000EDFC ) #define TRCENA ( 0x01 << 24) // DEMCR的DWT使能位 //0xE0001000 DWT_CTRL RW The Debug Watchpoint
本文主要分享一个Cache一致性踩内存问题的定位过程,涉及到的知识点包括:backtrace、内存分析、efence、wrap系统函数、硬件watchpoint、DMA、Cache一致性等。 6.1 硬件watchpoint 现在最有效的定位手段就是,对那四个字节做写保护,但是前面提到的MMU做不到,因为MMU的最小保护单元是一个内存页,一般为4KB。 关键时刻,驱动组同事有了新想法,Linux下可以通过gdb的watchpoint监控特定内存区域,我们的系统是否也可以引入类似的机制? 具体原理和操作方法可以参考《如何利用硬件watchpoint定位踩内存问题》。 Demo实测证明该工具超级好用,完全可以满足我们的需求。感觉终于要到开奖的时刻了,只等问题复现。 这时驱动同事恍然大悟,“怪不得watchpoint抓不住,搞不好就是它了,因为Cache操作不会触发watchpoint”。 ?
配置 System components ‑‑‑> aw components ‑‑‑> Watchpoint Components Support ‑‑‑> [*] Tina RTOS Watchpoint # 使用断点与观察点 终端命令 作用 : 设置程序断点,当前仅使用硬件断点 用法 : breakpoint [set | remove] addr 配置 System components ‑‑‑> aw components ‑‑‑> Watchpoint Components Support ‑‑‑> [*] Tina RTOS Watchpoint # 使用断点与观察点 终端命令 作用 : 设置硬件观察点,当前仅使用硬件断点 用法 : watchpoint [write | read | access