gpt4 book ai didi

windbg - 转储文件 + PDB 文件 - 是否可以在一台 PC 上创建转储然后在另一台 PC 上进行调查?

转载 作者:行者123 更新时间:2023-12-02 17:34:01 28 4
gpt4 key购买 nike

某个问题只能在客户方重现。尽管我们尝试了所有方法,但我们无法在本地复制它。

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

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

我的问题有两部分:

  1. 这种方法行得通吗?
  2. 如果是 - 具体怎么做?

目前我怀疑这是否可行。因为我试图在本地 Win 2008 R2 VM 上创建验证测试。我用 .PDB 文件构建所有文件,然后我在中间暂停很长时间的模式下运行我们的软件,我在暂停时恰好在 TaskMgr 中单击“创建转储文件”(它的简单调用 sleep (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

如您所见,WinDbg 似乎只显示堆栈中的最后 7 个项目,这对我来说是无用的。问题 - 是否可以从 Windows 7/2008 的 TaskMgr 中创建的转储文件中发现完整的堆栈跟踪?或者至少 - 我需要堆栈跟踪中的更多项,以查看从代码中的哪个位置进行了此调用。

注意:编译器 MS VisualStudio 2008,WinDbg 6.12 x64。

最佳答案

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

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

关于windbg - 转储文件 + PDB 文件 - 是否可以在一台 PC 上创建转储然后在另一台 PC 上进行调查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29076241/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com