程序异常崩溃后用windbg辅助调试解决的经验 以及 堆栈问题调试经验
1,程序异常崩溃后用windbg辅助调试解决的经验
状况:我的程序调用别人的库做 文件写入工作。
在这一过程中出现异常,程序崩溃。
经反复检查,认为自己的程序没有错,但无法判断在别人库里哪里有错。
使用windbg绑定程序进程进行调试,可以在发生异常时候,获取函数调用顺序,进而知道在哪个函数出了异常。

由截图可见,在我的程序函数CEncryptionUtils::write_user_certs调用别人的MWHwMan库的SDFP_Close函数中调用另一个人的sdfp_lib库中的SD_SafeWrite函数过程中调用TGWriteDevInfo函数时发生了 堆异常…………………………
所以我找到sdfp_lib库作者,刚好是我同事,找他确认这个函数……然后解决问题……………………
上文说的只是调试这种问题的一种思路
可以说,如果没有windbg我是永远不可能解决这个问题的
至于windbg的具体用法就不赘述
或有时间时候再赘述
后续补充两点:1,将编译生成的pbd放在目录,用windbg调试可以提供更多信息,可以具体提供崩溃代码行数
2,崩溃时可以打开任务管理器,选择进程,导出dump文件,再分析dump文件亦可,只是这种方法没有试过
2,堆栈问题调试经验
编程时特别痛苦的就是遇到程序异常闪退问题,特别是那种偶然发生难以复现的bug、特别是那类debug版本没事、release版本就会崩溃的情况、甚至还有64位操作系统下没问题32位操作系统下就有问题的情况…………
即使可以使用windbg一类软件来查看堆栈,也未必有用。
因为程序崩溃的那一行,未必是堆栈造成损坏的那一行。
因为程序总是在堆栈损坏情况下,再次使用堆栈才会发生崩溃。
例如下面这个困扰我半个月的bug:

上述是一个别人写的底层库的函数
结果竟然有错
这里malloc长度不应该是length*2,而应该是malloc(length*2+1)

否则这里的'\0'必然会写在越界的位置上!!
这个问题之前在win7 64位上跑一直没发现,在32位下才显现。
真可怕。
至于难以确认程序出错的具体位置。
这类问题该如何定位呢?
方法就是排除法,将怀疑有问题的代码一处处注释掉。
如果注释了就不会崩溃就说明 堆栈破损问题没有出在这里。
例如我最后发现,只要不调用上述截图那个dll库函数就不会崩溃,渐渐定位到这个函数里,再具体分析有没有内存越界问题。
上述这些都是公司里的大神教的,
感谢!
3,如果是在没装vs的环境下使用windbg调试,可以将编译的pdb文件放过去
这样不同的是,windbg显示堆栈信息时候会同时显示代码行数
程序异常崩溃后用windbg辅助调试解决的经验 以及 堆栈问题调试经验的更多相关文章
- ArcGIS for Android 10.1.1API 中文标注导致程序异常崩溃问题
1.前言 问题:在部分Android机型中使用ArcGIS for Android 10.1.1 API 中文标注导致程序异常崩溃. 说明:手里有两台机器一台是Nexus4,原生系统,版本4.4.4, ...
- Android 对程序异常崩溃的捕捉
转载博客:http://blog.csdn.net/i_lovefish/article/details/17719081 以下为异常捕捉处理代码: import java.io.BufferedRe ...
- C# 程序异常停止后,sqlite可能变成0kb……
解决办法就是即时备份数据库文件,启动时判断数据库文件是否为0kb,是则还原之
- window窗体程序意外崩溃,EventType clr20r3错误的解决方法
EventType clr20r3, P1 ggreadcard.exe, P2 1.0.0.0, P3 51d3d283, P4 zljy.common, P5 1.0.0.0, P6 4fc6c2 ...
- android程序崩溃后重启
有时候由于测试不充分或者程序潜在的问题而导致程序异常崩溃,这个是令人无法接受的,在android中怎样捕获程序的异常崩溃,然后进行一些必要的处理或重新启动 应用这个问题困恼了我很久,今天终于解决了该问 ...
- 调试技巧 —— 如何利用windbg + dump + map分析程序异常
调试技巧 —— 如何利用windbg + dump + map分析程序异常 逗比汪星人2011-09-04上传 调试技巧 —— 如何利用windbg + dump + map分析程序异常 http ...
- [转]使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试
本文关键字:Minidumps, Windows, SEH, VisualC, .NET 摘要 本文讲述了 minidumps 是怎样工作的.当你的程序崩溃的时候应该如何生成它们.以及如何在 Visu ...
- WinDBg定位asp.net mvc项目异常崩溃源码位置
项目介绍:asp.net mvc + angular +iis(windows)+windows server 系统莫名崩溃 最近有个系统默认奇妙崩溃50x,服务整体变成无响应,当运维告知我只有重启应 ...
- Windows 程序 dump 崩溃调试
Windows 程序捕获崩溃异常 生成dump 概述 事情的起因是,有个同事开发的程序,交付的版本程序,会偶尔随机崩溃了. 悲催的是没有输出log,也没有输出dump文件. 我建议他给程序代码加个异常 ...
随机推荐
- 【codeforces 755C】PolandBall and Forest
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 数据预处理(normalize、scale)
matlab 工具函数(三)-- normalize(归一化数据) 注:待处理的数据 X∈Rd×N,N 表示样本的个数,d 则是单个样本的维度: 1. 去均值(remove DC) X = bsxfu ...
- 【hdu 3032】Nim or not Nim?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- [Angular] Difference between ViewChild and ContentChild
*The children element which are located inside of its template of a component are called *view child ...
- 常见排序算法(java实现)
常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for ( ...
- 【hdu 2376】Average distance
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=2376 [题意] 让你计算树上任意两点之间的距离的和. [题解] 算出每条边的两端有多少个节点设为n ...
- CentOS 配置远程主机ssh免密登录
ssh针对的是用户不是机器,同一机器不同用户需要单独配置ssh,才能实现该用户的免密登录 cd ~ cd ./.ssh 在./ssh目录下生成公钥与私钥(如果没有.ssh先使用ssh命令连接到一台远程 ...
- AndroidStudio一步步教你修改项目包名(最详细,最易懂)
如果你看了很多篇博文还是修改不了包名,我相信这篇可以帮你解决修改包名的问题 修改项目包名,实现不覆盖安装(如果只是想不覆盖安装,更改build.gradle里面的包名就OK了,那这篇博文到这里就可以结 ...
- 集装箱set相关算法
set_union 算法set_union可构造S1.S2的并集.此集合内含S1或S2内的每个元素. S1.S2及其并集都是以排序区间表示.返回值是一个迭代器.指向输出区间的尾端. 因为S1和S ...
- 给定正整数n,计算出n个元素的集合{1,2,....,n}能够划分为多少个不同的非空集合
给定正整数n,计算出n个元素的集合{1,2,....,n}能够划分为多少个不同的非空集合 附源码: #include<iostream> using namespace std; int ...