我在一个Linux应用程序中调试了一个seg错误,该错误是由一个程序试图更改静态常量数组结构引起的(因此数据位于ELF的只读部分,随后被加载到一个页面中,该页面随后被授予只读权限)。
在GDB中,我在执行错误存储的汇编程序行上放置了一个断点,当它停在那里时,我使用GDB手动执行了等效的写操作。GDB做到了这一点,没有任何抱怨,读回来的值证明它确实是写的。我查看了/proc/thepid/map,那个特定的页面仍然被标记为“不可写”。
所以我的问题是: GDB会在只读页面上临时设置写权限,执行写操作,然后重置权限吗?谢谢。
发布于 2011-09-28 21:59:17
会临时设置GDB的写权限吗
不是的。
在Linux/*86上,ptrace() ( GDB用来读写下级进程内存)允许读写下级进程内存不可读/写的页面,这就导致了您所描述的混乱。
这可以被认为是内核中的一个bug。
应该注意的是,内核必须允许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.我相信正是这种等价性导致了目前的行为。
https://stackoverflow.com/questions/7582534
复制相似问题