分类: 系统运维
2009-03-21 21:30:40
为了控制一个被调试程序的过程,调试器需要一种机制去通知操作系统该可执行文件希望被控制。即一旦被调试程序由于某些原因停止的时候,调试器需要获取详细的信息使得他知道被调试程序是什么原因造成他停止的。
调试器是用户级的程序,并不是操作系统的一部分,并不能运行特权级指令,因此,它只能通过调用操作系统的系统调用来实现对特权级指令的访问。
调试器运行被调试程序,并将控制权转交给被调试程序,需要进行上下文切换。在一个简单的断点功能实现,有6个主要的转换:
1. 当调试器运行到断点指令的时候,产生陷阱跳转到操作系统;
2. 通过操作系统,跳转到调试器,调试器开始运行;
3. 调试器请求被调试程序的状态信息,该请求送到操作系统进行处理;
4. 转换到被调试程序文本以获取信息,被调试程序激活;
5. 返回信息给操作系统;
6. 转换到调试器以处理信息。
一旦使用图形界面调试器,过程会更加的复杂。
对于多线程调试的支持;
l 一旦进程创建和删除,操作系统必须通知调试器;
l 能够询问和设置特定进程的进程状态;
l 能够检测到应用程序停止,或者线程停止。
例子:UNIX ptrace()
UNIX ptrace 是操作系统支持调试器的一个真实的API。
ptrace 的函数原型:
int
ptrace(PTRACEREQ request, int pid, char* addr, int data, char* addr2);
下面给出了UNIX ptrace的调试算法: