七、监视与监察器[Watches and inspectors]
监视[Watch]窗口包含若干个表达式[expressions]。它在第二列里显示这些表达式的。OllyDbg 会把这些表达式保存到主模块的.UDD文件中,因此它们在下一次调试时同样有效。
监察器[inspector]是显示若干变量、1/2维数组或是选定项目结构数组[selecteditems of array of structures]的独立窗口。它的表达式与监视窗口中的基本相同,只是多包含了两个参数:%A和%B。你可以指定这两个参数的界限,OllyDbg 将会用所有可能的组合代替表达式中的%A和%B。从0开始一直到界限(不包含界限),并在表中显示结果。参数%B(列数)的界限不能超过16。
例如,如果你指定了表达式%A%B,并且限定%A和%B的上限为3,你将获得如下的表:
八、线程[Threads]
OllyDbg 以简单而有效的线程管理为特色。如果你单步调试、跟踪、执行到返回或者执行到所选,则线程管理器将停止除当前线程以外的所有线程。即使当前线程被挂起,它也会将其恢复。在这种情况下,如果你手动挂起或者恢复线程,动作将被延期。如果你运行被调试的应用程序,OllyDbg将恢复最初的线程状态。(从调试器的角度来看,Hit跟踪[hit trace]和自由运行是等效的)。
依据这种方案,线程窗口可能会有如下五种线程状态:
激活[Active] 线程运行中,或被调试信息暂停t
挂起[Suspended] 线程被挂起
跟踪[Traced] 线程被挂起,但OllyDbg正在单步跟踪此线程
暂停[Paused] 线程是活动的,但OllyDbg临时将其挂起,并在跟踪其它的线程
结束[Finished] 线程结束

线程窗口同时也显示了最后的线程错误(GetlastError函数的返回)并计算该线程以用户模式和系统模式(仅NT/2000/XP)运行的时间。线程窗口还会高亮主线程的标识符。
以下在快捷菜单中可用:
刷新[Actualize]—标记所有线程为旧的。
挂起[Suspend]—挂起线程。
恢复[Resume]—恢复先前挂起的线程。
设置优先级[Set priority]—调整进程中线程的优先级。以下选项可用:
空闲[Idle] —进程中线程的最低优先级
最低[Lowest]
低[Low]
标准[Normal]
高[High]
最高[Highest]
时间临界[Time critical] —最高优先级
在CPU窗口打开[Open inCPU](双击)—在CPU窗口中显示所选线程的当前状态。
复制到剪切板[Copy to clipboard]:
整行[Whole line]—全部行——以多行文本的形式并带注释将所选记录复制到剪切板。如果在复制时想排除某个栏目,可以将该栏的宽度置为最小(栏目的残留部分将变灰)。
整个表[Whole table]—整个表——以多行文本的形式将整个内存映象复制到剪切板,该文本的第一行包含窗口标题(“内存映射[Memorymap]”),第二行是栏目标题,所有后继行是内存数据记录。复制将保持栏目的宽度。如果在复制时想排除某些栏目,可以将该栏的宽度置为最小(栏目的残留部分将变灰)。
九、调用栈[Call stack]
调用栈窗口(快捷键:AltK)根据选定线程的栈,尝试反向跟踪函数调用顺序并将其显示出来,同时包含被调用函数的已知的或隐含的参数。如果调用函数创建了标准的堆栈框架(PUSH EBP; MOV EBP,ESP),则这个任务非常容易完成。现代的优化编译器并不会为栈框架而操心,所以OllyDbg另辟蹊径,采用了一个变通的办法。例如,跟踪代码到下一个返回处,并计算其中全部的入栈、出栈,及 ESP 的修改。如果不成功,则尝试另外一种办法,这个办法风险更大,速度也更慢:移动栈,搜索所有可能的返回地址,并检查这个地址是否被先前的已分析的命令调用。如果还不行,则会采用启发式搜索。栈移动[Stack Walk]可能会非常慢。OllyDbg 仅在调用栈窗口打开时才会使用。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-41789-16.html
整点实在的
这样的言论就应当受到处理