【问题标题】:Does gdb temporarily give pages write permission?gdb 是否临时赋予页面写权限?
【发布时间】:2011-09-28 11:29:22
【问题描述】:

我正在调试 Linux 应用程序中的 seg 错误,该错误是由程序试图更改静态常量数组结构引起的(因此数据位于 ELF 的只读部分中,随后加载到页面中授予只读权限)。

在 GDB 中,我在执行错误存储的汇编程序行上放置了一个断点,当它停在那里时,我使用 GDB 手动执行了等效的写入操作。 GDB 毫无怨言地做到了这一点,并且读回该值证明它确实已被写入。我查看了 /proc/thepid/maps 并且该特定页面仍被标记为“不可写”。

所以我的问题是:GDB 是否临时在只读页面上设置写入权限,执行写入,然后重置权限?谢谢。

【问题讨论】:

    标签: linux permissions gdb


    【解决方案1】:

    GDB 是否临时设置写权限

    没有。

    在 Linux/*86 上,ptrace()(这是 GDB 用于读取和写入劣质(正在调试)进程内存的东西)允许读取和写入劣质进程无法读取/写入的页面,从而导致你所描述的困惑。

    这可能被认为是内核中的错误。

    应该注意的是,内核已经允许 ptrace 写入通常不可写的.text 部分,以便调试器能够设置断点(这是通过覆盖原始指令来完成的断点/陷阱指令——int3 通过PTRACE_POKETEXT 请求)。

    内核不必为POKE_DATA 做同样的事情,但man ptrace 说:

    PTRACE_POKETEXT, PTRACE_POKEDATA
       Copies the word data to location addr in the child's memory.
       As above, the two requests are currently equivalent.
    

    我相信正是这种等价性导致了当前的行为。

    【讨论】:

    • @gimmeamilk:请“接受”回答您的问题的答案。您可以通过单击您最喜欢的答案左侧的复选/勾选标记来执行此操作(复选在左侧,就在选票下方)。回答者将获得接受答案的声誉积分。
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2015-05-19
    • 2021-04-25
    • 2011-03-23
    • 2011-12-31
    相关资源
    最近更新 更多