微软早在MSDOS里就提供了一个调试程序debug。相信在那个年月,很多人都用过它,即使在今天的Windows 2000,Windows XP以及Windows2003里面还能看到它。这个程序从一个侧面反映了微软操作系统的进化历史。
在那个年代,会使用电脑,是一个人科技水平的标志。如果还会使用debug,那就是一个计算机高手的标志了。程序设计中的很多问题都是靠这个小小的工具来解决的。虽然后来出现了很多功能更强大的调试工具,但是debug依然少不了。它是微软操作系统的一个标准配置,哪里都有。高手们用它可以干出很多出乎微软意料的事情,包括制造、传播、预防、清除病毒。
MSDOS最初运行在英特尔的8086 CPU之上。相对于日后的名目繁多的子孙来说,这个CPU只有“实模式”,也就是说一个程序可以控制计算机的任何部件。debug就是为这个“实模式”设计的,因此,使用它就可以控制计算机的任何操作。也只有在那个年代,一个程序员才能体会到计算机是“我的电脑”的含义。
从80286开始,英特尔这个系列的CPU提供了“保护模式”。微软的Windows操作系统主要是为这个模式设计的。顾名思义,系统保护了很多资源,程序员和使用者只能使用系统允许使用的资源。从此,程序员再也不能为所欲为了。debug虽然依然是标准配置,但是它已经名存实亡,干不了什么事情了。在那段过渡时期,虽然人们都在购买80386 CPU的机器,但是依然运行着实模式的MSDOS,根本没有发挥出32位机器的威力。我在这段时间还曾写过自己的32位保护模式的调试工具,这是在保护模式下的为所欲为。现在的计算机仍然可以运行古老的MSDOS,但是,再没有听说有人真正地使用它。
作为debug在新环境下的升级版本,ntsd成了Windows的标准配置。它是一个可以进行动态调试的工具,还支持源代码级的符号调试。但是,它生不逢时,这个时候使用汇编语言的人很少了,而各种高级语言自己的调试工具功能都很强大,没有人想回头使用这种命令行的工具了。于是,今天还有人知道debug,因为它历史悠久,但是很少有人知道替代它的是ntsd。
如今我们用ntsd可以做什么呢?当然它可以调试程序,除此之外,我们还可以做一些其它事情,你会觉得它还是很有用的。
如果你想知道一个进程加载了哪些DLL,那么你就可以用ntsd,利用它的动态调试功能,列出这个进程中加载的所有DLL:
ntsd -pd -p pid
记着用q命令退出ntsd。
系统里有时会有一些进程,我们用taskmgr杀不掉它们。这时,你可以用ntsd:
ntsd -c q -p pid
它的意思是将调试器连接到指定的进程上,然后退出ntsd,这时,那个进程也就跟着退出了。这种方式可以杀掉很多的系统进程,所以要小心使用,要明白你在做什么。
Ntsd.exe的用法:
ntsd -c q -p PID
或者
ntsd -c q pn ImageName
- c是表示执行debug命令,q表示执行结束后退出(quit),-p 表示后面紧跟着是你要结束的进程对应的PID,-pn 表示后面紧跟着是你要结束的进程名(process_name.exe 比如:QQ.exe,explorer.exe 等等,值得注意的是后缀名.exe是不可省略的,否则系统会告诉你“不支持此接口”)
查看pid及进程名,我们可以在任务管理器看,在特殊情况下,也可以使用tasklist命令.
比如我们要结束pid为3212的进程maxthon.exe
那么我们可以在命令提示符中输入:
ntsd -c q -p 3212
或
ntsd -c q -pn maxthon.exe
注:xp下还有两个好东东tasklist和tskill。tasklist能列出所有的进程,和相应的信息。tskill能查杀进程,语法很简单:tskill 程序名