gpt4 book ai didi

条件数据观察点在 ARM GDB 中不起作用

转载 作者:行者123 更新时间:2023-12-04 09:44:59 25 4
gpt4 key购买 nike

我的目的是能够捕捉到全局变量何时具有某个确切值。 GDB有data watchpoints据此可以实现。
考虑这个为 x86 Linux 编写的简单程序:

int myVar = 0;

void debug_watchpoints() {
for(int i=0; i < 2000; i++) {
myVar++;
}
}

int main() {
debug_watchpoints();
return 0;
}
编译程序
gcc -o main -ggdb3 -Og main.c
并开始使用 GDB 进行调试:
max@PC-LT-23:~/stackoverflow$ gdb ./main
GNU gdb (Ubuntu 8.3-0ubuntu1) 8.3
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./main...
(gdb) b main
Breakpoint 1 at 0x1146: file main.c, line 9.
(gdb) start
Temporary breakpoint 2 at 0x1146: file main.c, line 9.
Starting program: /home/max/stackoverflow/main

Breakpoint 1, main () at main.c:9
9 int main() {
(gdb) watch myVar if myVar==1337
Hardware watchpoint 3: myVar
(gdb) continue
Continuing.

Hardware watchpoint 3: myVar

Old value = 1336
New value = 1337
debug_watchpoints () at main.c:4
4 for(int i=0; i < 2000; i++) {
(gdb)
如您所见,它恰好在变量设置为 1337 的时间点停止了程序。
考虑 完全相同的程序 , 编译为 arm-none-eabi-gcc对于具有 Cortex-M4F 内核的 STM32L476RG 微 Controller 。这里使用的 IDE 是 System Workbench for STM32(又名 Eclipse),其中包含一个由 STM32CubeMX 生成的项目。
现已推出 openocd
Open On-Chip Debugger 0.10.0+dev-00021-g524e8c8 (2019-04-12-08:33)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
srst_only separate srst_nogate srst_open_drain connect_assert_srst
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
padded zone erase set to 1
adapter speed: 8000 kHz
adapter_nsrst_delay: 100
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 8000 kHz
Info : STLINK v2.1 JTAG v34 API v2 M25 VID 0x0483 PID 0x374B
Info : using stlink api v2
Info : Target voltage: 0.011074
Error: target voltage may be too low for reliable debugging
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Info : STM32L476RGTx.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
Info : accepting 'gdb' connection on tcp/3333
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08001340 msp: 0x20018000
main 中设置了断点函数,然后观察点的设置与以前完全一样。此外,在执行 debug_watchpoints() 后设置了一个断点。功能。
GNU gdb (GNU Tools for Arm Embedded Processors 9-2019-q4-major) 8.3.0.20190709-git
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=x86_64-linux-gnu --target=arm-none-eabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) Reset_Handler () at ../startup/startup_stm32l476xx.s:63
63 ldr sp, =_estack /* Set stack pointer */

Temporary breakpoint 3, main () at ../Src/main.c:65
65 {

(gdb) watch myVar if myVar==1337
Hardware watchpoint 4: myVar
(gdb) info breakpoints
Num Type Disp Enb Address What
2 breakpoint keep y 0x08000f46 in main at ../Src/main.c:70
4 hw watchpoint keep y myVar
stop only if myVar==1337
(gdb)
当继续程序时,它现在会在每次修改变量时停止,并带有 SIGTRAP ,无论条件是否满足。
Program received signal SIGTRAP, Trace/breakpoint trap.
0x08000ec2 in debug_watchpoints () at ../Src/main.c:54
54 for(int i=0; i < 2000; i++) {
(gdb) continue
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x08000ec2 in debug_watchpoints () at ../Src/main.c:54
54 for(int i=0; i < 2000; i++) {
(gdb) continue
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x08000ec2 in debug_watchpoints () at ../Src/main.c:54
54 for(int i=0; i < 2000; i++) {
(gdb) info breakpoint
Num Type Disp Enb Address What
2 breakpoint keep y 0x08000f46 in main at ../Src/main.c:70
4 hw watchpoint keep y myVar
stop only if myVar==1337
(gdb) print myVar
$2 = 3
我可以根据需要继续多次,每次更改变量时它都会中断。
在我“调试堆栈上的内存损坏”的场景中,我真的需要 GDB 来正确评估条件,否则程序会停止一千次或更多次(每次碰巧在该内存位置的变量发生更改时)和不仅在特定时间将特定值写入其中以捕获错误。
为什么 arm-none-eabi-gdb此处的行为与正常情况不同 gdb ?错误是否在于 Cortex-M4 硬件调试功能, arm-none-eabi-gdb , 或 openocd作为 GDB 服务器?

最佳答案

如前所述,您正在使用的调试器桥 openocd 中没有有效的实现。

您可以通过 sw 设置。这里有一个小片段。 COMP2、FUNCTION2、COMP1 和 FUNCTION1 是 DWT 寄存器。请注意,您需要使用两个链接在一起的比较器。并非所有 Cortex-m 实现都支持这些功能,并且并非所有比较器都是可链接的,这取决于您的芯片。此外,捕获似乎是异步的。通常,我的 PC 在触发后会停止一些操作。

DWT->COMP2 = <address to compare>;
DWT->FUNCTION2 = 0;
DWT->COMP1 = <word to compare>;
DWT->FUNCTION1 = 0x20B06;

关于条件数据观察点在 ARM GDB 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62172401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com