在哪里放置 HW BP 以捕获全局变量地址损坏
Where to put HW BP to catch the global variable address corruption?
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)
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 为什么我的全局变量似乎没有变化?
- C ++程序如何返回我的数组或写入全局变量
- 为什么我的数组值与此处的全局变量不匹配?
- QT C++中对全局变量的未定义引用
- 跨多个类的全局变量而不会出现重定义错误?
- 在哪里放置 HW BP 以捕获全局变量地址损坏
- 在Linux上,静态变量和全局变量在动态库和静态库中显示不同的地址
- 如果用调试信息编译,则通过其名称获取全局变量地址
- 它的全局变量的地址对于程序的不同运行是相同的