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

标签 c++ gcc global-variables breakpoints

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/

相关文章:

Python:如何在模块中使用主文件中的变量?

Python - 你如何使这个 block 中的变量成为全局变量?

asp.net-mvc - SparkViewEngine : Using Url. Application.Spark 中全局变量中的内容

c++ - Eclipse、CDT、(N)Curses 和调试/分析

c++ - 语言设计: default method parameters inheritance

python - 在 python 扩展 (.so) 中同时链接 libgfortran 和 libstdc++

c - 将二维数组作为指针传递,gcc 警告不兼容的指针类型

c++ - GCC中格式错误的C/C++多维数组初始化

c++ - MongoDB 从 C++ 调用 stats()

c++ - 说真的, copy-and-swap 习语真的应该如何工作!我的代码失败