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

Windows内核调试

帖子发起人: 大饼   发起时间: 2009-09-01 01:47 上午   回复: 4

Print Search
帖子排序:    
   2009-09-01, 01:47 上午
cctvcccc 离线,最后访问时间: 2009/9/2 2:56:55 大饼

发帖数前200位
注册: 2009-09-01
发 贴: 5
对BSOD的过程一些疑问
Reply Quote
我用windbg调试虚拟机,输入.crash命令,这时候中断到windbg了,我看虚拟机上蓝屏界面已经绘制了,而跟据《软件调试》中说的,绘制画面是第五步,而第三步的时候会第一次中断到调试器,但是我的windbg在蓝屏绘制后才中断,也就是书上说的第二次中断。
另外书上第四步说系统调用KeDisableInterrupts函数禁止中断,但是中断是cpu的功能,这个函数如何能禁止呢,这个函数执行后系统还有其它的操作,如果中断都禁止了,其它的操作应该不能进行吧。
另外一个奇怪的问题是我对例如KeDisableInterrupts,KeRaiseIrql等函数下bu断点,再运行g命令,windbg以及虚拟机都会死掉,不知道为什么。还请张老师帮忙讲解一下
IP 地址: 已记录   报告
   2009-09-01, 08:54 上午
yicaolove 离线,最后访问时间: 2011/2/17 6:15:38 nigel

发帖数前50位
注册: 2009-05-20
发 贴: 18
Re: 对BSOD的过程一些疑问
Reply Quote
你所提的部分问题张老师曾经给予过我指点,请进如下页面,或许对你会有帮助!http://advdbg.com/forums/2892/ShowPost.aspx
IP 地址: 已记录   报告
   2009-09-01, 10:47 上午
cctvcccc 离线,最后访问时间: 2009/9/2 2:56:55 大饼

发帖数前200位
注册: 2009-09-01
发 贴: 5
Re: 对BSOD的过程一些疑问
Reply Quote
恩,谢谢,这下知道了为什么有时候有的函数不能被调试。不过1,2两个问题还是不明白
IP 地址: 已记录   报告
   2009-09-01, 13:03 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 对BSOD的过程一些疑问
Reply Quote

关于第一个问题,对于手工触发的蓝屏(停止码为0xE2,包括使用.crash命令的),KeBugCheck2故意判断了下,如果是就不中断了,看下汇编便可看到这个逻辑:

nt!KeBugCheck2+0x3e6:
805260d9 817d08e2000000  cmp     dword ptr [ebp+8],0E2h        ;看第一个参数,即StopCode是否等于E2
805260e0 747e            je      nt!KeBugCheck2+0x46d (80526160) ;如果相等则直接跳到下一个步骤
;;如果不等,则打印信息后中断到调试器

*** Fatal System Error: 0x0000008e
                       (0xC0000005,0xFA02F463,0xF9C4BB68,0x00000000)

Break instruction exception - code 80000003 (first chance)

A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.

...

;;如果是0xe2,则直接跳到这里

nt!KeBugCheck2+0x46d:
80526160 e85199feff      call    nt!KeDisableInterrupts (8050fab6)  ;清除中断标志
80526165 b11f            mov     cl,1Fh
80526167 ff1548464d80    call    dword ptr [nt!_imp_KfRaiseIrql (804d4648)]  ; 提升IRQL
8052616d b8ffffffff      mov     eax,0FFFFFFFFh

问题2,x86 CPU提供了CLI指令来清除(允许)中断标志,KeDisableInterrupts函数正是使用这条指令来做的:

lkd> u nt!KeDisableInterrupts
nt!KeDisableInterrupts:
80501d58 9c              pushfd                   ; 将标志寄存器压入栈
80501d59 58              pop     eax              ; 弹出到EAX寄存器,这是读取标志寄存器的典型做法
80501d5a 2500020000      and     eax,200h         ; 取IF位,也就是中断标志位
80501d5f c1e809          shr     eax,9            ; 右移到最低位
80501d62 fa              cli                      ; 清除IF位
80501d63 c3              ret

前几条指令是取当前的IF位作为返回值。

在这一步之后的操作都是不依赖于中断机制的,所以只能做有限的操作。

 


IP 地址: 已记录   报告
   2009-09-02, 02:52 上午
cctvcccc 离线,最后访问时间: 2009/9/2 2:56:55 大饼

发帖数前200位
注册: 2009-09-01
发 贴: 5
Re: 对BSOD的过程一些疑问
Reply Quote
明白了很多,多谢张老师指导
IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » Re: 对BSOD的过程一些疑问

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