当前位置: 首页 > news >正文

Windows下调试工具Windbg入门

前言

Windbg简单来说就是一个Windows下对用户态/内核态的程序进行调试,以及对Core Dump文件的分析。对于Crash,资源泄露,死锁等问题的分析,Windbg是一个强有力的利器。

一、下载

微软官网提供的Windbg为windows10版本,win7下不能使用。Win7下使用Windbg需要通过Windows SDK下载,下载链接为//www.microsoft.com/downloads/en/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b&displaylang=en

  • 安装

如果对windows SDK的其他内容不感兴趣,可只勾选Windbg.

安装完成后便可以在Windows开始菜单栏中找到Windbg.

安装可能会失败,如果失败的话可以到控“制面板\程序\程序和功能“中将 Microsoft Visual C++ 2010 Redistributable卸载,即可安装成功。(Redistribution,可再发行的,独立软件供应商可能希望将此包作为可再分发的组件包含在其应用程中。)

二、Windows 调试中的符号表

1.关于符号表

符号表,对于vs用户来说,符号表就是vs生成的.pdb文件,比如你写了个helloword,一般会生成一个helloword.exe是执行程序,helloword.pdb就是符号表。

这些符号表,程序运行过程中没啥用,但是调试的时候有用,这里面主要记录了下面这些东西。

  1. 全局变量
  2. 局部变量
  3. 函数名以及他们实体指针的地址
  4. 帧指针表
  5. 源代码行数

调试时,必须知道调试器能够获取与调试目标相匹配的symbol files,在线调试和调试crash dump files都需要symbols。

Windows以后缀名pdb保存symbols,vs将所有symbols保存在pdb文件中。

三、调试入门

1、断点和单步调试

这个功能一般也不会用windbg来做,一般都是在开发自测过程汇总用vs来调试的,毕竟用vs方便些。

假设你已经编写如下程序

void MyFunction(long p1, long p2, long p3)
{
    long x = p1 + p2 + p3;
    long y = 0;
    y = x / p2;
}

void main()
{
    long a = 2;
    long b = 0;
    MyFunction(a, b, 5);
}

(1)用Visual studio 2015在x64、debug模式下生成一个Helloworld.exe,同时生成一个Helloworld.pdb。

(2)配置符号表

如下图,就是把你的pdb文件所在的文件夹路径,拷贝过来设置一下就好了。

(3)用windbg打开Helloworld.exe和Helloworld.cpp(一般调试不需要源文件)

接着就可以输入调试命令进行输入了,例如:

  1. bu HelloWorld!main

意思是在HelloWorld的main模块处设置断点

  1. g

开始运行程序

  1. 按F11进行单步调试,直到程序运行到y = x / p2将会崩溃,输出错误信息,类似这样:

(3058.3830): Integer divide-by-zero - code c0000094 (first chance)

First chance exceptions are reported before any exception handling.

This exception may be expected and handled.

HelloWorld!MyFunction+0x53:

00000001`3f2a16d3 f7bd28010000    idiv    eax,dword ptr [rbp+128h] ss:00000000`0014f648=00000000

是说发生了0除错误。

(4)!analyze -v

将会生成一堆对错误的分析。

2、调试崩溃

适用于以下场景:

你的程序开发好了,在本地运行好好的,但是部署到服务器上了,崩溃了,或偶现崩溃,比较容易复现。

3、调试dump

适用于以下场景:

你的程序开发好了,部署到服务器上了,偶现崩溃,产生了dump,很难复现。所以只能分析dump。

 

其他命令:

  1. bu notepad!WinMain 设置断点
  2. bl 显示已经设置的断点信息
  3. g 运行程序直到断点、崩溃或程序结束
  4. lm 显示notepad程序已经加载的模块
  5. k显示当前线程的堆栈轨迹,即函数调用结构表
  6. g 继续运行
  7. 按菜单栏的stop按钮停止调试
  8. bu ntdll!ZwWriteFile 设置新的断点
  9. bl 显示断点信息
  10. ~ 查看当前程序的所有线程
  11. ~0s

k

以上两个命令可以进入0好进程,并查看堆栈轨迹

  1. qd退出调试

相关文章:

  • 符号文件
  • 浏览器沙箱(sandBox)到底是什么?
  • 渲染
  • URI和URL的区别比较与理解
  • CEF调试Render进程
  • Chrome V8引擎介绍
  • c++中的 extern “C“
  • 中断向量表
  • WM_NCCREATE与WM_CREATE的区别
  • GetWindowLongPtr
  • WNDCLASSEX
  • C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast)
  • C++ 虚函数表 vfptr
  • WM_NCHITTEST
  • CreateProcess函数详解
  • 【笔记】你不知道的JS读书笔记——Promise
  • canvas 五子棋游戏
  • download使用浅析
  • ECS应用管理最佳实践
  • Java 23种设计模式 之单例模式 7种实现方式
  • Javascript 原型链
  • JavaScript对象详解
  • Laravel Mix运行时关于es2015报错解决方案
  • Quartz初级教程
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 编写高质量JavaScript代码之并发
  • 高性能JavaScript阅读简记(三)
  • 给Prometheus造假数据的方法
  • 来,膜拜下android roadmap,强大的执行力
  • 那些年我们用过的显示性能指标
  • 容器服务kubernetes弹性伸缩高级用法
  • 深度学习中的信息论知识详解
  • 使用agvtool更改app version/build
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • gunicorn工作原理
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 如何正确理解,内页权重高于首页?
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (LeetCode C++)盛最多水的容器
  • (Python第六天)文件处理
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (三)模仿学习-Action数据的模仿
  • (十六)Flask之蓝图
  • (转)linux 命令大全
  • (转)Mysql的优化设置
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .cn根服务器被攻击之后
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [2018-01-08] Python强化周的第一天
  • [APIO2012] 派遣 dispatching