Dump文件分析 - PDB不匹配的情景


WinDbg

Windows 调试程序 (WinDbg)可用于调试内核模式和用户模式代码、分析故障转储以及在代码执行时检查 CPU 寄存器。


(一)运行程序产生dump

#include <windows.h>
#include <tchar.h>
#include <DbgHelp.h>
#pragma comment(lib, "dbghelp.lib")

LONG ApplicationCrashHandler(EXCEPTION_POINTERS* pException)
{
    // dump的文件句柄
    HANDLE hDumpFile = CreateFile(_T("mydump.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    // dump的异常信息
    MINIDUMP_EXCEPTION_INFORMATION dumpExInfo;
    dumpExInfo.ExceptionPointers = pException;
    dumpExInfo.ThreadId = GetCurrentThreadId();
    dumpExInfo.ClientPointers = TRUE;
    // 写入dump文件
    MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, (MINIDUMP_TYPE)MiniDumpNormal, &dumpExInfo, NULL, NULL);
    CloseHandle(hDumpFile);
    return EXCEPTION_EXECUTE_HANDLER;
}

void simdump()
{
    int* p = NULL;
    *p = 0;
}

int main()
{
    //注册异常处理函数  
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
    //模拟异常
    simdump();
    return 0;
}

(二)WinDbg 基于地址偏移量计算异常地址 (方法一)

  1. 打开dump文件,运行 !analyze -v命令,显然多处显示Exception的地址为Project + 11902,其中Project是本例的exe进程名。
    !analyze -v

  2. 打开WinDbg,通过File->Open Source File打开cpp源文件,以及File->Open Executable打开exe文件,此时会自动进入调试断点(也可自行添加断点检查是否成功加载)。
    注:本例的pdb是重新生成的,和运行的程序不是同一个版本。
    源代码调试

  3. 命令窗口输入lm,获取模块的地址,此时看到Project的基地址为007d0000.
    lm模块

  4. 通过工具栏打开disassembly,输入007e1902,即007d0000 + 11902
    disassembly

  5. 分析该行汇编代码,mov dword ptr [eax],0 得出向0(空指针)赋值异常,此时通过Edit->Go to current Instruction即可跳到对应的函数。
    Go to current Instruction

  6. 或者我们可以通过Debug->Go Unhandled Exception快速跳转到问题点
    Go Unhandled Exception


(三)WinDbg 强制加载pdb (方法二)

  1. File->Symbol File Path输入pdb文件路径
  2. File->Open Crash Dump选择dump文件或直接拖入
  3. 运行’.symfix; .reload’ 命令加载pdb文件
    Reload
  4. 运行 !analyze -v命令分析,获得异常的地址为simdump+0x32,即异常发生在simdump函数,,通过disassembly定位汇编语句分析。
    analyze

参考

Windows 调试工具

总结

WinDbg不使用PDB调试的资料非常少,在寻找分析方法的时候尝试了很多次,最后通过不懈的努力(瞎搞)终于摸到了门路,主要的方面还是熟悉工具的菜单命令和地址计算,在此分享。官方的文档还未来得及看,有精通此道的大神博客欢迎推荐给我学习。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值