[文章主题]

Windbg是Windows驱动调试的重要软件,也是必须学习的软件,前面的博客介绍了一些双机调试的环境配置,只要按照我所说的步骤一步步下来就可以完成环境搭建。

本文主要介绍如何调试sys格式的驱动文件,网上很多资料都说得含糊不清,甚至有博主就是简单翻译外文资料,根本没有实际应用,这篇文章将解决这些问题。

[环境配置]

VM虚拟机(已安装XP系统)

DriverMonitor(安装在XP系统中)

WIN7系统(已安装VM、已安装Windbg)

[测试:在运行之前首先测试下VM与Windbg是否通讯正常,否则是无法完成调试的]

[调试开始]

1、首先在VS中完成代码的书写,并且编译出SYS,生成PDB符号文件。这都是必须的文件,缺一不可。

测试代码如下,可以直接拷贝到VS中编译,当然,编译需要WDK环境配置,之前的文章我已经介绍了。

<span style="font-size:12px;">/*
模块功能:测试代码
*/
#include "NTDDK.h" VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject);
NTSTATUS CreateMyDevice(PDRIVER_OBJECT pDriverObject); // 驱动入口函数
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{ KdPrint(("驱动加载+++\n")); // 注册卸载函数
pDriverObject->DriverUnload = DDK_Unload; // 创建设备
CreateMyDevice(pDriverObject); // 调试输出设备创建成功
KdPrint(("新设备已经创建成功!\n设备名:2016227_DeviceName\n符号链接是[symLinkDDK]\n"));
return STATUS_SUCCESS;
} // 卸载驱动
VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT pDevUnload_Object;
UNICODE_STRING symLinkName; KdPrint(("进入卸载函数\n")); pDevUnload_Object = pDriverObject->DeviceObject; // 删除设备
IoDeleteDevice(pDevUnload_Object); //获取符号连接
RtlInitUnicodeString(&symLinkName,L"\\??\\symLinkDDK"); // 删除符号连接
IoDeleteSymbolicLink(&symLinkName); KdPrint(("Kd输出模式:结束卸载函数\n")); DbgPrint("DbgPrint输出模式:驱动已经卸载,执行成功!\n");
} // 创建设备
NTSTATUS CreateMyDevice(PDRIVER_OBJECT pDriverObject)
{
NTSTATUS status;
// 设备对象
PDEVICE_OBJECT pDevObj; // 创建设备名称
UNICODE_STRING devName;
UNICODE_STRING symLinkName; // 初始化设备名
RtlInitUnicodeString(&devName,L"\\Device\\2016227_DeviceName"); // 创建设备
status = IoCreateDevice(
pDriverObject,
0,
&devName,
FILE_DEVICE_UNKNOWN,
0,
TRUE,
&pDevObj); // 检测设备创建情况
if(!NT_SUCCESS(status))
{
if(status == STATUS_INSUFFICIENT_RESOURCES)
{
KdPrint(("资源不足\n"));
}
else if(status == STATUS_OBJECT_NAME_EXISTS)
{
KdPrint(("设备名称已经存在\n"));
}
else if(status == STATUS_OBJECT_NAME_COLLISION)
{
KdPrint(("设备冲突\n"));
}
return status; }
else
{
KdPrint(("设备成功创建\n"));
}
// 置于缓冲区运行
pDevObj->Flags |= DO_BUFFERED_IO; // 创建符号连接
RtlInitUnicodeString(&symLinkName, L"\\??\\symLinkDDK");
status = IoCreateSymbolicLink(&symLinkName, &devName); if(!NT_SUCCESS(status))
{ // 删除错误的设备创建
IoDeleteDevice(pDevObj);
return status; } return STATUS_SUCCESS;
}</span>

注意:为了生成可用的PDB符号文件,还需要对DDK做一些处理才可以生成出PDB文件。

最后生成的文件有SYS、PDB

2、将源文件和PDB文件复制到一个新建的文件夹中

3、打开Windbg,将PDB、CPP引用进去,以让windbg有正确的符号连接并且有正确的源码响应。

4、使用windbg打开源文件,F9设置断点。

5、运行windbg,在VM中加载驱动,使用DriverMonitor进行加载。

首先在windbg运行“g”,让Debugging运行起来,然后再进入虚拟机进行加载卸载操作,如果有断点,Windbg会自动命中断点并且显示出来!

[至此]

Windbg调试基本步骤就完成了,当然,最好是根据前面的DDK模板设置来对模板进行修改,达到不用每次都修改生成正确的PDB文件,希望这篇文章对你有帮助,当然如果有其他问题可以直接联系作者进行讨论!

