better0332 wrote: 还有一问: 《在内核调试会话中设置用户态断点》 内核调试器不能捕获用户态中的异常,那它怎么能去调试用户态中的程序呢??
系统在分发用户态异常时会判断是否需要发给内核调试器(《软件调试》11.3.3,P287),如果需要,那么还是会发给内核调试器的。而且这是可以配置的。
配置有多种方法,比如启动参数中的/noumex,也可以使用WinDBG工具包中的kdbgctrl小程序:
C:\windbg>kdbgctrlUsage: kdbgctrl <options>Options: -c - Check kernel debugger block-enable -ca - Check kernel debugger auto-enable -cb - Check kernel debugger enable block -cdb - Check kernel DbgPrint buffer size -cu - Check kernel debugger user exception handling -cx - Check kernel debugger enable and exit with status -d - Disable kernel debugger -da - Disable kernel debugger auto-enable -db - Disable kernel debugger block-enable -du - Disable kernel debugger user exception handling -e - Enable kernel debugger -ea - Enable kernel debugger auto-enable -eb - Enable kernel debugger block-enable -eu - Enable kernel debugger user exception handling -sdb <size> - Set kernel DbgPrint buffer size -td <pid> <file> - Get a kernel triage dump
其中的eu开关就是于此有关的。
noumex Specifies that the kernel debugger does not break for user-mode exceptions. By default, the kernel debugger breaks for particular user-mode exceptions, such as STATUS_BREAKPOINT and STATUS_SINGLE_STEP. The /debug=noumex parameter is effective only when there is no user-mode debugger attached to the process. 看了WinDBG的help总算明白了……
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - debug" /fastdetect /debug=noumex /debugport=com1 /baudrate=115200
我这样配置的,但好像没起作用……晕
kdbgctrl就更奇怪了:
C:\>kdbgctrl -euUnable to set Kernel debugger user exception enable, NTSTATUS 0xC0000003 { }