异常调试
文章平均质量分 89
调试与异常的研究
H-KING
学海无涯
展开
-
MAP文件和调试(VC)(从崩溃地址找出错源码位置)
也是:一直听说,从未动手。所以,用VC生成一下MAP文件,帮助调试。一.步骤:Project Settings->C/C++-> Project Options:这里输入 /Zd,将在编译时生成行信息。Project Settings->Link->Project Options:/mapinfo:lines/map:MapFileName.ma转载 2015-02-02 09:58:29 · 678 阅读 · 0 评论 -
WinDbg学习笔记(二)--字符串访问断点
标 题: 【原创】WinDbg学习笔记(二)--字符串访问断点作 者: gaorqing时 间: 2009-07-25,21:39:04链 接: http://bbs.pediy.com/showthread.php?t=94326WinDbg学习笔记(二)--字符串访问断点一、前言 本文是我自己学习WinDbg的过程,因为目标是逆向分析一个驱动文件,但现在对驱动转载 2015-05-27 15:25:05 · 607 阅读 · 0 评论 -
基于WinDbg的内存泄漏分析
在前面C++中基于Crt的内存泄漏检测一文中提到的方法已经可以解决我们的大部分内存泄露问题了,但是该方法是有前提的,那就是一定要有源代码,而且还只能是Debug版本调试模式下。实际上很多时候我们的程序会用到第三方没有源代码的模块,有些情况下我们甚至怀疑系统模块有内存泄露,但是有没有证据,我们该怎么办? 这时我们就要依靠无所不能的WinDbg了。WinDbg的!heap命令非常强大,结合转载 2015-05-22 13:54:08 · 532 阅读 · 0 评论 -
windbg调试堆破坏
堆破坏所谓的堆破坏,是说没控制好自己的指针,把不属于你分配的那块内存给写覆盖了。这块内存可能是你程序的数据,也可能是堆的管理结构。那么这个会导致怎样的后果呢?可能的情况我们来yy下把程序里的计算结果覆盖了,这也许会让你重复看了N次代码,校验了N次计算逻辑也搞不明白为何计算结果还是有问题堆管理结构被破坏了,new/delete,或者malloc/free操作失败等等等等~堆破坏较转载 2015-05-22 10:40:36 · 2987 阅读 · 0 评论 -
Windbg教程-调试非托管程序的基本命令上
Windbg是跟visual studio差不多的一个调试器,可以用来调试非托管程序(native application),也可以调试托管程序(managed application)。它比VS强的地方是你可以使用它来调试Windows操作系统,因此它也被叫做kernel mode debugger,同样为kernel mode debugger的调试器还有随着windbg一起安装的kd.e转载 2016-06-29 10:52:21 · 885 阅读 · 0 评论 -
Windbg教程-调试非托管程序的基本命令中
前面的文章调试非托管程序的基本命令上讲到如何在windbg里面启动一个程序并且加载调试符号文件。一旦符号文件加载完毕以后,就可以进行调试了,例如设置断点,查看堆栈信息等等。 因为是刚刚启动程序(main函数还没有机会执行),可以查看源代码了解要设置断点的地方。设置断点可以使用bp、bu和bm来做,其中bp可以根据函数名、指令地址以及源代码文件地址来设置断点。 bp命转载 2016-06-29 10:52:59 · 670 阅读 · 0 评论 -
Windbg 教程-调试非托管程序的基本命令下
前面的文章调试非托管程序的基本命令中讲到如何使用windbg在程序中设置断点,既然断点已经设置好了,下一步就是直接执行程序,程序中断以后,第一件事情就是查看堆栈。在windbg中查看堆栈使用k命令就可以,在最新的windbg中(记不得从哪个版本开始了),如果你加载了sos.dll,k命令也可以显示托管程序部分的堆栈信息。下面是程序在_ttol函数入口处中断时的堆栈输出:0:转载 2016-06-29 10:53:42 · 582 阅读 · 0 评论 -
使用PowerDbg自动化Windbg调试过程
PowerDbg是一个PowerShell脚本,使用这个脚本可以连接到windbg上面,远程控制windbg,可以通过编程的方式分析windbg输出;加之PowerDbg强大的编程能力,方便我们编写一些强大的调试脚本。使用方法比较简单,从http://www.codeplex.com/ 下载powerdbg,这是一个开源的程序—实际上下载下来的就是一个可以执行PowerShell脚本。Po转载 2016-06-29 10:55:39 · 643 阅读 · 0 评论 -
在VC中如何找到崩溃的源头(二)
通过“crash地址 + MAP文件”来定位出错代码位置虽然需要经过比较复杂的地址计算,但却是最简单实现的方式。如果仅仅想通过崩溃地址定位出错的函数,就更加方便了。我在网上找到一个解析MAP文件的小工具,可以非常清晰的列出每个函数的地址,并且可以将分析表格导出为Excel文件。工具下载地址:http://e.ys168.com/?tinyfun,工具目录下VCMapper.exe。 另外转载 2016-05-16 15:07:50 · 444 阅读 · 0 评论 -
在VC中如何找到崩溃的源头
我把这个试验的源代码列出来:const int x =10000;int main(int argc, char* argv[]){ int *y=0; y=(int*)&x; *y=10; return 0;} 我们用Microsoft Visual C++ 6.0(SP5)编译出一个Debug版本的E转载 2016-05-16 15:07:12 · 436 阅读 · 0 评论 -
windows终止处理程序( __try __finally) 简单解析
本文大部分来自《windows核心编程》。例1//二话不说,直接上代码int Funcenstein2(){ __try { return 3; } __finally { //在函数返回之前会处理__finally里的内容 cout"finally executed"endl; }转载 2015-12-30 13:32:21 · 684 阅读 · 0 评论 -
检查程序崩溃自动DUMP
#if !defined(_DUMPMODULE_H_FBFFBA7D_971E_48e0_A589_6FD14E8965B6)#define _DUMPMODULE_H_FBFFBA7D_971E_48e0_A589_6FD14E8965B6#if _MSC_VER >= 1000#pragma once#endif // _MSC_VER >= 1000#include #in转载 2015-08-17 00:28:03 · 596 阅读 · 0 评论 -
C++中基于Crt的内存泄漏检测
尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询。#ifdef _DEBUG#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)#else#define DEBUG_CLIENTBLOCK#endif#define _CRTDBG_MAP_ALLOC#include转载 2015-05-22 13:32:15 · 555 阅读 · 0 评论 -
c++异常Try catch
c++异常Try catch分类: c++专区 功能函数测试集锦2014-04-09 17:43 1505人阅读 评论(0) 收藏 举报一、简单的例子首先通过一个简单的例子来熟悉C++ 的 try/catch/throw:1 #include //包含头文件2 #include3转载 2015-03-20 12:50:58 · 616 阅读 · 0 评论 -
Windows系统程序设计之结构化异常处理
网上搜了好久,没有发现有人做过,codeproject上面有获取崩溃后的信息的,参考一下发现一个函数,LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);只要设置好后,在其函数中 return EXCEPTIO转载 2015-02-26 18:38:21 · 553 阅读 · 0 评论 -
__try,__except,__finally,__leave异常模型机
导读: 从本篇文章开始,将全面阐述__try,__except,__finally,__leave异常模型机制,它也即是Windows系列操作系统平台上提供的SEH模型。主人公阿愚将在这里与大家分享SEH( 结构化异常处理)的学习过程和经验总结。 深入理解请参阅<>第23, 24章.SEH实际包含两个主要功能:结束处理(termination handling)和异常处理(exception ha转载 2014-11-29 16:22:34 · 758 阅读 · 0 评论 -
窥探try ... catch与__try ... __except的区别
VC中的这两个东西肯定谁都用过, 不过它们之间有什么区别, 正好有时间研究了一下, 如果有错误欢迎拍砖.基于VC2005, 32位XP 平台测试通过. 估计对于其他版本的VC和操作系统是不通用的.1. try ... catch这个是C++语言定义的, 每个C++都有对其的不同的实现. 使用也很简单. 比如我们有一个函数, 读入年龄. 如果=100, 抛出异常:int转载 2015-12-30 13:28:14 · 3434 阅读 · 0 评论 -
使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试
本文关键字:Minidumps, Windows, SEH, VisualC, .NET摘要本文讲述了 minidumps 是怎样工作的、当你的程序崩溃的时候应该如何生成它们、以及如何在 Visual Studio .NET 中将它们重新读入。原文作者:Andy Pennell中文翻译:Victor原文链接:http://www.co转载 2015-05-26 13:56:07 · 747 阅读 · 0 评论 -
CrashFinder,找到崩溃代码行
1、CrashFinder需要PDB才可以工作;2、对于Release版本程序,需要设置产生program database 和generate debuginfo,才可以使用crash finder找到崩溃代码行,Debug版本是默认产生的;3、Generate Debug Info的程序会比Don't Generate Debug Info的大20%左右,如下Gen转载 2015-05-26 13:23:03 · 975 阅读 · 0 评论 -
使用MAP文件快速定位程序崩溃代码行
作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统 造成巨大的损失。但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事。其实测试中出现程序崩溃并不可怕,反而是测试的成功。我们更为关 心的是程序中的哪一行导致了系统崩溃,这样我们才能有针对性的进行改正。 在VC中,我们可以利用出现程序崩溃时VC的自动跳转,定位到出错代码行。但在大转载 2015-02-02 10:09:51 · 543 阅读 · 0 评论 -
程序崩溃的定位
1.程序要有PDB文件和MAP文件,两者都是符号集,PDB是共调试用的,MAP文件是可读信息符号集(记事本就可以打开)2.程序崩溃时要及时产生相应的dump文件,这个是程序运行的信息,堆栈、寄存器、出错代码等信息3.PDB文件、MAP文件、dump文件、exe文件最好在同目录4.调试dump文件可以用windbg或者VS。使用windbg时输入命令!analyze -v 查看程序运行信原创 2015-02-02 17:25:42 · 1946 阅读 · 0 评论 -
windbg分析dump文件
2010-07-17 09:46:19| 分类:驱动编程 |举报|字号 订阅windbg是windows下一个分析调试的工具,功能非常强大。这里主要记录利用windbg来分析windows蓝屏时所产生的内存转储文件*.dmp。1,下载:http://www.microsoft.com/whdc/devtools/debugging/default.转载 2014-12-30 18:45:11 · 613 阅读 · 0 评论 -
WinDbg学习笔记(二)--字符串访问断点
一、前言 本文是我自己学习WinDbg的过程,因为目标是逆向分析一个驱动文件,但现在对驱动开发的知识还不是很熟悉,所以先在用户级练习一下破解,熟悉一下操作。我选择的破解程序是《OllyDBG 入门系列(二)-字串参考》中的Crack3.exe,也模仿一下在OllyDbg破解的流程,在WinDbg实现一遍。二、调试思想 《OllyDBG 入门系列(二)-字串参考》一文中是使转载 2014-12-30 18:36:03 · 741 阅读 · 0 评论 -
WinDbg学习笔记(一)--认识WinDbg
一、前言 本人学习WinDbg已经有好几天了,虽说技术掌握的还不太熟练,不过也总算是入门了在学习WinDbg的过程中,觉得WinDbg真的比OllyDbg难很多(不知道是不是习惯OllyDbg的缘故),所以就想做点笔记,那以后自己忘了也可以拿出来复习,也为同样在学WinDbg的兄弟提供一点帮助。文章写得有点嗦,初学者应该可以很快看完,老鸟就可以飘过了…二、WinDbg简介转载 2014-12-30 18:28:31 · 553 阅读 · 0 评论 -
VC中的trace
VC中的trace该宏仅仅在程序的DEBUG版本中出现,当RELEASE的时候该宏就完全消失了,从而帮助你调试也在RELEASE的时候减少代码量。使用非常简单,格式如下: TRACE("DDDDDDDDDDD"); TRACE("wewe%d",333); 同样还存在TRACE0,TRACE1,TRACE2。。。分别对应0,1,2。。个参数 TRACE信息输出到VC IDE环境的输出窗口(转载 2014-11-15 10:25:15 · 470 阅读 · 0 评论 -
监视窗口添加 $err,hr 一行来实时现实错误
在Visual C++ 中,可以在监视窗口添加 $err,hr 一行来实时现实错误。调试过程中,该项相当于在每次调用API函数之后调用GetLastError函数。其值由两部分组成,一个是错误代码(十六进制),另一个是错误代码所对应的文本提示。该方法支持多语言。转载 2014-10-11 16:11:14 · 742 阅读 · 0 评论 -
如何定位Release程序崩溃原因
[转]如何定位Release程序崩溃原因Posted on 2011-08-19 10:44 单鱼游弋 阅读(2162) 评论(1)编辑 收藏 1 案例描述作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭。请与您的供应商联系。呵呵,这句微软的“名言”,恐怕是程序员最怕见转载 2014-10-09 12:51:59 · 1077 阅读 · 0 评论 -
抓取dump的头文件
//文件名:DumpModule.h//使用说明:此文件是一个抓取程序出现异常时dump的头文件,使用时只需要包含就可以了,如果程序出现异常就会生成一个dump文件,在可执行文件的相同目录。#if !defined(_DUMPMODULE_H_FBFFBA7D_971E_48e0_A589_6FD14E8965B6)#define _DUMPMODULE_H_FBFFBA7D_971...原创 2014-10-15 14:29:04 · 942 阅读 · 0 评论 -
WinDbg学习笔记(一)--认识WinDbg
标 题: 【原创】WinDbg学习笔记(一)--认识WinDbg作 者: gaorqing时 间: 2009-07-27,20:45:27链 接: http://bbs.pediy.com/showthread.php?t=94457WinDbg学习笔记(一)--认识WinDbg一、前言 本人学习WinDbg已经有好几天了,虽说技术掌握的还不太熟练,不过也转载 2015-05-27 15:23:49 · 584 阅读 · 0 评论 -
AppVerifier的功能和原理
以下基本上都是有关MS官网的文档介绍,觉得讲得挺好的就记下来: 在软件开发生命周期中使用应用程序验证器发布日期 : 2006-6-5 | 更新日期 : 2006-6-5摘要Microsoft® Application Verifier (AppVerifier) 是针对非托管代码的运行时验证工具,它有助于找到细小的编程错误、安全问题和受限的用户帐户特权问转载 2015-05-22 10:43:11 · 1148 阅读 · 0 评论 -
如何使用Appverifier ?
AppVerifier 特别用于检测和帮助调试内存损坏、危险的安全漏洞以及受限的用户帐户特权问题。AppVerifier 有助于创建可靠且安全的应用程序,方法是监视应用程序与Windows操作系统的交互,并配置应用程序使用的对象、注册表、文件系统和 Win32 API(包括堆、句柄和锁)。AppVerifier 还包括检查,以便预测应用程序在非管理员环境中的执行情况。1、 Appv转载 2015-05-22 10:42:13 · 570 阅读 · 0 评论 -
调试Release发布版程序的Crash错误
http://blog.sina.com.cn/s/blog_48f93b530100fsln.html在Windows平台下用C++开发应用程序,最不想见到的情况恐怕就是程序崩溃,而要想解决引起问题的bug,最困难的应该就是调试release版本了。因为release版本来就少了很多调试信息,更何况一般都是发布出去由用户使用,crash的现场很难保留和重现。本文将给出几个解决方案,完成对转载 2015-05-25 13:13:13 · 746 阅读 · 0 评论 -
C++ 常见崩溃问题分析
一、前言从事自动化测试平台开发的编程实践中,遭遇了几个程序崩溃问题,解决它们颇费了不少心思,解决过程中的曲折和彻夜的辗转反侧却历历在目,一直寻思写点东西,为这段难忘的经历留点纪念,总结惨痛的教训带来的经验,以期通过自己的经历为他人和自己带来福祉:写出更高质量的程序; 由于 C 和 C++ 这两种语言血缘非常近,文本亦对 C 编程语言有借鉴作用; 二、C++ 崩溃转载 2015-05-25 13:09:48 · 2120 阅读 · 0 评论 -
C++异常处理try throw catch
// tt.cpp : 定义控制台应用程序的入口点。///*程序中的错误分为编译时的错误和运行时的错误。编译时的错误主要是语法错误,比如:句尾没有加分号,括号不匹配,关键字错误等,这类错误比较容易修改,因为编译系统会指出错误在第几行,什么错误。而运行时的错误则不容易修改,因为其中的错误是不可预料的,或者可以预料但无法避免的,比如内存空间不够,或者在调用函数时,出现数组越界等错误。如果对原创 2015-01-05 11:34:24 · 944 阅读 · 0 评论