【问题标题】:Hardware breakpoint on C++ reference modification in gdbgdb 中 C++ 参考修改的硬件断点
【发布时间】:2017-11-10 10:13:00
【问题描述】:

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

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

【问题讨论】:

    标签: c++ gcc gdb


    【解决方案1】:

    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;
    

    对不起我的英语!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      相关资源
      最近更新 更多