2017-11-10 9 views
1

C++標準ではit is unspecified whether or not a reference requires storage (3.7).と書いてあります。しかし、私が理解するところでは、gccはポインタとしてC++の参照を実装しているため、壊れている可能性があります。gdbのC++リファレンスのハードウェアブレークポイント

gdb内の参照のアドレスを取得し、そのアドレスにハードウェアブレークポイントを設定して、参照が存在するメモリを破壊するものを見つけることは可能ですか?どのようにしてそのようなブレークポイントを設定できますか?

答えて

0

GDBがハードウェアウォッチポイントを実行することがあります。これにはコマンドwatchを使用できます。例: main.cppに:

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

    return 0; 
} 

スタートのデバッグと設定されたブレークポイントのメイン機能を開始し、主な機能を終了するに:

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 

(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のアドレスを取得します。 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; 

申し訳ありません!

関連する問題