c++ - gdb 中 C++ 引用修改的硬件断点

标签 c++ gcc gdb

C++ 标准说 it is unspecified whether or not a reference requires storage (3.7). 。然而,据我所知,gcc 将 C++ 引用实现为指针,因此它们可能会被破坏。

是否有可能在 gdb 中获取引用的地址并在该地址上放置一个硬件断点,以便找出是什么破坏了引用所在的内存?怎么设置这样的断点?

最佳答案

GDB 可以进行硬件观察。您可以为此使用命令 watch。例子: ma​​in.cpp:

int main(int argc, char **argv)
{
     int a = 0;
     int& b = a;
     int* c = &a;
     *c = 1;

     return 0;
}

开始调试并在启动主函数和结束主函数上设置断点:

(gdb) b main
Breakpoint 1 at 0x401bc8: file /../main.cpp, line 60.
(gdb) b main.cpp:65
Breakpoint 2 at 0x401be9: file /../main.cpp, line 65.
(gdb) r

获取引用b的地址:

Breakpoint 1, main (argc=1, argv=0x7fffffffddd8) at /../main.cpp:60
60           int a = 0;
(gdb) disas /m
Dump of assembler code for function main(int, char**):
59      {
   ... Something code

60           int a = 0;
=> 0x0000000000401bc8 <+11>:    movl   $0x0,-0x14(%rbp)

61           int& b = a;
   0x0000000000401bcf <+18>:    lea    -0x14(%rbp),%rax
   0x0000000000401bd3 <+22>:    mov    %rax,-0x10(%rbp)

62           int* c = &a;
   0x0000000000401bd7 <+26>:    lea    -0x14(%rbp),%rax
   0x0000000000401bdb <+30>:    mov    %rax,-0x8(%rbp)

63           *c = 1;
   0x0000000000401bdf <+34>:    mov    -0x8(%rbp),%rax
   0x0000000000401be3 <+38>:    movl   $0x1,(%rax)

64      
65           return 0;
   0x0000000000401be9 <+44>:    mov    $0x0,%eax

66      }
   0x0000000000401bee <+49>:    pop    %rbp
   0x0000000000401bef <+50>:    retq   

End of assembler dump.
(gdb) p $rbp-0x10
$1 = (void *) 0x7fffffffdce0

p $rbp-0x10 是引用 b 的打印地址。它是 0x7fffffffdce0。 设置观看地址:

(gdb) watch *0x7fffffffdce0
Hardware watchpoint 3: *0x7fffffffdce0
(gdb) c

GDB 仅在值更改时中断:

(gdb) c
Continuing.
Hardware watchpoint 3: *0x7fffffffdce0

Old value = -8752
New value = -8996
main (argc=1, argv=0x7fffffffddd8) at /../main.cpp:62
62           int* c = &a;

对不起我的英语!

关于c++ - gdb 中 C++ 引用修改的硬件断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47220367/

相关文章:

gdb - 查看汇编代码和 C 代码

c++ - 静态库如何链接到依赖项?

c++ - C 运行时 CRT 与 C++ 运行时 - 堆内存管理模型

gcc - 为什么没有将调试符号添加到我的输出文件中?

c++ - 为什么我不能在 mac 上使用 g++ 运行这个简单的 c++ 代码?

debugging - 如何避免在 gdb 中重复输入相同的内容?

c++ - 将模板化的基类转换运算符引入派生范围

c++ - 多个内部分配 - 它是如何工作的?

visual-c++ - 可移植地编写 x86 asm 函数(win/linux/osx),而不依赖于 yasm/nasm?

c++ - 如何获取gdb中数据成员的值?