Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1857|回复: 3
打印 上一主题 下一主题

异常处理

[复制链接]

257

主题

354

帖子

1677

积分

金牌会员

Rank: 6Rank: 6

积分
1677
跳转到指定楼层
楼主
发表于 2016-5-2 12:18:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
异常处理.zip (3.24 KB, 下载次数: 1)
回复

使用道具 举报

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
沙发
发表于 2020-1-28 21:05:44 | 只看该作者
回复 支持 反对

使用道具 举报

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
板凳
发表于 2020-1-28 21:12:35 | 只看该作者
异常研究

drwtsn32
dump生成工具  ProcessExplorer




链接:https://pan.baidu.com/s/1i5Gg8J6db198k3GoQvrvUQ
提取码:c9qh


NTSD
前言:既然Drwtsn32存在若干缺陷,需要寻找新的技术替代Drwtsn32。NTSD是一个不错的选择。本文将从Drwtsn32的几个缺点,分别介绍NTSD中 的解决方法。主要介绍以下三个方面的内容:
1、NTSD配置
2、NTSD优点
3、NTSD缺点
一、 NTSD配置
There are two options to deploy NTSD!
Option 1-Share Model
所有的应用程序异常崩溃都用调用的方式,drwtsn32一样,修改注册表中Debugger的值为:
C:/WINDOWS/system32/ntsd.exe -p %ld -e %ld -g -c ".dump D:/Dump/jit.dmp;q"
其中第一个路径为ntsd.exe程序目录,最后一个路径为生成的dmp文件存储路径,该目录必须存在,否则文件将生成失败。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml6916\wps1.png
图1.1 Share Model 参数设置
Option 2-Unshared Model
为特定某个应用程序崩溃指定调试程序,在键
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/CurrentVersion/Image File Execution Options下建一个项;比如为GPTLog进行特殊设置,取名为GPTLog.EXE,而后增加Debugger键,类型为string,键值为:
C:/WINDOWS/system32/ntsd.exe -g -c ".dump D:/Dump/jit.dmp;q"
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml6916\wps2.png
图1.2 UnShared Mode 参数设置
Note: If value name Debugger doesn’t exist under the new key, create it; if path of NTSD contains space, a quote is needed.
二、NTSD优点
    NTSD可以解决 drwtsn32中的所有缺陷!
1、  JIT debugging under any user account(在任何帐户下可以使用)
-noio 命令行参数,允许任何用户访问WinSta0,使其可以使用ntsd,修改后命令:
C:/WINDOWS/system32/ntsd.exe -p %ld -e %ld -g -noio -c ".dump D:/Dump/jit.dmp;q"
       
2、  Crash dump files with unique names(生成唯一的dmp文件名)
If we use /u option with .dump command, the command will create a crash dump with unique name (based on the specified file name, current date and time, and some additional information; for example, jit_0648_2005-06-13_23-42-49-834_0638.dmp). Here is the new command line:
C:/WINDOWS/system32/ntsd.exe -p %ld -e %ld -g -noio -c ".dump –u D:/Dump/jit.dmp;q"
3、  Customizing the minidump format(定制minidump格式)
Other options of .dump command allow to customize the format and contents of the minidump. Complete list can be found in Debugging Tools' documentation (search for .dump command), and here I will show the most popular ones:
/f
Full user dump (old format, not recommended)
/m
Standard minidump (equivalent of MiniDumpNormal minidump type; this option is used by default)
/ma
Minidump with all possible options (memory, handles, unloaded modules, etc.)
/mFhutwd
Minidump with data sections, non-shared read/write memory pages and other useful information (my personal favorite when size of the minidump is important)
You can Find more information about contents of minidumps in this article:
and here is the new command line that creates a minidump with as much information as possible:
c:/dbgtools/ntsd.exe -p %ld -e %ld -g -noio -c ".dump /ma /u D:/dumps/jit.dmp;q"
       
