使用Windbg调试StackOverflowException异常

  最近公司服务器端程序遇到一个堆栈溢出问题,偏偏是偶发性但是又在相对固定时间发生的,有一个服务器比较容易触发,平均隔个5、6天就会发生一次,且每次都是在8点23分左右抛出异常。服务器开发同事初步定位是定时器出了问题,单纯看代码看不出问题,打的log也没看到有用的信息(其实这里是有点能力问题的,囧~看代码也看得不认真不细致。打的log没打到点上)。老大就把这个问题抛给我,让我去解决一下,提示用一些工具直接去测,比如Windbg,于是开始了Windbg之旅。

  上网搜索了下Windbg相关的博客,主要从以下两篇文章中受益颇多。

  文1 .NET应用程序调试—原理、工具、方法

  文2 WinDbg-如何抓取dump文件

  Windbg工具下载地址:http://www.microsoft.com/whdc/devtools/debugging/default.aspx

  看完文章后决定使用分析dmp文件的方式来解决这次的问题。

  首先是获取dump文件。虽然用Windows系统自带的任务管理器可以方便地dump文件,但是由于64位系统和32位进程(发生问题的后台程序)的问题,这种方式获得的dmp文件用Windbg分析不出东西,老是会报一些错,所以采用其他方式,比较靠谱的有两种,从上面文章中分别有提到。

  一是文1提到的使用Windows调试工具箱中的ntsd工具,步骤为:1、cmd运行命令“Windows调试工具箱安装目录\x86\tlist”查看所有进程的PID,找到crash进程的id。2、cmd运行命令“Windows调试工具箱安装目录\x86\ntsd -pv -p 进程PID”。3、ntsd界面中运行命令“.dump/mf dmp文件路径”即生成dmp文件。

  二是文2提到的直接使用Windbg来dump文件,打开“Windows调试工具箱安装目录\x86\windbg.exe”,点击File->Attach to a Process->选择crash的进程->点击确定,进到抓取dump的界面,在命令行中输入“.dump -ma dmp文件路径”生成dmp文件。

  注意,这里的操作步骤都需要到发生crash的机器上且要在发生crash后没关闭进程之前去执行;另外这里使用的是x86下的工具箱,具体的选择可参照这篇文章 Windbg 32位版本和64位版本的选择

  拿到dmp文件后就可以用x86版本的Windbg工具打开了。这里简要写几个调试时用到的命令。使用方法文1文2都有提到。

  .sympath 路径

  .symfix+ 路径

  .reload

  .loadby sos clr

  !analyze -v

  !threads

  ~0s

  !clrstack

  这里设置符号路径时最好是程序所在目录,且带有pdb文件。使用!threads获取所有线程的时候,哪个线程发生了Exception会显示出来,使用~0s命令进入线程,使用!clrstack可以看到调用堆栈,从而可以看到问题所在了。

  大致是这样子,我看到了出现问题的代码,原来有个定时事件发生在每天的5.50分,在触发时因为代码问题,会有小概率没把这个下次时间(即明天5.50分)正确设置,导致今天的事件一直处于触发中,而每次定时器轮询是3秒间隔,到8.23分的时候刚好堆栈溢出。

  至此,问题解决。第一次写博客,不怎么会编辑,将就着看先。因为时间不够,内容也不详细,之后慢慢补充完整。

时间: 2024-07-30 13:43:44

使用Windbg调试StackOverflowException异常的相关文章

WinDbg 调试.net程序

WinDbg支持以下三种类型的命令: ·        常规命令,用来调试进程 ·        点命令,用来控制调试器 ·        扩展命令,可以添加叫WinDbg的自定义命令,一般由扩展dll提供这些命令 PDB文件 PDB文件是由链接器产生的程序数据库文件.私有PDB文件包含私有和公有符号,源代码行,类型,本地和全局变量信息.公有PDB文件不包含类型,本地变量和源代码行信息,且只包含共有成员的调试信息. Dump文件 利用Dump工具,你可以获得进程的快照信息.一个mini-dump

调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令

调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置 windbg命令分为标准命令.元命令.扩展命令 标准命令提供最基本的调试功能,不区分大小写.如:bp g dt dv k等 元命令提供标准命令没有提供的功能,也内建在调试引擎中,以.开头.如.sympath .reload等 扩展命令用于扩展某一方面的调试功能,实现在动态加载的扩展模块中

Windbg调试命令详解

发表于2013 年 8 月 23 日由张佩 转载注明>> [作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd.exe.kd.exe和Windbg.exe.其中cdb.exe和ntsd.exe只能调试用户程序,Kd.exe主要用于内核调试,有时候也用于用户态调试,上述三者的一个共同特点是,都只有控制台界面,以命令行形式工作. Windbg.exe在

Windbg调试(关于句柄表的获取,32位)

今天利用Windbg(x86)进行了获得句柄表的调试,从中获益良多,对调试步骤和按键又一次进行了熟悉,对于句柄表页的概念更是得到了进一步的清晰认识.windbg调试和句柄表不熟悉的朋友可以借鉴我的调试步骤l来熟悉句柄表基础知识, 调试步骤和获取部分如下. 3: kd> dt _EProcess 891ad030 nt!_EPROCESS +0x0f4 ObjectTable : 0x9eca0ef0 _HANDLE_TABLE3: kd> dt _HANDLE_TABLE 0x9eca0ef0

用WinDbg调试Windows和驱动程序

由于本人能力有限,翻译不足之处敬请谅解,欢迎批评指正:[email protected] MSDN原文:https://msdn.microsoft.com/zh-cn/library/windows/hardware/hh406283(v=vs.85).aspx 这个章节描述如何用WinDbg调试器执行基本的调试任务. 详细信息都在下面文章里: Debugging a User-Mode Process Using WinDbg Debugging a UWP app using WinDbg

Visual studio 调试连接数据库异常解决方法

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接) 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Data.SqlClient.SqlException: 在

WinDbg调试CPU占用高的问题 试验+实战 《第七篇》

一.High CPU试验 1.示例代码 static void Main(string[] args) { Console.Clear(); Console.WriteLine("到命令行下,切换到windbg目录,执行adplus -hang -pn highcpu.exe -o c:\\dumps"); Console.WriteLine("如果要停止,按Ctrl+C结束程序"); Console.WriteLine("================

使用WinDbg调试SQL Server查询

上一篇文章我给你介绍了WinDbg的入门,还有你如何能附加到SQL Server.今天的文章,我们继续往前一步,我会向你展示使用WinDbg调试SQL Server查询需要的步骤.听起来很有意思?我们开始吧! 假设在你面前有个简单的查询,你想在WinDbg里调试那个特定的查询.听起来很简单,但一旦你开始考虑这个问题,就会碰到很多问题: 在我特定执行的查询上,我如何标识出正确的工作者线程? 在sqlservr.exe里,我应该在哪里设置断点? 我们来具体讲解下这2个问题. 标识出正确的工作者线程

【转】WinDbg调试器:启动程序时自动连接调试器方法

当我们调试服务进程或子进程时,无法直接用调试加载进程的方式启动,此时需要在启动程序时自动连接调试器方法: 第一步:注册表展开到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options路径下: 第二步:在Image File Execution Options上鼠标右键,新建"项",项名为你要调试的程序,比如 test.exe: 第三步:在项名上,右键,新建字符