当我使用偏移量在某个地址处中断时,gdb会停止程序

时间:2019-07-10 22:29:22

标签: c assembly gdb x86-64

我在Kali Linux Rolling 2019.2。上使用GNU gdb(GDB)8.3。我有以下C代码

#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {
    int x = 5;
    int y = 3;
}

组装

Dump of assembler code for function main:
   0x0000000000001125 <+0>:     push   rbp
   0x0000000000001126 <+1>:     mov    rbp,rsp
   0x0000000000001129 <+4>:     mov    DWORD PTR [rbp-0x14],edi
   0x000000000000112c <+7>:     mov    QWORD PTR [rbp-0x20],rsi
   0x0000000000001130 <+11>:    mov    DWORD PTR [rbp-0x4],0x5
   0x0000000000001137 <+18>:    mov    DWORD PTR [rbp-0x8],0x3
   0x000000000000113e <+25>:    mov    eax,0x0
   0x0000000000001143 <+30>:    pop    rbp
   0x0000000000001144 <+31>:    ret    
End of assembler dump.

当我在一个内存地址处中断时,程序停止。

(gdb) break *0x0000000000001130
Breakpoint 1 at 0x1130
(gdb) r
Starting program: /root/Documents/soQuestionProgram 

[1]+  Stopped                 gdb soQuestionProgram

但是,当我使用偏移量main在相同的内存地址处中断时,该断点将起作用。

(gdb) break *main+11
Breakpoint 1 at 0x1130
(gdb) r
Starting program: /root/Documents/soQuestionProgram 

Breakpoint 1, 0x0000555555555130 in main ()

为什么会发生这种情况,以及如何使内存地址中断工作?

1 个答案:

答案 0 :(得分:2)

正如评论中指出的那样,您在第一种情况下使用的地址不正确,可能是由于类似PIE的原因(GDB通常会禁用ASLR)。这意味着您试图在一个无效地址处放置一个断点,这将触发最近修复的GDB错误:

https://sourceware.org/ml/gdb-patches/2019-05/msg00361.html

一旦看到GDB这样停止:

  [1]+  Stopped                 gdb soQuestionProgram

您应该放回外壳。只需使用fg命令恢复GDB,然后继续进行调试会话。一旦GDB 8.4发布,此错误将得到修复。


使用GDB startstarti命令运行程序,但分别停在main的顶部或用户空间中的第一条指令之前。程序运行后,GDB的反汇编中将包含实际地址,而不仅仅是相对于文件开头的相对偏移量。

或使用gcc -fno-pie -no-pie编译+链接以构建非PIE可执行文件,并在链接时选择固定的加载地址。