PDB符号文件与Windows下利用Windbg 分析dump

PDB简介

跟踪提供程序(例如应用程序或驱动程序)的程序数据库 (PDB) 符号文件包含用于对跟踪消息设置格式的指令,以便可以按照用户可读的形式显示这些消息。

跟踪消息格式设置指令属于跟踪提供程序源代码的一部分。 WPP 预处理器从代码中提取这些指令并将其添加到跟踪提供程序的 PDB 符号文件。

当你编译调试(已检验)版本的跟踪提供程序时,编译器生成 PDB 文件。默认情况下,当你使用 BinPlace 生成跟踪提供程序时,生成过程将创建 PDB 文件。

WDK 中的 跟踪使用器、 TraceView 和 Tracefmt 可以从 PDB 文件或 TMF 文件中直接提取跟踪消息格式设置信息。其他的则要求 TMF 文件。 Tracepdb 将 PDB 文件作为输入,提取格式设置信息,然后创建 TMF 文件作为输出。

其他跟踪使用器不使用 PDB 文件或 TMF 文件,例如包含在 Windows 中的工具 Tracerpt。相反,它们使用托管对象格式 (MOF) 文件中的信息为跟踪事件设置格式。这些工具无法对跟踪消息设置格式。

概述:

  1. 注册生成dump文件的函数。
  2. 当程序收到没有捕获的异常时,调用上述函数,生成dump文件。
  3. 利用Windbg结合编译程序时生成的pdb和代码来分析dump文件,定位问题。

 

如下代码生成dump文件(转):

复制代码
#include <Windows.h>
#include <stdio.h>
#include <DbgHelp.h>  
#pragma comment(lib, "dbghelp.lib") 

inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName)  
{  
    if(pModuleName == NULL)  
    {  
        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(PEXCEPTION_POINTERS pep, LPCTSTR strFileName)  
{  
    HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,  
        FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);  
  
    if(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       = NULL;  
  
      ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile, MiniDumpNormal, (pep != NULL) ? &mdei : NULL, NULL, &mci);  
  
      CloseHandle(hFile);  
    }  
}  


LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)  
{
  CreateMiniDump(pExceptionInfo, "core.dmp");  
  
  return EXCEPTION_EXECUTE_HANDLER;  
}  
复制代码

 

确保程序开始执行如下代码,然后程序崩溃时会调用上面代码创建dump文件:

SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);

 

分析生成的dump文件需要如下:

  • 编译程序时生成的PDB,如果是release版本:
    •   需要禁用优化 - VS - Project Property - C/C++ Optimization - Release - Optimization - Disabled
    •   启用生成调试信息 - VS - Project Property - Linker - Debugging - Generate Debug Info - Yes.
  • 代码

 

分析dump文件步骤如下:

  1. 运行Windbg。
  2. 指定PDB文件路径: File - Symbol File Path。多个路径用分号分隔。
  3. 指定代码路径:File - Source File Path
  4. 载入dump文件。
  5. Windbg命令行输入:  !analyze -v
  6. 等待结果 - 函数调用堆栈,程序崩溃代码。busy状态表示正在生成结果。

 

注释:

  • 没有代码,只有PDB,也可以显示函数调用堆栈,但是不会定位到具体代码。
  • Windbg中,配置 Symbol File Path: srv*c:\symbols*http://msdl.microsoft.com/download/symbols,可以解决本地找不到symbol问题。定位一般问题,不是必须。c:\symbols为本地缓存PDB目录。只会同步用到的symbol。
  • Windbg的附带工具symchk可以用来下载指定dll的pdb文件:
    • 下载特定dll的pdb文件:symchk /r c:\windows\system32\secur32.dll /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols
    • 下载特定目录下的dll的pdb文件:symchk /r c:\windows\system32 /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols
  • 如果dump文件被拷贝到编译程序的机器上,无需指定代码路径,只需指定pdb文件,可自动定位代码。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 要使用Windbg调试dump文件,首先需要打开Windbg并将其附加到崩溃的程序进程。然后,可以使用.dump命令生成dump文件。.dump命令有不同的选项,可以生成不同类型的dump文件。例如,使用/m选项可以生成标准的minidump文件,该文件包含系统信息、加载的模块信息、进程信息和线程信息。使用/ma选项可以生成带有尽量多选项的minidump文件,包括完整的内存内容、句柄、未加载的模块等。使用/mFhutwd选项可以生成带有数据段、非共享的读/写内存页和其他有用信息的minidump文件。还可以使用/f选项生成全信息dump文件。\[1\] 在分析dump文件之前,需要设置Windbg的环境。可以设置符号路径(PDB路径)和源码路径。然后,可以使用File->Open Executable命令打开可执行文件,并配置可执行文件的运行参数。接下来,可以使用Windbg的命令启动调试。\[2\] 另外,要注意安装Windbg并设置符号路径。可以通过腾讯电脑管家下载Windbg,并设置符号路径为c:\symcachehttp://msdl.microsoft.com/download/symbols;c:\symcache。还需要加载SOS调试扩展,以便查看在公共语言运行时中运行的代码的相关信息。加载SOS的命令是.load,例如.load C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/sos.dll。需要确保加载的sos.dll版本与运行的程序版本对应。\[3\] #### 引用[.reference_title] - *1* *2* [Windbg分析dump及调试程序](https://blog.csdn.net/listener51/article/details/79719871)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Windbg分析Dump文件](https://blog.csdn.net/zjpdd1023/article/details/105008250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值