4、  Sending notifications(发送告示)
Finally, let's notify ourselves when an application crashes on another system in the network (e.g. in test lab). NTSD makes it possible with the help of !net_send command, which allows to send a message to another computer over the network. This command line takes the following parameters:
!net_send SenderMachine TargetMachine SenderMachine MessageText
Assuming that NTSD is running on the computer called TestPc, and we want to send a message to the computer called DevPc, the command would look like this:
c:/dbgtools/ntsd.exe -p %ld -e %ld -g -noio -c ".dump /ma /u D:/dumps/jit.dmp;!net_send TestPc DevPc TestPc Crash dump created;q"
;q 表示退出Dos窗口
三、NTSD缺点
这也是drwtsn32(Dr. Watson)的一个优点,drwtsn32被安装于到现在为止的所有操作系统。NTSD也存在于以Windows NT为内核的操作系统中,但在大多数操作系统中存在的是她的老版本,不支持此处讨论的绝大部分参数。然而,NTSD仍是JIT(Just In Time) Debugger的强有力的竞争者之一。
参考文章:


前言:对于Debug模式程序的调试,大家都比较熟悉。但对于Release模式下程序异常崩溃,很多程序员束手无策。其实,Release模式的发布程序,通过一些方法也可以获取程序崩溃时的堆栈信息,并可以生成Dump文件。此后的几篇文章将介绍这些方法。这些方法大多为网络上查找的,本人只是做一个总结。文章从基础开始谈起,没有任何Release除错经验的人也可以完全看明白。
本文将介绍以下三个方面的内容:
1、  Windows错误处理流程
2、  调试工具包
3、  drwtsn32简介
一、   Windows错误处理流程
当 Windows 中出现程序错误时,系统将搜索错误处理程序。程序错误处理程序处理程序运行过程中出现的错误。如果系统找不到程序错误处理程序,系统将验证是否该程序当前没有被调试,并认为错误没有被处理。然后系统通过在“注册表编辑器”中查找程序错误调试程序来处理尚未处理的错误。
系统在“注册表编辑器”(通过命令regedit 进入)的注册表项:
//HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/AeDebug
下查找名为 Debugger 和 Auto 的项。Debugger 项的值指定了调试程序将要用来分析程序错误的命令。如果找到了调试程序项的值,系统将查看 Auto 项的值是设置为 0 还是 1。
l  如果 Auto 项的值设置为 0,系统将产生一个消息框,通知您发生了程序错误。如果“调试程序”项的值指定了有效调试程序所使用的命令,消息框将显示两个按钮:“确定”和“取消”。如果单击“确定”,程序将终止。如果单击“取消”,系统将启动指定的调试程序。如果“调试程序”项的值为空,消息框将只显示“确定”,并且不启动任何调试程序。
l  如果 Auto 项的值设置为 1,并且调试程序项的值指定了有效调试程序所使用的命令,系统将自动启动该调试程序,并且不会产生消息框。
当在系统上安装 Windows 时,默认情况下 Auto 项的值设置为 1,并且调试程序项的值指定了启动 Dr.Watson 的命令。这意味着当出现程序错误时,Dr.Watson for Windows 将自动诊断错误,并记录相应的诊断信息。
如果您使用的默认调试程序不是 Dr.Watson,而又要换用 Dr.Watson,请在命令提示符后键入命令 drwtsn32 -i 来启动 Dr.Watson。键入 -i 可对注册表进行必要的更改。
Windows下的调试工具有很多,比如drwtsn32、NTSD、KD、CDB、WinDbg等。
二、   调试工具
1、  本系列文章中所使用的调试工具,可以通过URL:
http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.msi 下载,这是一个x86系统32位的调试工具包,如果需要其他环境的工具包,可以在同级目录中寻找。
       
