WinDBG相关
1.为什么需要dump 内存
系统经常出现各种各样的问题,这些问题,可能是本身程序设计的时候考虑的不够周全,导致的程序异常,或者系统本身的问题。那么,当系统crash或者发生exception的时候,如何获得系统的context,然后给出准确地diagnostics,然后提出resolution呢?
我们所说的crash或者exception包括各种各样的情况,比如系统某个进程占用大量资源,某个进程low performance,某个程序crash等等。为了获得发生crash或者exception的process的context, 我们必须得到发生exception的时候,该process的context。那么可以给该process进行捕捉一个snapshot。捕捉发生exception时刻的snapshot所用的方法就是dump当时该process的内存。
2.dump内存的方法
这里介绍一种dump内存的方法,就是windbg中的.dump。当程序发生异常时,我们可以通过该方法snapshot该process在发生exception的时候的context。
具体做法就是:
当program发生exception的时候,或者发生之前,我们可以将windbg attach to a specific process in which en exception will occur. 然后在windbg command window中,type g or press F5 to let the program execute.如果不出意外的话,会出现exception,然后我们我们可以用.dump command来capture the snapshot。the following section is the usage about command .dump.
windows minidump 的那些事
在开发中最让程序员头痛的是程序异常对出。还没有留下任何蛛丝马迹。在linux系统上不用担心这个问题,linux内核可以完成这个工作,通过ulimit -c unlimited。windows也可以同windbg或dr.Watson绑定运行,当出现异常时会挂住进程。这样做是很多程序不允许的。这就需要进程在异常退出是自己产生dump了:MiniDumpWriteDump。有很多帖子都已经讲了了理论。我这里记录核心代码和测试代码。
相关博客:http://www.cnblogs.com/FCoding/archive/2012/07/04/2576890.html
github:https://github.com/hanbo79/CrashProcMinidumpDll.git
捕获异常的注册点:
//大部分异常:*p(null) = 1;除0错误
if(SetUnhandledExceptionFilter(CrashCallBack) == NULL)
{
cout << "there is no current top-level exception handler" << endl;
}
/*解决无效参数*/
//char* formatString;
//formatString = NULL;
//printf(formatString);
_set_invalid_parameter_handler(myInvalidParameterHandler1);
// Disable the message box for assertions.
_CrtSetReportMode(_CRT_ASSERT, 0);
//捕获信号:abort()等
typedef void (*SignalHandlerPointer)(int);
SignalHandlerPointer previousHandler;
signal(SIGABRT, SignalHandler);
signal(SIGSEGV, SignalHandler);
//捕获虚函数异常:调用没有实现的虚函数
_set_purecall_handler(myPurecallHandler);
在CrashCallBack回调中真正保存dump,
其他的回调中 直接抛出异常:throw 1; 会触发CrashCallBack处理
在实际运行中经常出现0dump的情况。测试通过new大量内存泄漏,在minidump写dump时返回的错误:2147942408(存储空间不足,无法处理次命令)
尝试使用其他进程捕获崩溃进程的信息(资源管理器可以捕获指定进程的dump),可以启动一个新的进程捕获异常进程的栈信息
---------------------
https://www.cnblogs.com/zhishuai/articles/8593154.html
https://www.cnblogs.com/awpatp/archive/2010/03/07/1680147.html
https://blog.csdn.net/avder/article/details/2005837
WinDBG相关的更多相关文章
- windows驱动开发前导知识
从以下整理得到 https://blog.csdn.net/suxinpingtao51/article/details/8610528 http://www.cnblogs.com/bugcheck ...
- Windows代码heap内存分析实战
知识这东西有时候很奇怪,每次当你重新审视他的时候可能都会有新的收获.最近为了研究一个内存相关的问题,把windows heap相关的内容又复习了一遍,收获不小,记录一下,希望有朋友使用的时候少走些弯路 ...
- 嵌入式单片机STM32应用技术(课本)
目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...
- windbg sos加载相关
使用windbg 加载sos.dll时,经常碰到报The call to LoadLibrary(C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.d ...
- windbg调试相关命令
windbg 查找函数:x exe!main* 条件断点打印字符:bp 7199a2b0 ".printf \"message:%ma\", poi(@esp+8);.e ...
- WinDbg常用命令系列---异常相关操作
.exr (Display Exception Record) .exr命令显示异常记录的内容. .exr Address .exr -1 参数: Address指定异常记录的地址.如果指定-1作为地 ...
- WinDbg常用命令系列---源代码操作相关命令
lsf, lsf- (Load or Unload Source File) lsf和lsf-命令加载或卸载源文件. lsf Filename lsf- Filename 参数: Filename指定 ...
- WinDbg常用命令系列---符号相关命令
ld (Load Symbols) ld命令加载指定模块的符号并更新所有模块信息. ld ModuleName [/f FileName] 参数: ModuleName指定要加载其符号的模块的名称.m ...
- WinDbg常用命令系列---日志操作相关命令log*
.logopen (Open Log File) .logopen命令将事件和命令的副本从调试器命令窗口发送到新的日志文件. .logopen [Options] [FileName] .logope ...
随机推荐
- Word Embedding/RNN/LSTM
Word Embedding Word Embedding是一种词的向量表示,比如,对于这样的"A B A C B F G"的一个序列,也许我们最后能得到:A对应的向量为[0.1 ...
- Altium designer软件如何设计原理图库封装图库以及交互式布局
欢迎大家关注http://www.raymontec.com(个人专博) Altium Designer学习—认识界面以及PCB设计整体要求 http://www.raymontec.com/alti ...
- Android中的AlarmManager的使用
AlarmManager是Android中的一种系统级别的提醒服务,它会为我们在特定的时刻广播一个指定的Intent.而使用Intent的时候,我们还需要它执行一个动作,如startActivity, ...
- [原创]Fashion汽车定位器拆解
随着共享单车的爆发增长,定位方案被彻底激活.当下主流的共享单车都采用了MTK2503的方案(后续再详细分解),本文针对某商城热卖的汽车定位器进行拆解分析. 第一部分,定位器外观. 第二部分,拆解开壳, ...
- spring 测试类test测试方法
实例掩码地址为:孔浩组织结构设计 web.xml配置文件: <!-- Spring 的监听器可以通过这个上下文参数来获取beans.xml的位置 --> <context-param ...
- python利用opencv合成模糊图像
之前需要评估图像质量来筛选成像质量不错的图片,去除由于对焦,运动等造成的模糊图像,所以在构建数据集的时候考虑用opencv对清晰的图片进行处理获得模糊的图片从而进行训练. 1) 运动模糊图像 一般来说 ...
- js中的运算符优先级
运算符有何很多,基本的可能都比较熟,单有些优先级很难记住.建议使用“()”将复杂的运算表达式区分好优先级. 我给运算符优先级做了一首小打油诗. 括号成员new函数 直new后置累计数 单目幂算乘除模 ...
- python生成组织架构图(网络拓扑图、graph.editor拓扑图编辑器)
Graph.Editor是一款基于HTML5技术的拓补图编辑器,采用jquery插件的形式,是Qunee图形组件的扩展项目,旨在提供可供扩展的拓扑图编辑工具, 拓扑图展示.编辑.导出.保存等功能,此外 ...
- Q - Girls and Boys
来源poj1068 In the second year of the university somebody started a study on the romantic relations be ...
- js中 给json对象添加属性和json数组添加元素
js中 给json对象添加新的属性 比如现在有一个json对象为jsonObj,需要给这个对象添加新的属性newParam,同时给newParam赋值为pre.做法如下: var obj={ &quo ...