我在Linux应用程序中调试了一个seg错误,该错误是由程序试图更改静态常量数组结构引起的(因此数据位于ELF的只读部分,随后加载到当时的页面中给予只读权限)。
在GDB中,我在汇编程序中放置了一个断点,它执行了坏存储,当它停在那里时,我使用GDB手动执行了等效的写操作。 GDB在没有任何投诉的情况下做到了这一点,并且阅读价值证明它确实已经写好了。我查看了/ proc / thepid / maps,并且该特定页面仍被标记为“不可写”。
所以我的问题是:GDB是否暂时在只读页面上设置写权限,执行写操作,然后重置权限?感谢。
答案 0 :(得分:12)
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.
我认为这是导致当前行为的等效性。