在哪里放置 HW BP 以捕获全局变量地址损坏

Where to put HW BP to catch the global variable address corruption?

本文关键字:全局变量 地址 损坏 HW BP 在哪里      更新时间:2023-10-16

C/C++中的程序在具有硬件断点功能的调试器下在嵌入式PowerPC上运行。在 2 个文件和 2 个任务中相应地知道全局变量 'char Name[256]"。例如,一个任务读取名称,另一个任务用文本"1234567..."填充它。在某些时刻,全局变量 Name 被损坏。当要求输入变量地址时,gdb显示(以及通过调试打印输出打印的应用程序打印)地址等于0x31323334。

如何使用硬件断点捕获此错误?我的意思是把 HWBP 放在什么地址。当我查看汇编程序时,我看到:
利斯 9,Name@ha
LWZ 9,Namel@l(9)

那么,内存损坏如何在不影响应用程序流的情况下更改代码 - 它应该立即崩溃,不是吗?

非常感谢

0x31323334 "1234"无空终止符。此外,"全局变量地址损坏"对"全局变量"(其地址不会更改)没有多大意义,对于大小为 256 的数组也没有多大意义(除非您在某处使用指针并且指针正在损坏)。所以我怀疑你可能不熟悉GDB。

在x86(诚然,不是ppc,但基本上相同的软件)上使用GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1时,使用以下测试文件:

// g++ test.cpp -g
#include <iostream>
char Name[256] = "123456789";
int main() {
    Name[0] = 'a';
    std::cout << Name << std::endl;
}

我可以从 GDB 获得以下输出:

(gdb) break main
Breakpoint 2 at 0x40086a: file test.cpp, line 6.
(gdb) r
Starting program: /home/keithb/dev/mytest/a.out 
Breakpoint 2, main () at test.cpp:6
6       Name[0] = 'a';
(gdb) whatis Name
type = char [256]
(gdb) print Name
$1 = "123456789", '00' <repeats 246 times>
(gdb) print &Name
$2 = (char (*)[256]) 0x6010c0 <Name>

无论如何,如果您确实想设置"硬件断点"(GDB 称这些"观察点"),那么您可以在损坏之前获取Name的地址。然后只需设置观察点并等待程序写入地址即可。

(gdb) c
Continuing.
a23456789
[Inferior 1 (process 21878) exited normally]
(gdb) delete 2
(gdb) watch *0x6010c0
Hardware watchpoint 3: *0x6010c0
(gdb) r
Starting program: /home/keithb/dev/mytest/a.out 
Hardware watchpoint 3: *0x6010c0
Old value = 875770417
New value = 875770465
main () at test.cpp:7
7       std::cout << Name << std::endl;
(gdb)