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辅助调试解决的经验 以及 堆栈问题调试经验的更多相关文章

  1. ArcGIS for Android 10.1.1API 中文标注导致程序异常崩溃问题

    1.前言 问题:在部分Android机型中使用ArcGIS for Android 10.1.1 API 中文标注导致程序异常崩溃. 说明:手里有两台机器一台是Nexus4,原生系统,版本4.4.4, ...

  2. Android 对程序异常崩溃的捕捉

    转载博客:http://blog.csdn.net/i_lovefish/article/details/17719081 以下为异常捕捉处理代码: import java.io.BufferedRe ...

  3. C# 程序异常停止后,sqlite可能变成0kb……

    解决办法就是即时备份数据库文件,启动时判断数据库文件是否为0kb,是则还原之

  4. 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 ...

  5. android程序崩溃后重启

    有时候由于测试不充分或者程序潜在的问题而导致程序异常崩溃,这个是令人无法接受的,在android中怎样捕获程序的异常崩溃,然后进行一些必要的处理或重新启动 应用这个问题困恼了我很久,今天终于解决了该问 ...

  6. 调试技巧 —— 如何利用windbg + dump + map分析程序异常

    调试技巧 —— 如何利用windbg + dump + map分析程序异常 逗比汪星人2011-09-04上传   调试技巧 —— 如何利用windbg + dump + map分析程序异常 http ...

  7. [转]使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试

    本文关键字:Minidumps, Windows, SEH, VisualC, .NET 摘要 本文讲述了 minidumps 是怎样工作的.当你的程序崩溃的时候应该如何生成它们.以及如何在 Visu ...

  8. WinDBg定位asp.net mvc项目异常崩溃源码位置

    项目介绍:asp.net mvc + angular +iis(windows)+windows server 系统莫名崩溃 最近有个系统默认奇妙崩溃50x,服务整体变成无响应,当运维告知我只有重启应 ...

  9. Windows 程序 dump 崩溃调试

    Windows 程序捕获崩溃异常 生成dump 概述 事情的起因是,有个同事开发的程序,交付的版本程序,会偶尔随机崩溃了. 悲催的是没有输出log,也没有输出dump文件. 我建议他给程序代码加个异常 ...

随机推荐

  1. 课堂随笔02--c#中string作为引用类型的特殊性

    using System; namespace Test { class Test1 { static void Main(string[] args) { string str1 = "1 ...

  2. NOIP模拟 Date - Tarjan

    题目描述 小Y和小Z好不容易有机会相见啦,可是邪恶的小H却不想让他们相见.现在有一些城市,城市之间有双向路径相连,有路径相连的城市之间可以互相到达.小H可以任意选择一条路径,然后用他的邪恶力量污染这条 ...

  3. 【序列操作III】线段树

    题目描述 给出序列 a1,a2,…an(0≤ai≤109),有关序列的四种操作: 1. al,al+1,…,ar(1≤l≤r≤n)加上 x(-103≤x≤103) 2. al,al+1,…,ar(1≤ ...

  4. METHODS OF AND APPARATUS FOR USING TEXTURES IN GRAPHICS PROCESSING SYSTEMS

    BACKGROUND The technology described herein relates to methods of and apparatus for using and handlin ...

  5. mysql-实现行号

    目前mysql不支持像oracle一样rownum,在网上也查找了好多,各种写法,自己进行了总结,实现方法如下 新建表: userid salay zhangsan 10000 lisi 12000 ...

  6. Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/data/vm10-0-0-19

    输入:service mysqld start 报错: Starting MySQL.. ERROR! The server quit without updating PID file (/usr/ ...

  7. 【29.82%】【codeforces 703D】Mishka and Interesting sum

    [题解] 题意: 给n个数字组成有序数列; 给m个询问. 对于每个询问区间.输出这个区间里面出现次数为偶数次的所有数的异或值; 做法: 我们可以先求出这段区间里面所有(包括重复的数字)数字的异或值p1 ...

  8. Android音频输入通道的底层硬件和软件开发分析

    Android潜在的发展音频输入通道的软硬件分析 我们都知道耳机Mic集成在一直的那种四段耳机Mic插头是Android设备上比較经常使用.可是也会有分开的情况,比較假设在普通的PC机中装Androi ...

  9. OpenGL中GLSL渲染茶壶光照完整程序

    顶点着色器VertexShader.txt: uniform vec3 lightposition;//光源位置 uniform vec3 eyeposition;//相机位置 uniform vec ...

  10. C#实现万年历(农历、节气、节日、星座、星宿、属相、生肖、闰年月、时辰)

    C# 万年历 农历 节气 节日 星座 星宿 属相 生肖 闰年月 时辰地址:http://www.cnblogs.com/txw1958/archive/2013/01/27/csharp-calend ...