Windbg断点调试的更多相关文章

  1. Windbg断点调试.net程序

    程序员都知道,在生产环境中,如果没有系统日志,对问题的分析将非常的困难.即使有日志,有时候也会因为日志记录的不全面,而导致问题不能分析清楚.其实,Windbg里面有Live Debug功能,正好可以借 ...

  2. Windbg程序调试--转载

    WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件. WinDbg是微软很重要的诊断调试工具: 可以查 ...

  3. 使用WinDbg内核调试[转]

    Technorati 标签: windbg,内核调试 WINDOWS调试工具很强大,但是学习使用它们并不容易.特别对于驱动开发者使用的WinDbg和KD这两个内核调试器(CDB和NTSD是用户态调试器 ...

  4. PhpStorm集成xdebug进行断点调试

    本文介绍如何使用PhpStorm集成xdebug在本地开发环境进行断点调试的技巧. 我配置的环境是:Windows10 + PhpStorm10.0.1 + PHP5.6. 1. 下载xdebug的扩 ...

  5. PyCharm断点调试django

    我在用PyCharm开发django程序的时候,对于打印日志调试程序的方式感觉还是有点麻烦和不直观,所以研究了一下断点调试的方法如下: 1.打开你的工程,在菜单栏里找到Run-->Edit Co ...

  6. netbeans-xdebug 断点调试php

    来自NetBeans官网的帮助文档: https://netbeans.org/kb/docs/php/debugging_zh_CN.html 但具体问题,我们还是要说下 准备工作 本地部署的ser ...

  7. Drools mvel方言drl断点调试方法

    开发环境:myeclipse2014,  jdk1.8.0.91,drools6.4.0.Final, drools-eclipse-plugin,mvel2-2.2.6.Final问题描述:drl使 ...

  8. Eclipse断点调试

    转自:http://blog.csdn.net/maritimesun/article/details/7815903 作为开发人员,掌握开发环境下的调试技巧十分有必要.去年就想把关于Eclipse断 ...

  9. js断点调试心得

    虽然网上已经有多的数不清的调试教程了,但仍然没有发现哪篇文章写的通俗易懂,索性自己尝试写写自己的一些使用习惯或者说是心得,希望对那些还不是很懂得使用断点调试的孩子有一些帮助(大神请无视~). 1.断点 ...

随机推荐

  1. linux基础命令一

    linux基础命令一 1.date命令 date命令介绍:显示或者设置系统日期 date命令的语法: 显示日期:date  [options...]  [+FORMAT] FORMAT:为显示日期的格 ...

  2. Flex布局-项目的属性

    Flex项目有以下6个属性: order flex-grow flex-shrink flex-basis flex align-self order属性定义项目的排列顺序.数值越小,排列越靠前,默认 ...

  3. 解决yii2 禁用layout时AppAsset不加载资源的问题

    大王派我来巡山_site:http://blog.csdn.net/wang78699425/article/details/52369841 最近由于项目(yii2 的一个项目)需要,登录页面不需要 ...

  4. confluence中org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed的解决方法

    https://www.cnblogs.com/heyongboke/p/9806396.html 1.confluence中报错信息如下: 严重 [http-nio-18090-Acceptor-0 ...

  5. JDK / JRE zip

    Server JRE与JRE的区别: Server JRE一般用于服务器上安装,只有64bit版本,不会安装浏览器插件.自动更新,有监视工具.没有Java Fx和其他开发工具:有安装程序,只是一压缩目 ...

  6. centos 7中监控mysql 数据库脚本(监控端口)

    centos 7中监控mysql 数据库脚本(监控端口) 监控mysql数据库的方法如下: 1.监控端口 netstat -nltp |grep 3306 2.监控进程 ps -ef |grep 33 ...

  7. Cookie深度解析

    最近在公司做了Web端单点登录(SSO)功能,基于Cookie实现,做完之后感觉有必要总结一下,本文着重讲解Cookie,下文会说明单点登录的实现方案. Cookie简介 众所周知,Web协议(也就是 ...

  8. 《企业IT架构转型之道》读书笔记

    1 出发点:企业IT系统建设普遍面临的问题和处境 很多企业面临的问题和处境: 『烟囱式』系统建设模式. 当业务部门提出业务需求,信息中心部门进行系统集成商的招投标,再进入到需求收集.需求分析.开发.测 ...

  9. C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新)

    历史版本C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECMA ...

  10. U3D学习13-数据存储

    1.SQLLite 要注意Plguins的三个dll资源 2.利用ScriptableObject将数据存储为资源(小规模数据) using UnityEngine; using System.Col ...