【发布时间】:2011-10-14 13:34:36
【问题描述】:
我在一个研究项目上遇到了麻烦。 我想要的是使用 ptrace 来观察目标进程的执行。 在 ptrace 的帮助下,我将 mprotect 系统调用注入目标代码段(类似于断点)并将堆栈保护设置为 PROT_NONE。 之后我恢复原始指令并让目标继续。 当我得到一个无效的许可段错误时,我再次注入系统调用以再次取消保护堆栈,然后我执行导致段错误的指令并再次保护堆栈。
(这确实适用于简单的程序。)
我现在的问题是,通过这种设置,目标(相当)在库函数调用中随机崩溃(无论我使用动态链接还是静态链接)。
我的意思是崩溃,它要么尝试访问由于某种原因未映射的内存,要么它只是一直挂在函数 __lll_lock_wait_private 中(这是在 malloc 调用之后)。
让我再次强调,崩溃并不总是发生,也不总是发生在相同的位置。
这听起来像是一个同步问题,但据我所知(意思是我查看了 /proc/pid/tasks/)只有一个线程在运行。
那么你知道这可能是什么原因吗? 即使您不确定,也请告诉我您的建议,我的想法已经不多了...
【问题讨论】:
-
为什么不使用真正的断点?参见例如mainisusuallyafunction.blogspot.com/2011/01/…
-
谢谢,但我有点需要很多内存断点。 (我也在用普通的)
-
作为记录本系列文章值得一读eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1eli.thegreenplace.net/2011/01/27/…eli.thegreenplace.net/2011/02/07/…特别是解释需要在一个字节上编码的陷阱指令才能不破坏被调试程序的部分(在至少在 x86 上)