|  |  |  |  |  |  | 
					            
						            
							            
								            |  | 
	《软件调试》的示例程序帖子发起人: 格蠹老雷   发起时间: 2008-07-31 22:44 下午   回复: 22
 
	 
		
			| 
					
						|         | 
						      
						        | 帖子排序: |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-31, 22:44 下午 |  
											| 
													 格蠹老雷 
 
   注册: 2005-12-19
 发 贴: 1,303
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| SHL, 仔细检查一下你的代码,看是不是有编码问题。我在我的机器上做了个试验,同时启用LBR和BTF,没有跟踪,LBR寄存器还是在不停记录呀。
 lkd> wrmsr 1d9 3 [设置LBR和BTF位]
 lkd> rdmsr 1d9
 msr[1d9] = 00000000`00000003 【读回来看,验证】
 lkd> rdmsr 1c9
 msr[1c9] = 00000000`08000006  【读TOS寄存器】
 lkd> rdmsr 1c9
 msr[1c9] = 00000000`08000000  【再读TOS寄存器,看其在变】
 lkd> rdmsr 1c9
 msr[1c9] = 00000000`08000001
 lkd> rdmsr 41                          【读一个LBR栈寄存器,其内容是有效的】
 msr[41] = 8060d341`8060d0c3
 lkd> rdmsr 42
 msr[42] = 8060b33c`8060b32e 【再读一个LBR栈寄存器,其内容也是有效的】
 lkd> ln 8060d0c3
 (8060d00e)   nt!NtSystemDebugControl+0xb5   |  (8060d466)   nt!NtCreateKeyedEvent
 lkd> ln 8060d341
 (8060d00e)   nt!NtSystemDebugControl+0x333   |  (8060d466)   nt!NtCreateKeyedEvent
 
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-08-01, 16:07 下午 |  
											| 
													 shl 
 
   注册: 2008-07-10
 发 贴: 14
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| to Raymond: 
 我的CPU跟您的不一样。。。
 我是写1D9,读1DB和1DC。。。
 
 很奇怪。。。
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-08-01, 16:08 下午 |  
											| 
													 shl 
 
   注册: 2008-07-10
 发 贴: 14
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| |  forgot wrote: |  | | 跑这里来问了啊, BTF开启之后TF被视为是 Single Step On Branches,不是分支指令就不会 int1。 To Raymond:    所谓突破限制是指,hook 所有处理器的 int1 isr ,可以在中断里重新设置TF,然后根据 fs 判断进程记录一次LBR。 | 
 | 
   呵呵,你小子也来了。 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-08-02, 00:10 上午 |  
											| 
													 shl 
 
   注册: 2008-07-10
 发 贴: 14
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| BTF + LBR +TF(我这是需要OD来触发),Intel手册上是说BTF和TF都为1的时候 遇到分支就会产生INT1中断,于是,我们就是在ISR里读取LBR的(我这里是这么做的,fg那里的
 思路应该大致相同)......我对照过了,LBR里读出来的就是程序的分支.呵
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-08-02, 10:39 上午 |  
											| 
													 格蠹老雷 
 
   注册: 2005-12-19
 发 贴: 1,303
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| SHL, 那么就很正常了呀。像下面这样理解,你也许就明白了。
 记录和报告异常是CPU的两种动作,LBR位用来让CPU把分支记录到LBR栈(环形寄存器缓冲区)中。BTF+TF位让CPU遇到分支时产生异常。
 但以下两点值得注意:
 1)LBR和BTF位是在MSR寄存器中的,TF位是在标志寄存器中的。在目前的操作系统(Windows等)实现中,MSR寄存器是全局的,标记寄存器是线程相关的。也就是说,当CPU切换线程时,并不保存和恢复MSR寄存器的内容,但却保存和恢复标志寄存器的内容。
 2)TF和BTF位都是会被CPU自动清除的,也就是当CPU因为这两位而产生一次异常后,会自动将它们清除(《软件调试》96页)。这样做的原因也很明显,如果不清除,那么从分发和处理异常的代码便会不停再导致异常,CPU便死循环了。
 
 回到你的问题,你开启了LBR,而且不关闭,那么CPU应该始终在记录分支的,但是你只有在收到中断时才去读它。因为LBR栈可记录的分支非常少,所以你只能看到它记录的OD所调试程序中的分支。
 
 
 
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-08-02, 14:07 下午 |  
											| 
													 shl 
 
   注册: 2008-07-10
 发 贴: 14
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| to Raymond: 
 首先非常感谢您一直给我的解答,很感谢
 另外,您讲的这些我在Intel手册上和您的《软件调试》一书上都有看过
 原理和道理我也明白.
 
 关键问题是fg那边的实现思路跟我大致是一样的,只是他是用ASM写的,我是C
 而他那里跟我的现象相反.不需要OD来触发TF,在ISR中也可以读到所有的分支
 ,不过,他是怀疑他的机器中了病毒,而此病毒刚好是在不断触发TF,也就是说我和他
 只有其中一个才是正常的....呵呵...我去验证下去...
 
 谢谢~
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-08-07, 17:56 下午 |  
											| 
													 shl 
 
   注册: 2008-07-10
 发 贴: 14
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| hello~我已经可以确定我这的现象是正常的了,thx 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
		
			|  | 
						
							| 
									
										| 总页数 2 第 2 页  [共有 23 条记录] | < 1 2 |  |  |  
		
			| 高端调试 » 图书 » 《软件调试》的示例程序 » Re: 关于《软件调试》4.3.4 按分支单步执行。 |  |  
 |  |  |  |