2、  下载安装后,可以将安装后的文件拷贝到所需要的目录。比如将Debugger键值设置为C:/WINDOWS/system32/ntsd.exe -p %ld -e %ld -g -c ".dump D:/Dump/jit.dmp;q",则需要将安装目录中的ntsd.exe拷贝到C:/WINDOWS/system32/目录中,如果存在ntsd.exe,选择覆盖,即将最新版本的调试工具覆盖之前的版本。
三、   drwtsn32简介
1、  安装 Windows 时,会将 Dr.Watson (Drwtsn32.exe) 安装到系统文件夹中。首次运行 Dr.Watson 时(即出现程序错误时或用户亲自启动 Dr.Watson 时),会设置默认选项。Dr.Watson for Windows 是一个程序错误调试程序。Dr.Watson 记录的信息是技术支持小组诊断运行 Windows 的计算机的程序错误所需的信息。只要检测到错误,就会创建一个文本文件 (Drwtsn32.log),并可按支持人员常用的方式传递给支持人员。也可以选择创建故障转储文件,它是程序员可以加载到调试程序中的二进制文件。如果出现程序错误,Dr.Watson 将自动启动。
   file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml2488\wps1.png图1.1 Dr. Watson界面
通过界面可以对Dr.Watson进行参数配置。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml2488\wps2.png图1.2 默认的注册表项设置
       
2、  当程序异常退出时,系统通过注册表找到drwtsn32程序,根据配置将生成调试信息。打开Drwtsn32.log可以查看程序崩溃时的堆栈等信息。另外转储生成的dmp格式文件为二进制文件,可以通过各种调试软件打开,并分析程序错误。
   file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml2488\wps3.png
图1.3 log 格式文件格式
错误提示对话框一般显示为:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml2488\wps4.png图1.4 Drwtsn32错误提示对话框
3、  drwtsn32 参数意义
drwtsn32 [-i] [-g] [-p pid] [-e event] [-?]
-i 将 DrWtsn32 当作默认应用程序错误调试程序
-g 被忽略,但作为 WINDBG 和 NTSD 的兼容而被提供
-p pid 要调试的进程 id
-e event 表示进程附加完成的事件
-? 这个屏幕
4、  drwtsn32缺点
1)         Dr. Watson cannot debug applications that are running under non-administrative accounts (e.g. it cannot debug applications running under LocalService and NetworkService accounts). In brief, it happens because when kernel32! UnhandledExceptionFilter function calls CreateProcess to start just-in-time debugger (Dr. Watson in this case), it forces the debugger process to attach to WinSta0 window station and WinSta0/Default desktop. By default, only LocalSystem account and members of Administrators group have access to these objects, all other user accounts cannot access them. As a result, any application that uses windows (I mean User objects) or console cannot operate properly and fails in early startup phase.
运行时对运行帐号有要求
2)         Dr. Watson cannot send notifications over network (and thus does not provide a way for us to get notified when an application crashes on a remote system).
在程序崩溃时,不能发送通告
3)         Dr. Watson cannot create crash dump files with unique names (it always uses the file name specified in its settings, and every subsequent debugging session will overwrite the old crash dump file with the new one). As a result, we can lose an important crash dump if another application happens to crash before we have managed to copy the dump file into a safe location.
User.dmp文件不能取不同的文件名,如果另外一个程序死机,之前生成的user.dmp将被覆盖
4)         There is a limited choice of crash dump formats. On Windows NT 4.0 and Windows 2000, only one crash dump format is available (so called “full user dump”). Windows XP and Windows Server 2003 support two additional formats (standard minidump and minidump with full memory contents). If you read my Effective Minidumps article, you already know that better choices of minidump formats often exist.
格式受限制,Windows XP和Windows Server 2003支持另外的两种格式

回复 支持 反对

使用道具 举报

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
地板
发表于 2020-1-28 21:14:36 | 只看该作者
Dump 文件生成与分析 .
http://blog.csdn.net/rickypc/article/details/5922829
最近两天由于项目的需要,研究了一下Dump文件相关的知识,今天做一个小节(由于研究不久并且第一次写blog,希望网友们看到不要见笑)。

     Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。

   Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开,比如使用WinDbg打开。

     当我们的程序发布出去之后,在客户机上是无法跟踪自己代码的bug的,所以Dump(扩展名是 .dmp)文件对于我们来说特别有用。我们可以通过.dmp文件把出现bug 的情况再现,然后根据再现的状况(包括堆栈调用等情况),可以找到出现bug的行号,甚至是出现bug的点。

     通过研究,我总结了两种方式,如下:

     (1)安装WinDBG,具体方式可以参照:http://blog.csdn.net/oeichenwei/archive/2009/05/19/4201590.aspx

     (2)通过Windows系统方式(我的是WinXP),参照:http://blog.csdn.net/wangyangtao/archive/2010/03/08/5355841.aspx



    当然我的方式与以上的两网址里面的不一样(学习以上的基础上做的),我具体做法是:

