Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

《软件调试》的示例程序

帖子发起人: 格蠹老雷   发起时间: 2008-07-31 22:44 下午   回复: 22

Print Search
帖子排序:    
   2008-07-31, 22:44 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 关于《软件调试》4.3.4 按分支单步执行。
Reply Quote
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/7/26 12:30:46 shl

发帖数前75位
注册: 2008-07-10
发 贴: 14
Re: 关于《软件调试》4.3.4 按分支单步执行。
Reply Quote
to Raymond:

我的CPU跟您的不一样。。。
我是写1D9,读1DB和1DC。。。

很奇怪。。。
IP 地址: 已记录   报告
   2008-08-01, 16:08 下午
shl 离线,最后访问时间: 2008/7/26 12:30:46 shl

发帖数前75位
注册: 2008-07-10
发 贴: 14
Re: 关于《软件调试》4.3.4 按分支单步执行。
Reply Quote
 forgot wrote:

跑这里来问了啊,

BTF开启之后TF被视为是 Single Step On Branches,不是分支指令就不会 int1。

To Raymond:

   所谓突破限制是指,hook 所有处理器的 int1 isr ,可以在中断里重新设置TF,然后根据 fs 判断进程记录一次LBR。

 

呵呵,你小子也来了。


IP 地址: 已记录   报告
   2008-08-01, 22:16 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 关于《软件调试》4.3.4 按分支单步执行。
Reply Quote

SHL和FORGOT,

根据你们的描述,感觉是在中断触发(INT 1)下读取LBR寄存器。没有中断发生时,你们是怎么读取LBR寄存器的呢?另外,你们是怎么判断CPU没有记录分支呢?从LBR寄存器读出的是什么内容?


IP 地址: 已记录   报告
   2008-08-02, 00:10 上午
shl 离线,最后访问时间: 2008/7/26 12:30:46 shl

发帖数前75位
注册: 2008-07-10
发 贴: 14
Re: 关于《软件调试》4.3.4 按分支单步执行。
Reply Quote
BTF + LBR +TF(我这是需要OD来触发),Intel手册上是说BTF和TF都为1的时候
遇到分支就会产生INT1中断,于是,我们就是在ISR里读取LBR的(我这里是这么做的,fg那里的
思路应该大致相同)......我对照过了,LBR里读出来的就是程序的分支.呵
IP 地址: 已记录   报告
   2008-08-02, 10:39 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 关于《软件调试》4.3.4 按分支单步执行。
Reply Quote
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/7/26 12:30:46 shl

发帖数前75位
注册: 2008-07-10
发 贴: 14
Re: 关于《软件调试》4.3.4 按分支单步执行。
Reply Quote
to Raymond:

首先非常感谢您一直给我的解答,很感谢
另外,您讲的这些我在Intel手册上和您的《软件调试》一书上都有看过
原理和道理我也明白.

关键问题是fg那边的实现思路跟我大致是一样的,只是他是用ASM写的,我是C
而他那里跟我的现象相反.不需要OD来触发TF,在ISR中也可以读到所有的分支
,不过,他是怀疑他的机器中了病毒,而此病毒刚好是在不断触发TF,也就是说我和他
只有其中一个才是正常的....呵呵...我去验证下去...

谢谢~
IP 地址: 已记录   报告
   2008-08-07, 17:56 下午
shl 离线,最后访问时间: 2008/7/26 12:30:46 shl

发帖数前75位
注册: 2008-07-10
发 贴: 14
Re: 关于《软件调试》4.3.4 按分支单步执行。
Reply Quote
hello~我已经可以确定我这的现象是正常的了,thx
IP 地址: 已记录   报告
  总页数 2 第 2 页 [共有 23 条记录] < 1 2
高端调试 » 图书 » 《软件调试》的示例程序 » Re: 关于《软件调试》4.3.4 按分支单步执行。

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.