本地内核调试环境搭建,就这么简单!

简介: 本地内核调试环境搭建,就这么简单!

前言

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

本地内核调试

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

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

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

通过命令行开启

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

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 基本命令

本地内核调试的限制

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

  • 执行命令,比如 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 的用法大家需要熟悉,在配置双机内核调试的时候还会用到。

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

参考资料

相关文章
本地内核调试神器 —— livekd 使用总结
本地内核调试神器 —— livekd 使用总结
|
1月前
|
Java 关系型数据库 MySQL
Linux环境
Linux环境
35 5
|
Ubuntu NoSQL IDE
树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译
树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译
树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译
|
6月前
|
Linux API C语言
FFmpeg开发笔记(一)搭建Linux系统的开发环境
本文指导初学者如何在Linux上搭建FFmpeg开发环境。首先,由于FFmpeg依赖第三方库,可以免去编译源码的复杂过程,直接安装预编译的FFmpeg动态库。推荐网站<https://github.com/BtbN/FFmpeg-Builds/releases>提供适用于不同系统的FFmpeg包。但在安装前,需确保系统有不低于2.22版本的glibc库。详细步骤包括下载glibc-2.23源码,配置、编译和安装。接着,下载Linux版FFmpeg安装包,解压至/usr/local/ffmpeg,并设置环境变量。最后编写和编译简单的C或C++测试程序验证FFmpeg环境是否正确配置。
185 8
FFmpeg开发笔记(一)搭建Linux系统的开发环境
|
11月前
|
NoSQL Linux 开发工具
Linux基础环境开发工具的使用(三):gdb调试器(上)
Linux基础环境开发工具的使用(三):gdb调试器
|
11月前
|
NoSQL Linux 开发工具
Linux基础环境开发工具的使用(三):gdb调试器(下)
Linux基础环境开发工具的使用(三):gdb调试器
|
NoSQL Linux 开发工具
Linux之基础开发工具gdb调试器的使用(三)
Linux之基础开发工具gdb调试器的使用(三)
45 0
|
存储 IDE 编译器
Windows 驱动开发环境搭建及 windbg 调试工具安装使用
对于 Windows 驱动开发,在微软官方的文档中其实有很多有用的文档来进行讲解和学习,这里将驱动开发统一归类成了 Windows 硬件开发([https://learn.microsoft.com/zh-cn/windows-hardware/drivers/](https://learn.microsoft.com/zh-cn/windows-hardware/drivers/)),在这个链接的相关文档中能够找到我们所需要的所有内容(由于Windows的不开源,所以我们对于Windows相关的学习要全部依赖官方释放的资料)。
478 0
|
NoSQL Linux 开发工具
gdb调试功能从零到会(Linux详解)
👀 1.安装gdb 👀2.判断是否安装成功 👀3.改成debug方式发布。 👀 4.gdb功能简介
413 1
|
Ubuntu Java 编译器
Linux操作系统笔记——GCC编译器
Linux操作系统笔记——GCC编译器
Linux操作系统笔记——GCC编译器