gpt4 book ai didi

c - gdb 在使用偏移量工作时在地址处中断时停止程序

转载 作者:太空宇宙 更新时间:2023-11-04 07:46:00 25 4
gpt4 key购买 nike

我在 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 ()

为什么会发生这种情况,我如何才能在内存地址处进行中断?

最佳答案

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

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

一旦你看到 GDB 像这样停止了:

  [1]+  Stopped                 gdb soQuestionProgram

你应该回到 shell。只需使用 fg 命令恢复 GDB 并继续您的调试 session 。 GDB 8.4 发布后,此错误将得到修复。


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

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

关于c - gdb 在使用偏移量工作时在地址处中断时停止程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56979432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com