(1)安装WinDBG

(a)下载安装WinDBG(安装方式不赘述)

(b)打开WinDBG, File/Attach to a process/  然后再列表中显示需要监视的进程(.exe)

(c)当程序崩溃之后执行 DUMP 命令产生 dmp文件,命令有:.dump /m C:/dumps/myapp.dmp  、.dump /ma C:/dumps/myapp.dmp、 .dump /mFhutwd C:/dumps/myapp.dmp

执行以上就产生了dmp文件



(2)通过Windows系统方式

首先用Dr Watson 在运行中输入drwtsn32.exe –i 安装Dr Watson作为默认应用程序调试程序。

再在在运行中输入drwtsn32.exe 设置: 如图:

日志文件路径为 所要放置dump文件的文件夹,故障转储 就是该目录下的dmup文件位置

选择指令和错误数量可以写多点

类型选完整选项选1 2 3 6项

当程序崩溃时,Dr Watson会在设定目录下生成dump文件



通过以上两种方式就生成了DUMP文件,下面就剩下分析了。我们通过两种方式来进行分析
(1)WinDBG方式分析

(a)打开WinDBG,File/Sybolm File Path/ 指定发布EXE 的时候.PDB生成的路径

(b)file/Open Crash Dump/  打开生成的DMP文件

(c)使用WinDBG的命令来分析Bug, 如命令: !analyze -v

(d)也可以使用快捷栏的功能查看一些变量的基本信息来帮助查看Bug



(2)通过VS2005分析,方法参照网址:http://www.cppblog.com/woaidongmao/archive/2009/10/21/99135.html



以上就是我最近两天研究的一个小节,都是别人的一些成果。 首次写blog,如果有不明白的或者有更高明的方式,希望各位网友赐教!



------------程序自动生成Dump文件
http://www.cppblog.com/woaidongmao/archive/2009/10/21/99132.html
前言:通过drwtsn32、NTSD、CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD、CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD、CDB等调试工具。了解了mini dump文件格式后,完全可以程序自动生成Dump文件。

本文主要讨论以下内容:

1、  运行原理

2、  程序修改

3、  注意事项

一、   运行原理

当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter()函数,异常交给函数处理。MSDN中描述为:

Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.



因而,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中利用适当的方法生成Dump文件,即可实现需要的功能。

二、   程序修改

1、  重载 << 操作符。(本步可以不实现)

std:stream& operator<<(std:stream& os, const EXCEPTION_RECORD& red)

{

return os << "   Thread ID:" << GetCurrentThreadId()

<< "   ExceptionCode: " << red.ExceptionCode << "\n"

<< "   ExceptionFlags: " << red.ExceptionFlags << "\n"

<< "   ExceptionAddress: " << red.ExceptionAddress << "\n"

<< "   NumberParameters: " << red.NumberParameters;

}



2、  实现UnhandledExceptionFilter

#include "minidmp.h"

LONG WINAPI GPTUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)

{

CreateMiniDump(pExceptionInfo, L"Exception.dmp");

           std::cerr << "未知错误:" << (*pExceptionInfo->ExceptionRecord) << std::endl;

           exit(pExceptionInfo->ExceptionRecord->ExceptionCode);



           return EXCEPTION_EXECUTE_HANDLER;  // 程序停止运行

}

3、  在异常发生之前调用SetUnhandledExceptionFilter(GPTUnhandledExceptionFilter);

通常在Main()函数开始时调用即可。

4、  CreateMiniDump()函数在minidmp.h头文件中定义,文件如下:

#pragma once

#include <windows.h>

#include <imagehlp.h>

