gpt4 book ai didi

c++ - 将 HW BP 放在哪里以捕获全局变量地址损坏?

转载 作者:行者123 更新时间:2023-11-28 06:28:27 24 4
gpt4 key购买 nike

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

如何用硬件断点捕捉这个bug?我的意思是在什么地址放置 HWBP。当我查看汇编程序时,我看到:
lis 9,姓名@ha
lwz 9,Namel@l(9)

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

先谢谢了

最佳答案

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

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

// 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", '\000' <repeats 246 times>
(gdb) print &Name
$2 = (char (*)[256]) 0x6010c0 <Name>

无论如何,如果您真的想设置一个“硬件断点”(GDB calls those "watchpoints"),那么您可以在损坏之前获取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)

关于c++ - 将 HW BP 放在哪里以捕获全局变量地址损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28120482/

24 4 0