Windbg 转储文件+;PDB文件-是否可以在一台电脑上创建转储文件,然后在另一台电脑上进行调查?

Windbg 转储文件+;PDB文件-是否可以在一台电脑上创建转储文件,然后在另一台电脑上进行调查?,windbg,dump,pdb,crash-dumps,Windbg,Dump,Pdb,Crash Dumps,一个特定的问题只能在客户方面重现。 尽管我们做了种种尝试,但我们无法在本地复制它 但我知道Windows2008R2中的TaskMgr可以为进程创建转储文件。所以,我的问题是:是否可以在客户站点上为我们的软件的某个进程创建转储文件,然后在本地调查该转储文件? 我们已经对我们的软件进行了新的构建(我们为所有二进制文件保存了一个构建沙盒和*.PDB文件)。然后我们在现场安装了它,现在我们正在等待客户报告问题再次发生,所以我们将为挂起过程创建一个转储文件,然后尝试进行调查 我的问题分为两部分: 这样的

一个特定的问题只能在客户方面重现。 尽管我们做了种种尝试,但我们无法在本地复制它

但我知道Windows2008R2中的TaskMgr可以为进程创建转储文件。所以,我的问题是:是否可以在客户站点上为我们的软件的某个进程创建转储文件,然后在本地调查该转储文件?

我们已经对我们的软件进行了新的构建(我们为所有二进制文件保存了一个构建沙盒和*.PDB文件)。然后我们在现场安装了它,现在我们正在等待客户报告问题再次发生,所以我们将为挂起过程创建一个转储文件,然后尝试进行调查

