zoukankan      html  css  js  c++  java
  • 本地内核调试环境搭建,就这么简单!

    前言

    内核调试默认是关闭的,需要手动开启。本文将简单介绍如何在 Vista 及后续版本的系统中开启本地内核调试,并简要介绍使用 windbg 连接内核的方法。在 xp 系统中,对应的设置保存在 boot.ini 中,感兴趣的小伙伴儿请自行搜索设置方法。

    本地内核调试

    windbg 不仅可以作为用户态调试器使用,还可以作为内核调试器使用。相较于命令行版本的 kd.exewindbg 更友好。在 windbg 中,通过菜单 File -> Kernel Debug (Ctrl + K) 可以打开内核调试设置界面,如下图:

    windbg 本地内核调试界面
    windbg 本地内核调试界面

    NETUSB1394COM 这四个选项是针对双机内核调试的,本文不涉及。Local 是本地内核调试用的,我们发现不用进行任何设置。点击 确定 按钮即可进行本地内核调试。

    如果觉得上述操作太繁琐,我们可以以管理员权限运行 windbg.exe -kl 直接开启本地内核调试。

    可能遇到的问题

    我们可能遇到下面的错误提示:

    Local kernel debugging requires Administrative
    privileges, and is not supported by WOW64.
    Only a single local kernel debugging session can run at a time.
    Local kernel debugging is disabled by default. You must run 'bcdedit -debug on' and reboot to enable it.

    具体错误提示如下图:

    windbg 本地内核调试时遇到的错误提示
    windbg 本地内核调试时遇到的错误提示

    根据错误提示,我们可以知道进行本地内核调试需要注意以下几点:

    1. 本地内核调试需要管理员权限。
    2. 不支持 WOW64。如果是 64 位系统,必须使用 64 位的 windbg
    3. 同一时间只能建立一个本地内核调试会话。
    4. 本地内核调试默认是关闭的。需要通过 bcdedit /debug on 开启,重启生效。

    通过命令行开启

    按照提示,以管理员权限执行 bcdedit /debug on 。重启系统后,以管理员权限运行 windbg -kl 进行本地内核调试。如果顺利,我们就可以进行本地内核调试了。

    windbg 本地内核调试
    windbg 本地内核调试

    通过界面开启

    我们也可以通过 msconfig 打开系统配置,在 引导高级选项 对话框中开启本地内核调试。具体设置过程请参考下图。

    引导高级选项设置
    引导高级选项设置

    关闭安全启动

    以管理员权限执行 bcdedit /debug on,如果顺利,会有操作成功的提示,如下图。

    开启本地内核调试
    开启本地内核调试

    在某些机器的 win10 系统中,可能会遇到如下的提示。

    开启本地内核调试失败
    开启本地内核调试失败

    正如 微软官方文档 里介绍的那样:

    Before using bcdedit to change boot information you may need to temporarily suspend Windows security features such as BitLocker and Secure Boot on the test PC. You can re-enable Secure Boot once you’re done debugging and you’ve disabled kernel debugging on the local computer.

    在使用 bcdedit 更改启动信息之前,我们可能需要暂时关闭 Windows 的安全特性,比如 BitLocker 和安全启动。

    我电脑上的安全启动选项是启用的,如下图:

    安全启动开启状态
    安全启动开启状态

    BIOS 里禁用安全启动后,重新执行 bcdedit /debug on 即可成功开启本地内核调试。

    开启本地内核调试
    开启本地内核调试

    bcdedit 用法简介

    可以直接运行 bcdedit /? 查看帮助,通过 bcdedit /? command 查看每个命令的用法。

    其实, bcdedit /debug on 的完整版是 bcdedit /debug [{ID}] { on | off },如果省略 {ID},默认取 {current}。如果想为其它系统设置,可以指定对应启动项的标识符。

    • 执行 bcdedit /enum [{ID}] 可以列出指定 ID 对应的启动项, 如不指定 ID 可以列出所有的启动项。

    • 执行 bcdedit /copy {ID} /d "description" 可以把当前的启动项复制一份。

    • 执行 bcdedit /delete {ID} 可以删除指定 ID 对应的启动项。

    bcdedit 基本命令
    bcdedit 基本命令

    本地内核调试的限制

    在进行本地内核调试的时候,下面这些命令是不能执行的:

    • 执行命令,比如 g (Go)p (Step)t (Trace)wt (Trace and Watch Data)tb (Trace to Next Branch)gh (Go with Exception Handled)gn (Go with Exception Not Handled)
    • 关机和转储命令。比如,.crash.dump.reboot 等。
    • 断点命令。比如,b 系列命令。bpbubabcbdbebl等。
    • 寄存器显示命令。比如 r 系列命令。
    • 栈命令。比如,k 系列命令。

    小知识

    不知道大家平时是怎么截图的。是否用过键盘上的 PrtSc 键(一般在 F12 右侧)截图呢?也许有的小伙伴会问,截图键跟内核调试有什么关系?其实,在很多键盘上,PrtScSysRq 是同一个键。

    键盘布局图-转自维基百科
    键盘布局图-转自维基百科

    当我们开启本地内核调试后,如果我们按 SysRq 键,系统会挂起。具体可以参考张老师的回帖。http://advdbg.org/forums/6537/ShowPost.aspx#6537。前几天访问高端调试论坛,发现挂了,今日终于能访问了,赶紧截图保存一份。

    高端调试论坛相关帖子
    高端调试论坛相关帖子

    SysRqLinux 下也有类似的作用,可以参考网址 https://www.ibm.com/developerworks/cn/linux/l-cn-sysrq/。

    温馨提示:

    一定要记住这个小知识。我被这个“虐”了很久。当年在公司机器上开启内核调试后,不知道这回事。在开发过程中需要截图,一按PrtSc 系统就挂起,一按 PrtSc 系统就挂起。害我重启了 N 次。说多了都是泪。

    总结

    • bcdedit /debug on|off 可以开启(关闭)本地内核调试。

    • 如果开启本地内核调试失败,提示 该值受安全引导策略保护,无法进行修改或删除,可以在 BIOS 中关闭安全引导。

    • 运行 kd.exe -kl 或者 windbg.exe -kl 可以进行本地内核调试。

    • 本地内核调试需要管理员权限,如果遇到错误,请先检查权限。

    • bcdedit 的用法大家需要熟悉,在配置双机内核调试的时候还会用到。

    本以为在本地内核调试的时候,可以很方便的保存一份转储文件,没想到居然不支持!如果有哪位小伙伴儿知道如何在本地内核调试的时候比较方便的保存一份系统转储文件,烦请告知。

    参考资料

  • 相关阅读:
    Spring MVC Controller中GET方式传过来的中文参数会乱码的问题
    解决Scala异常处理java.lang.OutOfMemoryError: Java heap space error
    sbt的安装设置
    Oracle VM VirtualBox 设置本机与虚拟机共享文件
    Hadoop fs命令详解
    Oracle 11g CPU负载很高紧急处理【负载100%】
    Oracle单表备份三种方案
    Nginx1.9.xx以后版支持4层tcp转发
    用SQL命令查看Mysql数据库大小
    Jenkins: ERROR: Exception when publishing, exception message [java.net.SocketException: Broken pipe (Write failed)]
  • 原文地址:https://www.cnblogs.com/bianchengnan/p/12423672.html
Copyright © 2011-2022 走看看