#include <stdlib.h>

#pragma comment(lib, "dbghelp.lib")



inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName)

{

  if(pModuleName == 0)

  {

     return FALSE;

  }



  WCHAR szFileName[_MAX_FNAME] = L"";

  _wsplitpath(pModuleName, NULL, NULL, szFileName, NULL);



  if(wcsicmp(szFileName, L"ntdll") == 0)

     return TRUE;



  return FALSE;

}



inline BOOL CALLBACK MiniDumpCallback(PVOID                            pParam,

                                const PMINIDUMP_CALLBACK_INPUT   pInput,

                                PMINIDUMP_CALLBACK_OUTPUT        pOutput)

{

  if(pInput == 0 || pOutput == 0)

     return FALSE;



  switch(pInput->CallbackType)

  {

  case ModuleCallback:

     if(pOutput->ModuleWriteFlags & ModuleWriteDataSeg)

         if(!IsDataSectionNeeded(pInput->Module.FullPath))

            pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);

  case IncludeModuleCallback:

  case IncludeThreadCallback:

  case ThreadCallback:

  case ThreadExCallback:

     return TRUE;

  default:;

  }



  return FALSE;

}



inline void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)

{

  HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,

     0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);



  if((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))

  {

     MINIDUMP_EXCEPTION_INFORMATION mdei;

     mdei.ThreadId           = GetCurrentThreadId();

     mdei.ExceptionPointers  = pep;

     mdei.ClientPointers     = FALSE;

     MINIDUMP_CALLBACK_INFORMATION mci;

     mci.CallbackRoutine     = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;

     mci.CallbackParam       = 0;

     MINIDUMP_TYPE mdt       = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |

         MiniDumpWithDataSegs |

         MiniDumpWithHandleData |

         0x00000800 /*MiniDumpWithFullMemoryInfo*/ |

         0x00001000 /*MiniDumpWithThreadInfo*/ |

         MiniDumpWithUnloadedModules);

     MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),

         hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci);



     CloseHandle(hFile);

  }

}

三、   注意事项

1、  可执行文件(exe)必须找到dbghelp.dll,才能生成Dump文件。这个DLL可以从调试工具包中找到。

2、  当异常代码定位成功以后,如果无法阻止异常的产生,可以用 __try 结构包装异常代码,__try 和 try 不同,前者可以捕获非法指针产生的异常。

__try {

// 会异常的函数

}

__except( EXCEPTION_EXECUTE_HANDLER ){

// 异常处理

}



参考文档:

http://blog.csdn.net/ArCoolGG/archive/2007/04/05/1553027.aspx

http://www.debuginfo.com/articles/effminidumps.html


