最近公司服务器端程序遇到一个堆栈溢出问题,偏偏是偶发性但是又在相对固定时间发生的,有一个服务器比较容易触发,平均隔个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分的时候刚好堆栈溢出。

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

转载于:https://www.cnblogs.com/qiups/p/5654544.html

使用Windbg调试StackOverflowException异常相关推荐

  1. 怪异的StackOverflowException异常

    前两天,在做一个小软件时碰到一个怪异的StackOverflowException异常,试了几次后还是百思不得其解. 当时我想做的功能很简单:我想在程序开始启动时和在窗口被最小化后,自动隐藏掉窗口. ...

  2. Windbg调试命令详解

    Windbg调试命令详解 发表于2013 年 8 月 23 日 转载注明>> [作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Win ...

  3. WinDBG调试dNet程序总结

    WinDBG工具简介 http://www.cnblogs.com/mashuping/archive/2009/03/28/1424168.html 对于一般的程序不需要使用WinDBG工具去调试, ...

  4. windbg调试堆破坏

    堆破坏 所谓的堆破坏,是说没控制好自己的指针,把不属于你分配的那块内存给写覆盖了.这块内存可能是你程序的数据,也可能是堆的管理结构.那么这个会导致怎样的后果呢?可能的情况我们来yy下 把程序里的计算结 ...

  5. windbg调试HEAP

    HEAP的概念 堆栈堆栈,在操作系统内存中有两种存储空间,一个是堆,一个是栈.堆主要用于存储用户动态分配的变量,而栈呢,则是存储我们程序过程中的临时变量.当然栈的作用远不止用作存储变量,但这不是我们这 ...

  6. Windbg调试学习

    一.为什么学习使用Windbg调试 Windbg是在windows平台下,强大的用户态和内核态调试工具.相比较于Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较 ...

  7. windbg调试驱动学习总结

    简单驱动编写与windbg调试 http://trustsec.blog.51cto.com/305338/64694/ 一.驱动编写 随着对windows系统的深入研究,越来越多的内核方面的知识被挖 ...

  8. windbg 调试崩溃

    前言 windbg 是非常强大的调试工具,但是在使用windbg 进修调试时候,很多的命令不知道如何使用.文章简单介绍如何使用windbg进行调试 https://docs.microsoft.com ...

  9. 博客摘录「 Windbg调试命令汇总」2023年4月15日

    目录 1.Windbg调试器介绍 2.Windbg版本说明 3.Windbg命令汇总 VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...) https://blog.csdn.net/c ...

最新文章

  1. Android Studio找不到org.apache.http中的类
  2. 多选框位置调整_URPC 2019 水下目标检测竞赛冠军方案:多图像融合增强
  3. C#easyui combotree 设置节点折叠
  4. python自动控制库_python PyAUtoGUI库实现自动化控制鼠标键盘
  5. 【报告分享】2020年中国AI产业地图研究报告.pdf(附下载链接)
  6. hibernate4平台搭建
  7. java分页插件_IT系统分页
  8. 第16期-推荐几个很赞的github开源项目
  9. win10出现“以太网没有有效的ip配置”的问题
  10. Fuzzy set基本介绍(1)
  11. java 拼图游戏_Java 拼图游戏
  12. mac搭建IPV6网络环境
  13. 分椰子c语言csdn,水手分椰子——迭代法、递归解题
  14. 微信商城开源版二次开发(二)
  15. 在SSD268G上运行第一个demo
  16. 《炬丰科技-半导体工艺》 碳化硅大功率高频电子器件上的薄氮化镓
  17. 深度学习论文: LRNnet: a light-weighted network for real-time semantic segmentation及其PyTorch实现
  18. mysqlclient Windows 下安装报错解决方法
  19. 网付和收钱吧哪个好?深度对比2个对象之间的差异!
  20. C语言处理excel

热门文章

  1. 非模态的titlewindow,点击外部时的事件
  2. java例程练习(批量修改文件后缀名)
  3. 西南石油大学计算机科学院信息,梁宗文 - 西南石油大学 - 计算机科学学院
  4. 数据结构C语言实现课后习题答案第6-9章
  5. JSP关于Frameset的简单用法
  6. Windows环境下32位汇编程序设计C版code--第五章(二)
  7. 【Vue】24.遮罩层阻止默认滚动事件
  8. 利用?和 ??简化界面的默认配置/自定义配置
  9. 浏览器打开html文件显示中文乱码解决方法
  10. JavaScript 技术篇-chrome利用ClipboardEvent写入剪切板,chrome写入剪切板不成功解决方法