winDebug 调试

article/2025/10/6 21:25:02

1.背景

最近由于线上的程序发生了死锁,而且重现的概率很低,正好客户反馈一个任务超时了,登上线上环境发现有一个“僵尸”进程,占用内存不波动,cpu仍在占用,

那么用创建转储文件,用windbg调试吧。

2.准备
2.1.下载windbg
需要下载Windows 调试工具 (WinDbg):Windows 10 SDK,安装时候根据需要,可以只安装Debugging Tools For Windows,即windbg;
如果已下载并安装Windows 10 SDK,而没有安装Windbg,那么在控制面板》程序》Windows Software Development Kit》右键选择更改》change》勾选Debugging Tools For Windows》安装 

2.2.相关知识

可参考官方文章:

Windows 调试入门

WinDbg 入门(内核模式)

WinDbg 入门(用户模式)

使用 WinDbg 进行调试

后文还会贴出一些有参考价值的博客文章;

2.3.所需文件
2.3.1.DMP文件
.dump(创建转储文件)
可以为进程创建转储文件(dmp),既可以在任务有管理中选中进程》右键》创建转储文件;
也可以用windbg附加到进程(附加后会让程序暂停,注意这时候要用windbg的g(go)或者step out、step over等让程序继续运行,运行完再创建dmp文件)让程序运行到出错位置后,windbg会发现异常并中断,然后输入:.dump /f e:dump/XXXX.dmp,生成全信息的dmp文件;
当然转储文件有多种,详细参考官方文章;
2.3.2.符号文件
需要符号文件,就像VS里面设置符号加载,这里可以包含调试目标程序的符号文件(pdb)路径、microsoft符号文件及符号缓存目录;借助符号文件和源代码可以准确的定位堆栈位置及异常位置;

在windbg中符号路径设置里注意事项:SRV*e:\symbols*http://msdl.microsoft.com/download/symbols;C:\Users\heuwz\source\repos\x64\Release

其中*e:\symbols*为符号缓存目录(就像VS中设置符号缓存目录),http://msdl.microsoft.com/download/symbols为microsoft符号服务器,C:\Users\heuwz\source\repos\x64\Release为目标程序符号(pdb文件)所在目录;

在Windbg中Ctrl+s快捷键可以打开设置符号路径面板;

设置时可以合理的利用面板中的Browser按钮选择本地目录,这样可以最大化的避免手动输入可能带来的格式问题;

2.3.3.源代码文件
需要结合符号文件和源代码文件来分析确定堆栈位置、异常位置等再源代码中的位置,从而提供更准确的调试信息,供使用者进一步的分析问题;

设置源代码文件路径(ctrl+p),仅仅是相关的代码文件就可;

同样可以合理的利用面板中的Browser按钮选择本地目录,这样可以最大化的避免手动输入可能带来的格式问题;

3.开始
为方便说明,下面以一个例子进行讲解,

3.1.准备程序
代码(会引发异常)如下

