2017-03-21 138 views
0

這裏是我的disas代碼:無法訪問內存 - GDB

Dump of assembler code for function main: 
0x00000000000006b0 <+0>: push %rbp 
0x00000000000006b1 <+1>: mov %rsp,%rbp 
0x00000000000006b4 <+4>: sub $0x10,%rsp 
0x00000000000006b8 <+8>: movl $0xa,-0xc(%rbp) 
0x00000000000006bf <+15>: lea -0xc(%rbp),%rax 
0x00000000000006c3 <+19>: mov %rax,-0x8(%rbp) 
0x00000000000006c7 <+23>: lea 0x96(%rip),%rdi  # 0x764 
0x00000000000006ce <+30>: mov $0x0,%eax 
0x00000000000006d3 <+35>: callq 0x560 <[email protected]> 
0x00000000000006d8 <+40>: mov $0x0,%eax 
0x00000000000006dd <+45>: leaveq 
0x00000000000006de <+46>: retq 

,當我用b * 0x00000000000006b4設置斷點0x06b4並運行它給了一個錯誤 Starting program: /root/print.out Warning: Cannot insert breakpoint 4. Cannot access memory at address 0x6b4 的代碼,但是當我做b 4並運行代碼,工作正常。所以我在第一種情況下做錯了什麼。

+2

您是否在斷點工作時檢查地址?它們是否與拆卸相匹配? –

+0

是的,它們是相同的 –

+2

這些地址非常低。你能否編輯你的問題來添加你的操作系統,編譯設置,gdb命令行選項等的描述? –

回答

1

Dump of assembler code for function main: 0x00000000000006b0 <+0>: push %rbp 0x00000000000006b1 <+1>: mov %rsp,%rbp

您正在尋找position-independent executable(一種特殊的共享庫)。當可執行文件開始運行時,main的代碼將重定位到不同的地址。

因爲一旦可執行文件被重定位,在0x6b4處沒有代碼,GDB抱怨說它不能在那裏設置斷點。

但是當我用b 4做它並運行代碼時,它工作正常。

在這種情況下,GDB明白你要設置在第4行的斷點,並插入相應的斷點後的可執行文件已被重新定位。

使用info break來查看重定位地址是什麼。