-------------利用VS2005进行dump文件调试
前言:利用drwtsn32或NTSD进行程序崩溃处理,都可以生成可用于调试的dmp格式文件。使用VS2005打开生成的DMP文件,能很方便的找出BUG所在位置。本文将讨论以下内容:
1、  程序编译选项
2、  利用VS2005 分析dump文件
3、  常见问题讨论
一、       程序编译选项
PDB files contains all debug information like type definition and function prototype. When application crashes, we need the PDB files to analyze the root cause, so make sure these PDB files will be created when building it. You must do the following setting:
C/C++\General\Debug Information Format=Program Database (/Zi).
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml7424\wps1.png
1.1 调试信息格式
Linker\Debugging\Generate Program Database File=”Name and location of your PDB files”
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml7424\wps2.png
1.2 PDB文件输出路径
PDB文件路径最好设置在同一个文件夹中,这样方便dmp文件调试时调用。
调试时,所有的PDB文件和源文件必须严格匹配(the PDB files should be the one generated by build the source code),并存储在一个安全的位置。当客户报告了一个错误时,你需要这些文件来帮忙以便定位错误于源代码中并解决问题。
二、       VS2005 分析dump文件
In this simple application, there is an unhandled Access Violation Reading exception, because GetNameFromDatabase returns a NULL pointer, and this pointer is passed into IsPrefix and then it’s used directly without NULL pointer checking.
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml7424\wps3.png
1.3 演示代码
利用Release模式编译该测试程序,在客户机上运行该程序,将根据NTSD设置生成相对应的DMP格式文件。
可以使用Visual Studio.NetNTSD或是其他的调试工具对DMP格式文件进行分析。
l         Start Visual Studio.Net
Click File\Open Solution and make sure the files of type is *.dmp then click Open.
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml7424\wps4.png
1.3 Open Dump File (GUI)
l         Set Symbol Path
Click Tools\Options, Debugging\Symbols,增加PDB文件路径。若调试的程序需要微软基础库的PDB信息,可以增加一个路径为:
在界面下方Cache Symbol From symbol…选择本地存储这些Symbols的路径。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml7424\wps5.png
1.4 Symbol Path
如果DMP文件没有放入本身PDB文件所在目录,也可以在此处增加一个本地目录。点OK后,VS2005将从网络中下载所需要的Symbols,需要等待一段时间。如果是多次调试同一个程序错误所生成的DMP文件,可以在对话框中选择“Search the above locations only when symbols are loaded manually”。从而可以节省网络带宽。
l         Set Source code path
Open Solution Property Pages and set the source code path.
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml7424\wps6.png
1.5 属性菜单
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml7424\wps7.png
1.6 Debug Source Files
l         Start to Debug the Dump File
Click the Debug menu, it will ask you to save as a solution, save it. Then it will go to the line which caused the crash of your application.
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml7424\wps8.png
1.7 调试窗口,定位到源代码
三、       常见问题讨论
1  Dump文件放在哪里?
Dump文件不用非要放在你编译出来的位置,你完全可以建立一个新的文件夹来放它。但若不是存放在编译出来的位置,需要将编译生成的PDB文件拷贝到Dump文件目录,或是利用VS2005打开Dump文件后,设置PDB文件路径。参照图1.4
2  如何恢复当时的现场?
可能你要问,怎么可能,这个dump文件可是用户发给我的,我不可能去用户家里调试吧?这个恢复现场可不是指的非要到那台机器上去,而是要把产生dump文件对应的二进制文件拿到。
但是恢复现场需要所有的二进制文件都要对应,你一定要有导致用户崩溃的那些ExeDLL。既然是你发布的程序,Exe文件当然你会有。所以这里只考虑DLL就行了。
Dump文件中记录了所有DLL文件的版本号和时间戳,所以你一定可以同过某种途径拿到它。如果你能从用户那里拿到最好,如果不方便,用户不可能用的是我们平常不常用的操作系统,所以找个有对应系统的机器一般都会有。但是记住不仅是文件名称要一致,还要核对版本和时间戳,如果不同一样没有办法用。
如果客户用了某个特殊的补丁怎么办?
其实这个问题也很好解决,只要它不阻碍阅读堆栈,就不用管它,调试Dump和运行程序不一样,缺少一两个DLL没有任何问题。
3  如果真的需要怎么办?
符号文件现在主要是指PDB文件。
如果没有符号文件,那么调试的时候可能导致堆栈错误。
如果你丢失了这个发布版本中你编译出来的那些exeDLLPDB,那么这个损失是严重的,重新编译出来的版本是不能使用的。
我自己的DLL都有了,可是缺的是系统的DLL的对应PDB文件怎么办?图1.4中已经介绍了方法。微软在它的符号数据库上为我们提供了所有的PDB文件,还有部分非关键DLL。设置好后程序将自动下载需要的PDBDLL文件。
4  拿到需要的文件了,这些文件应该放在哪里?
符号数据库中的文件不用动,把其它的exeDLLPDB文件放在dump文件目录里就行了。
5  我用的是VS2005,明明有源代码,为什么显示不了?
这个是dump调试的最头痛问题,代码可能已经改过了,即使你从SVN拿到当时的版本,时间戳也是错的,VS2005就是不让你显示代码。其实只要在
Tools\OptionsDebugging\General中去掉
Require source files to exactly match the original version的复选就行了。



回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-6 14:46 , Processed in 0.068532 second(s), 21 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表