我的问题分为两部分:

  • 这样的方法行得通吗
  • 如果是,具体怎么做
  • 目前,我怀疑这是否有效。因为我已经尝试在我的本地Win2008R2虚拟机上创建一个验证测试。我用PDB文件构建所有的文件,然后在一个模式下运行我们的软件,当它在中间停留很长一段时间时,我在TaskMGR中点击“创建DIP文件”恰好在它暂停时(它的简单调用<代码>睡眠(30000)< /代码>)。然后我尝试在WinDbg中加载转储文件,并检查在那里可以找到什么。让我对这种方式感到悲观的第一件事是错误的堆栈跟踪。特别是-我在WinDbg中看不到完整的堆栈跟踪。它只显示wow64.dll和ntdll.dll模块的堆栈跟踪,我看不到代码的堆栈跟踪。 特别是我只看到这一点:

    wow64cpu!TurboDispatchJumpAddressEnd+0x6c0
    wow64cpu!TurboDispatchJumpAddressEnd+0x56b
    wow64!Wow64SystemServiceEx+0x1ce
    wow64!Wow64LdrpInitialize+0x42a
    ntdll!RtlUniform+0x6e6
    ntdll!RtlCreateTagHeap+0xa7
    ntdll!LdrInitializeThunk+0xe
    
    但当我尝试使用调试器连接进程时,我看到一个完整的调用堆栈,如下所示:

    ntdll.dll! 7754fd910
    [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
    ntdll.dll!7754fd9l0
    KernelBase.dll! 76ae3bd50
    KernelBase.dll! 76ae44a 5Q
    ScrVm.DLL!Profiler::DoSleep(intmilliseconds=30000) Line 205
    ScrVm.DLL!Script::VmToolKit::iMethod_Sleep(unsigned char & han
    ScrVm.DLL!CComponent::Invoke(const _SU::basic_string<char,std
    ScrVm.DLL!Script::VirtualMachine::do_Invoke(Script::VmCommand 
    ScrVm.DLL!Script::VirtualMachine::InnerLoop( Line 4471
    ScrVm.DLL!Script::VirtualMachine::Execute(unsigned long hFunc=
    ScrVm.DLL!ScriptProcessor::Run(const _SU::basic_string<char,st
    ScrVm.DLL!ScriptProcessor::ProcessDocumentO Line 285 + 0x40 by
    ScrVm.DLL!DocumentProcessor::Process(BinaryDOM::Document * pDo
    ScrVm.DLL!CFuncExecScript::ExecuteO Line 219
    ScrVm.DLL!SrvManager::ExecuteO Line 586 +0xldbytes
    ScrVm.DLL!SrvManager::Run(tag_TReqHdr "pRequestBuf=0x00187
    ScrVm.DLL!SrvManager::HandleRequest(tag_TReqHdr " pRequest
    ScrVm.DLL!SrvProcessRequest(tag_TReqHdr * pRequesffiuf=0x0
    ScrVm.DLL!ProcessRequest(char "pRequesffiuf=0x001873b6, char "
    ScrVm.DLL!ProcessRequest_DLL(char " achMsg=0x001873b6, char "a
    siteExec212.exe!00409b2d0
    siteExec212.exe!0040a4cfO
    
    ntdll.dll!7754fd910
    [下面的帧可能不正确和/或丢失,没有为ntdll.dll加载符号]
    ntdll.dll!7754fd9l0
    KernelBase.dll!76ae3bd50
    KernelBase.dll!76ae44a 5Q
    ScrVm.DLL!探查器::DoSleep(intms=30000)第205行
    ScrVm.DLL!脚本::VmToolKit::iMethod_Sleep(未签名字符和han)
    
    ScrVm.DLL!CComponent::Invoke(const _SU::basic_string由于进程是32位的,因此必须使用32位版本的任务管理器来创建转储。默认安装在C:\Windows\SysWow64\taskmgr.exe中


    另外,请确保使用32位版本的windbg。

    由于进程是32位的,因此必须使用32位版本的任务管理器来创建转储。默认安装在C:\Windows\SysWow64\taskmgr.exe中


    另外,请确保使用32位版本的windbg。

    很抱歉,您正在抱怨MS调用堆栈不完整?请尝试在显示调用堆栈
    .symfix;.reload;kb之前修复符号。要回答您的其他问题,可以打开转储文件并对其进行调试,您需要匹配的PDB以获得合理的调用堆栈,微软一直这样做,因为你可以想象客户系统上存在数百万不同版本的dll。你能澄清一下吗?例如,我只是运行以下命令:1)x ScrVm!*我可以看到-它在ScrMv.dll中列出了所有符号(这是我们S/W的一部分)。因此,符号已经为它加载了。2)lm o我可以在模块列表中看到以下记录:00000000
    03050000 00000000
    03253000 SCRVM C(专用pdb符号)D:[…]\SCRVM.pdb 3)kv,但它仍然显示短堆栈跟踪-仅7项。如您所见,ScrVm.dll的符号已加载并被识别,但仍无法显示完整的堆栈跟踪:-(有什么想法?提示?…我说的是Windows DLL的符号,对于您的DLL,只要符号匹配,它就应该能够解析它们,您可以通过运行
    !sym noise
    并检查调试器是否对PDB满意来确认这一点,其次,我不太明白您指的是什么,可能您没有看到错误完整堆栈跟踪,这是因为默认输出为20行,您可以通过在显示调用堆栈后添加长度来更改此设置:
    kb40
    此显示64个调用,或者使用
    更改它。kframes 0x40
    再次设置为64Hm深度…我刚刚发现了有趣的差异。使用TaskMgr->create dump file创建转储文件时然后WinDbg在这样的转储文件中找不到我的代码的堆栈跟踪!但是当我使用sysintrans ProcDump.exe创建转储文件时,WinDbg完全可以看到它的完整堆栈跟踪。看起来很奇怪…很抱歉,你在抱怨MS调用堆栈不完整吗?请在显示调用堆栈
    .symfix;.reload;kb之前尝试修复符号
    要回答你的另一个问题,是的,你可以打开一个转储文件并调试它,你需要有匹配的PDB来获得合理的调用堆栈,MS一直在这样做,因为你可以想象客户系统上存在数百万不同版本的DLL。你能澄清一下吗?例如,我只运行以下命令:1)x ScrVm!*我可以看到-它列出了ScrMv.dll中的所有符号(这是我们S/W的一部分)。因此,已经为其加载了符号。2) lm o我可以在模块列表中看到以下记录:00000000
    03050000 00000000
    03253000 SCRVM C(专用pdb符号)D:[…]\SCRVM.pdb 3)kv,但它仍然显示短堆栈跟踪-仅7项。如您所见,ScrVm.dll的符号已加载并被识别,但仍无法显示完整的堆栈跟踪:-(有什么想法?提示?…我说的是Windows DLL的符号,对于您的DLL,只要符号匹配,它就应该能够解析它们,您可以通过运行
    !sym noise
    并检查调试器是否对PDB满意来确认这一点,其次,我不太明白您指的是什么,可能您没有看到错误完整堆栈跟踪,这是因为默认输出为20行,您可以通过在显示调用堆栈后添加长度来更改此设置:
    kb40
    此显示64个调用,或使用
    更改它。kframes 0x40
    再次设置为64Hm深度…我刚刚发现了有趣的差异。创建时