#include "pch.h"
#include <iostream>
#include <thread>
#include <windows.h>using namespace std;class TestClass
{
//  该类仅做示例用,有很多不规范的地方,比如构造函数,析构函数,赋值重载,成员字段公开等问题
//  读者可批判的看待
public:int NTest;};int main()
{std::cout << "Hello World!\n";Sleep(50000);TestClass* testPtr = 0;//  出问题了testPtr->NTest = 3;std::cout << testPtr->NTest << std::endl;}

编译生成可执行程序;

  • windbg发现异常并中断,然后输入:.dump /f e:dump/XXXX.dmp,来生成全信息的dmp文件;更多命令可参见https://www.cnblogs.com/yilang/p/13031394.html.dump(创建转储文件)​​​​​​

3.3.调试分析问题

让用户把生成的DMP文件发给自己,然后自己继续用Windbg+DMP文件+符号+源代码文件来调试分析问题;

(1)亲测,可以先设置源码路径和符号路径,再去打开dmp文件,会自动定位到异常位置;
(2)亲测,也可以先打开dmp文件;再设置符号路径(ctrl+s),注意设置完后勾选reload;再设置源代码文件路径(ctrl+p),仅仅是相关的代码文件就可,也会自动定位到异常位置;

(3)符号路径设置里注意事项:SRV*e:\symbols*http://msdl.microsoft.com/download/symbols;C:\Users\heuwz\source\repos\x64\Release
其中SRV后面**中间的路径为符号缓存路径,会将通过后面符号器下载的符号缓存到这个位置;后面紧跟的是微软符号服务器;再后面是调试的dmp文件对应exe的符号路径;
(4)设置符号路径和代码文件路径时可以用browser按钮来设置,这样会避免格式出错问题;

当然如果是死锁问题,那么需要输入命令:!analyze -v -hang

回车,等待分析完,然后结合其他命令,如,

~*kb:显示当前进程所有线程的堆栈;

~1kb:显示一号线程堆栈;

d:命令显示esp寄存器指向的内存;

!cs -s:如果可能的话,显示每个临界区的初始堆栈回溯;

!cs -l:仅显示锁定的临界区;

!locks:查看所有的线程占用的锁情况;

~~[ce84]s:切换到线程ce84;

kb:查看该线程的函数调用栈情况;

定位各线程的堆栈和对应在代码中的位置,然后分析产生死锁的原因;

 3.4.其他
可以用windbg分析dmp,也可以直接用vs打开dmp文件来分析,
实测过程中,
(1)用windows管理器的“创建转储文件”生成的dmp,既可以用vs打开,也可以用windbg打开;
(2)用windbg附加到进程的方式(附加后会让程序暂停,注意这时候要用windbg的g(go)或者step out、step over等让程序继续运行,运行完再创建dmp文件)
让程序运行到出错位置后,windbg会发现异常并中断,然后输入:.dump /f e:dump/XXXX.dmp,来生成全信息的dmp文件;
这种方式的dmp文件可以用windbg分析,但用vs打开会提示版本过旧,无法打开;原因可能如下使用 Visual Studio 打开转储文件

4.参考资料
除了官方文章外,学习过程中还参考了如下文章,

4.1.参考较多的文章
1、使用windbg抓取崩溃文件和分析的过程
https://blog.csdn.net/breaksoftware/article/details/13989025

备注:实操性强;

2、winDbg定位异常崩溃和线程死锁三步骤
https://blog.csdn.net/lv_yjie2011/article/details/41706231
备注:这一篇博客属于导航类的博客,导航到了其他博客,也十分有帮助;

3、WinDbg非常简单的调试dmp文件
https://blog.csdn.net/u010340160/article/details/84452408
备注:这篇博客说的没错,很简单,但对于新手来说太简单了,很多相关的概念和原理没说,只是一个流程,照着做;
4、记录windbg调试临界区死锁问题
https://www.cnblogs.com/pro-love/p/10936029.html
备注:实操性强,有帮助;
5、windbg解决线程死锁
https://blog.csdn.net/woshiyuanlei/article/details/47657313
备注:介绍了丰富的windbg命令,根据需要可以参考;

4.2.其他参考文章
1、17.windbg-!cs、~~[TID](经典死锁)
https://blog.csdn.net/hgy413/article/details/7572097
2、Windbg中查看函数参数
https://blog.csdn.net/wonderdaydream/article/details/73554644
3、Windbg找出死锁
https://www.cnblogs.com/leo_wl/p/3406212.html
4、windbg的使用四(Windbg检查死锁 )
https://blog.csdn.net/chenchong_219/article/details/25081379
5、windbg调试死锁,好迷茫,请教
https://bbs.csdn.net/topics/390740501?page=1
6、win10ltsc版基本信息及优点介绍
http://www.somode.com/softjc/9504.html
7、VC2005中fopen的ccs=UNICODE实测<zt> + UTF8 如何转变为 ansi
https://www.cnblogs.com/slash/archive/2010/06/27/1766225.html
8、多线程死锁调试小技巧
https://www.cnblogs.com/zhuyp1015/p/3618863.html
9、Detecting reflective DLL loading with Windows Defender ATP
https://www.microsoft.com/security/blog/2017/11/13/detecting-reflective-dll-loading-with-windows-defender-atp/
10、Application Control for Windows
https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/windows-defender-application-control
11、What's new in Windows 10 Enterprise 2019 LTSC
https://docs.microsoft.com/en-us/windows/whats-new/ltsc/whats-new-windows-10-2019
12、windbg调试std::mutex死锁问题!!!
https://blog.csdn.net/jiangdong2007/article/details/89513524

可以再研究下符号服务器的搭建,这样方便给客户调试问题;

5.结论
很多时候,用户使用程序出现问题了 或者 线上机器运行程序出现问题了,不方便在用户电脑上/线上机器调试问题,如果再在用户电脑/线上机器上安装VS,拉取源代码仓库,那就更难可行并且问题风险多多,操作复杂;

那么这时候可以让用户转储为DMP文件,并提供程序的版本号等信息,然后自己用Windbg或者VS调试分析问题,当然这样又会引发两个怎么让工作效率更高更可靠的问题,

1、用户使用程序崩溃了要手动联系开发方并手动生成DMP文件发发给开发方吗?

2、符号文件该怎么管理?用户告诉你了版本号,你还能找到符号文件吗?

当然这两个问题,大公司都有解决方案;
 


http://chatgpt.dhexx.cn/article/rUyoxi9U.shtml

相关文章

ZedGraph类库之基本教程---PieSampleDemo.cs(画饼)

ZedGraph类库之基本教程 PieSampleDemo.cs介绍 这节我把饼形图粗略的介绍一下&#xff0c;如下图。 PieSampleDemo.cs&#xff08;画饼&#xff09; using System; using System.Drawing; using System.Collections; using ZedGraph; namespace ZedGraph.Demo { ///<sum…

Winforn中设置ZedGraph曲线图的属性、坐标轴属性、刻度属性

场景 C#窗体应用中使用ZedGraph曲线插件绘制图表&#xff1a; https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99716066 在上面已经实现基本的曲线图之后&#xff0c;效果如下&#xff1a; 当然这不是我们的效果&#xff0c;还要对其属性进行设置。 但是毕竟其…

转载:ZedGraph使用帮助

译文&#xff1a; 序言 ZedGraph是用于创建任意数据的二维线型、条型、饼型图表的一个类库&#xff0c;也可以作为Windows窗体用户控件和ASP网页控件&#xff08;这里有个web-accessible 不知道该怎么翻译&#xff09;。这个类库具有高度的适应性&#xff0c;几乎所有式样的图…

ZedGraph如何去掉外边框?并设置背景颜色

ZedGraph的在显示曲线图的时候&#xff0c;有外边框一直在显示&#xff0c;会显得特别碍眼&#xff0c;如何去掉它呢&#xff1f; 这个是原始的现象 1 去掉外边框的做法如下&#xff1a; //去掉外边框this.zedGraph.GraphPane.Border.IsVisible false;2 设置一下背景颜色 //设…

用ZedGraph控件画统计分析图.

由于朋友需要把C1WebChart.替换掉,改用开源的ZedGraph控件.以下做一个示例,供大家参考: 步骤如下: 1、添加ZedGraph控件。如下图&#xff1a; 2、添加到控制面版。如下图&#xff1a; 3、制作用户控件。 a> 建立一个命名为&#xff1a; DrawGrap.ascx 用户控件。 b…

C# 利用ZedGraph控件画简单折线图示例

下载ZedGraph 官网下载地址 http://sourceforge.net/projects/zedgraph/files/ 添加 ZedGraph.dll 和ZedGraph.Web.dll的引用 在控件库中添加ZedGraph控件 右键点击工具箱 - 选择项 - .Net Framework 组件 - 浏览 - 找到ZedGraph.dll 和ZedGraph.Web.dll添加…

zed graph使用经验

转自&#xff1a;http://www.cnblogs.com/gaizai/archive/2010/02/22/1671154.html ZedGraph使用经验 开源的统计图控件中基本常用的是OpenFlashChar和ZedGraph&#xff0c;今天就先来讲讲ZedGraph的使用。 ZedGraph资源 ZedGraph来源&#xff1a;http://sourceforge.net/proj…

ZedGraph

ZedGraph使用经验 2010-02-22 14:28 by 听风吹雨, 8194 阅读, 3 评论, 收藏, 编辑 开源的统计图控件中基本常用的是OpenFlashChar和ZedGraph&#xff0c;今天就先来讲讲ZedGraph的使用。 ZedGraph资源 ZedGraph来源&#xff1a;http://sourceforge.net/project/showfiles.php…

zedGraph 绘制实时曲线 卡顿

zedGraph是一个开源的曲线绘制插件&#xff0c;由于要制作上位机显示实时数据&#xff0c;百度搜索到了zedgraph&#xff0c;优点是开源&#xff0c;功能也够使用。 缺点是看网址08年后就没有更新过。尝试使用了一下&#xff0c;感觉还可以。 曲线绘制直接看下图。 原理很简单…

ZedGraph 官网下载和帮助文档ZedGraph.chm

ZedGraph介绍 ZedGraph是用C#编写的.NET的类库控件&#xff0c;可用于绘制曲线图、饼图、柱状图、股票K线图等&#xff0c;功能非常强大。 1、ZedGraph的官网是&#xff1a; https://sourceforge.net/projects/zedgraph/ 2、ZedGraph.CHM帮助文档 官网的链接&#xff1a; htt…

graphviz简介

前几天去杨瑞那儿玩&#xff0c;他向我介绍了一个叫graphviz的工具&#xff0c;回来之后试用了一下&#xff0c;觉得真的是很好很强大。下面简单的介绍一下这个工具。 graphviz是贝尔实验室设计的一个开源的画图工具&#xff0c;它的强大主要体现在“所思即所得"&#xff…

zedgraph控件使用

最近做一个上位机的项目&#xff0c;要求实时显示温度曲线&#xff0c;开始用.net自带的 chart控做的&#xff0c;在动态显示那块&#xff0c;在删除一个数据点、加入一个新的数据点的时候&#xff0c;新的数据点显示不出来&#xff1b;纠结好久&#xff0c;解决不了这个问题。…

ZedGraph控件常用方法和属性总结

最近在WPF使用ZedGraph控件&#xff0c;发现这个控件的功能很强大&#xff0c;据说采用了双缓冲机制来绘制图&#xff0c;只要控制好显示的帧速&#xff0c;能够显示速度较快的动态图。 参考&#xff1a;https://blog.csdn.net/qq_26093511/article/details/51329059 1、常用…

ZedGraph设置刻度轴的颜色、刻度文本颜色以及网格线的颜色

1 刻度轴的设置 本小节介绍 如何设置刻度的颜色、长度、生长方向以及将正上方的刻度隐藏掉&#xff0c;还有设置刻度文本的颜色Scale.FontSpec.FontColor。 Color axisColor Color.FromArgb(150, 150, 150);#region X轴//设置主刻度的长度this.zedGraph.GraphPane.XAxis.Majo…

ZedGraph 总论

ZedGraph 总论 ZedGraph 是一个开源的.NET图表类库&#xff0c; 并且全部代码都是用C#开发的。它可以利用任意的数据集合创建2D的线性和柱形图表。 ZedGraph的类库具有很高的灵活性。几乎图表的每个层面都可以被用户修改。同时&#xff0c;为了保证类库的易用性&#xff0c;所…

ZedGraph做统计

下载ZedGraph.dll,在工具箱添加 &#xff0c;然后将空间拖入界面&#xff0c;&#xff0c; ZedGraph.dll下载地址 &#xff1a; http://download.csdn.net/detail/happy09li/4276410 参考资料 点击打开链接 private void Form9_Load(object sender, EventArgs e){DataTable …

ZedGraph使用(一) 柱形图

ZedGraph使用&#xff08;一&#xff09; 柱形图 作者&#xff1a;Kevin 日期&#xff1a; 2008-12-04 QQ:475762235 关键字&#xff1a;ZedGraph、柱形图、统计图、C#、绘图、绘图控件、WebFrom 内容摘要&#xff1a; ZedGraph是一个开源的控件&#xff0c;提供了用户控件和…

ZedGraph绘图

一、下载及配置 下载ZedGraph 官网下载地址 http://sourceforge.net/projects/zedgraph/files/ 添加 ZedGraph.dll 和ZedGraph.Web.dll的引用 在控件库中添加ZedGraph控件 右键点击工具箱 - 选择项 - .Net Framework 组件 - 浏览 - 找到ZedGraph.dll 和ZedGraph.Web.d…

ZedGraph类库之基本教程篇

第一部分&#xff1a;基本教程篇 ZedGraphDemo中一共有9个基本教程的例子。其中大部分都类似&#xff0c;我会讲解其中一些比较典型的例子。把ZedGraph类库的使用逐步展现给大家。 第一节&#xff1a; InitialSampleDemo.cs这个文件 http://blog.csdn.net/tjvictor/archive/20…

ZedGraph使用经验

ZedGraph资源 ZedGraph来源&#xff1a;http://sourceforge.net/project/showfiles.php?group_id114675 ZedGraph 相关例子资源&#xff1a;http://zedgraph.org/wiki/index.php?titleSample_Graphs ZedGraph的特点&#xff1a; 第一&#xff0c;可以先生成图片后再显示&…