【问题标题】:Why does GDB allow writes to non-writable addresses?为什么 GDB 允许写入不可写地址?
【发布时间】:2021-03-01 06:41:53
【问题描述】:

我在 *p = a; 之类的命令中使用 segv 调试了一个程序

在 GDB 中可以这样做

Breakpoint 2, Foo (size=4) at bar.cpp:144
144       meta->requested_size = size;
(gdb) p meta->requested_size = size
$9 = 4
(gdb) p &meta->requested_size
$10 = (size_t *) 0x7021fffffff8
(gdb) p *0x7021fffffff8 = size
$11 = 4

崩溃,而 n 导致 segv。

(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x00005555555a3dcb in Foo (size=4) at bar.cpp:144
144       meta->requested_size = size;

(gdb) p $_siginfo._sifields._sigfault.si_addr
$12 = (void *) 0x7021fffffff8

How can I check whether a memory address is writable or not at runtime?,我发现这个地址不可写。这是 gdb 的结果吗?

【问题讨论】:

  • 请在执行n 之前,使用命令info proc mappings 转储程序的内存映射并将结果附加到您的问题中。此外,当你这样做时,如果它发生变化,请调整任何值/地址!这很重要,我们需要您显示的代码保持一致(不要混合来自程序的两个不同执行的内容)。
  • 相关:How does ptrace POKETEXT works when modifying program text?。在 Linux 上,GDB 使用 ptrace,它在允许调试器修改进程映像的不可写部分方面有着悠久的、未记录的历史。

标签: c linux gdb


【解决方案1】:

gdb 是一个调试器工具。它使您几乎可以不受限制地做任何事情,因为您正试图戳戳并刺激事物以查看会发生什么。安全限制只会妨碍您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 2015-02-02
    • 2017-09-02
    • 2016-10-21
    • 2019-11-05
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多