以Linux为例,一个新的应用程序正在使用一个共享/动态.so库。在调试应用程序时,如果我们能够在该共享库中设置断点,那么同时使用该共享库的任何其他应用程序是否会受到影响?
mzillmmw1#
通常,进程的文本段(包括可执行文件和共享库中的所有代码以及常量数据)标记为只读。调试时,调试器将代码页标记为写入时复制。修改代码以设置断点时,这会导致进程获取代码的私有副本,因此断点不会影响其他进程。我发现很多网页和其他SO答案都解释了断点是通过用INT 3替换指令来实现的(在x86硬件上),但是没有一个提到进程得到代码的私有副本。但是它肯定是这样工作的,因为对于运行相同程序或使用相同共享库的其他进程来说,从断点获取中断是没有意义的,它们没有运行调试器来处理这些中断,并且被INT 3替换的指令位于调试器的内存中。
INT 3
1条答案
按热度按时间mzillmmw1#
通常,进程的文本段(包括可执行文件和共享库中的所有代码以及常量数据)标记为只读。调试时,调试器将代码页标记为写入时复制。修改代码以设置断点时,这会导致进程获取代码的私有副本,因此断点不会影响其他进程。
我发现很多网页和其他SO答案都解释了断点是通过用
INT 3
替换指令来实现的(在x86硬件上),但是没有一个提到进程得到代码的私有副本。但是它肯定是这样工作的,因为对于运行相同程序或使用相同共享库的其他进程来说,从断点获取中断是没有意义的,它们没有运行调试器来处理这些中断,并且被INT 3
替换的指令位于调试器的内存中。