Articles of windbg

WinDbg:尝试附加到进程时dbghelp.dll的版本不匹配

一年前,我已经使用WinDbg和DebugDiag来查找JNI本地DLL中的内存泄漏,我们在Java中使用它。 现在我正在寻找一个线程处理泄漏。 我使用Process Explorer创build了一个内存转储,并试图在DebugDiag中进行分析,但是我得到的只是脚本错误: 我也尝试过WinDbg,但是它不能够附加到一个进程了。 我总是得到错误消息“dbghelp.dll与debugging器版本不匹配”: (“Unbekannter Fehler”的意思是“未知错误”) 我卸载了DebugDiag和Windows SDK,然后下载了最新的版本,并安装了Windows SDK 8和DebugDiag 1.2(x86)。 问题保持不变。 即使使用V7.1(最新的Windows 7 SDK)replaceWindows SDK之后,也没有任何变化。 我正在使用Windows 7(32位)的机器。 我认为DebugDiag中的问题与WinDbg中的问题具有相同的原因。 但我不明白版本不匹配是什么意思(和谷歌search也没有帮助): WinDbg:6.12.0002.633 dbgeng:6.12.0002.633 dbghelp:6.12.0002.633 我怎样才能使WinDbg(希望DebugDiag)再次工作?

调查内存泄漏

我们在应用程序中有一个缓慢的内存泄漏,我已经通过以下步骤来分析泄漏的原因: 在GFlags中启用用户模式堆栈跟踪数据库 在Windbg中,键入以下命令: !heap -stat -h 1250000 (其中, 1250000是具有泄漏的堆的地址)比较多个转储后,我看到大小为0xC的存储器块随着时间而增加,内存泄漏。 input以下命令: !heap -flt sc给出UserPtr的这些分配,最后: 在这些地址上inputheap -p -a地址总是显示下面的分配调用堆栈: 0:000> !堆-p -a 10576ef8 address 10576ef8 found in _HEAP @ 1250000 HEAP_ENTRY Size Prev Flags UserPtr UserSize – state 10576ed0 000a 0000 [03] 10576ef8 0000c – (busy) mscoreei!CLRRuntimeInfoImpl::`vftable' 7c94b244 ntdll!RtlAllocateHeapSlowly+0x00000044 7c919c0c ntdll!RtlAllocateHeap+0x00000e64 603b14a4 mscoreei!UtilExecutionEngine::ClrHeapAlloc+0x00000014 603b14cb mscoreei!ClrHeapAlloc+0x00000023 603b14f7 mscoreei!ClrAllocInProcessHeapBootstrap+0x0000002e 603b1614 […]

windbg!堆输出中的“大小”数字是什么意思?

我在DMP文件中看到类似这样的输出: Heap entries for Segment00 in Heap 00150000 00150640: 00640 . 00040 [01] – busy (40) 00150680: 00040 . 01808 [01] – busy (1800) 00151e88: 01808 . 00210 [01] – busy (208) 00152098: 00210 . 00228 [00] 001522c0: 00228 . 00030 [01] – busy (22) 001522f0: 00030 . 00018 [01] – busy (10) 00152308: 00018 […]

无法find模块“mscorwks.dll”

我尝试使用winDBG来debugging转储文件。 当我运行.loadby sos mscorwks.dll 它给了我一个错误消息。 无法find模块“mscorwks.dll” 有没有人见过这个?

是0x0000ffff在Windows中的DLL的默认加载计数?

使用windbg,通过!dlls命令获得负载计数的dll列表。 观察到许多加载的dll的负载计数是0x0000ffff 。 这是一个默认值? 这是否意味着什么? 0x00262fa8: C:\WINDOWS\system32\ole32.dll Base 0x774e0000 EntryPoint 0x774fd0b9 Size 0x0013d000 Flags 0x80084006` LoadCount 0x0000ffff TlsIndex 0x00000000 LDRP_STATIC_LINK LDRP_IMAGE_DLL LDR**strong text**P_ENTRY_PROCESSED LDRP_PROCESS_ATTACH_CALLED

Windows单链表(_SINGLE_LIST_ENTRY)

我只是在Windows 7崩溃转储中进行一些debugging,并且遇到了一个单链表,我无法完全理解。 这是WinDBG的输出: dt _GENERAL_LOOKASIDE_POOL fffff80002a14800 -b …. 0x000 SingleListHead: _SINGLE_LIST_ENTRY +0x000 Next: 0x0000000000220001 …. 从我一直在读的内容看来,每个单链表似乎都以一个列表头开始,它包含一个指向列表中第一个元素的指针,如果列表为空,则为空。 微软声明: MSDN文章 对于用作列表条目的SINGLE_LIST_ENTRY,Next成员指向列表中的下一个条目,如果列表中没有下一个条目,则为NULL。 对于作为列表头的SINGLE_LIST_ENTRY,Next成员指向列表中的第一个条目,如果列表为空,则指向NULL。 我99%确定这个列表包含一些条目,但我不明白如何值0x0000000000220001应该指向任何东西。 这个值当然不能parsing为有效的页面映射,所以我只能假设它是某种偏移量。 但是,我不确定。 如果有人能够帮助我们发现这一点,我会很感激的。 谢谢 UPDATE 我刚刚find一个文件(翻译成中文),似乎更多地解释了这个结构。 如果有人可以提供一些意见,我会很感激。 旁视清单文章 我实际上看到的是Windows应该用来分配IRP的后备列表,下面是WinDBG的全部输出(值从原来的问题改变了): lkd> !lookaside iopsmallirplookasidelist Lookaside "" @ fffff80002a14800 "Irps" Type = 0000 NonPagedPool Current Depth = 0 Max Depth = 4 Size = 280 Max Alloc […]

WinDbg中的“Break指令exception”是什么?

我正在debugging一些随机的崩溃错误,但实际上很难深入。 因为当我打开崩溃转储,只发现一个错误: 0:000> .exr -1 ExceptionAddress: 00000000 ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 0 其实我没有在代码中设置任何硬代码断点,所以我在谷歌search这个exception,有人说这个exception可能是由堆损坏造成的。 所以我的问题是,除了硬代码断点,debugging时手动断点,堆损坏,为什么会导致此exception还有其他原因吗? 另一个问题是,我尝试使用应用程序validation程序来检查堆损坏,我明白它是如何工作的,应用程序validation器将在堆损坏时触发中断指令exception。 但目前,我运行没有应用程序validation,谁会提高中断指令exception? 附加信息:调用当前线程的堆栈。 *0:000> k ChildEBP RetAddr 0012f96c 7c827d19 ntdll!KiFastSystemCallRet 0012f970 77e6202c ntdll!NtWaitForMultipleObjects+0xc 0012fa18 7739bbd1 kernel32!WaitForMultipleObjectsEx+0x11a 0012fa74 3b288523 user32!RealMsgWaitForMultipleObjectsEx+0x141 0012fab8 3b32b9bd msenv!EnvironmentMsgLoop+0x1ea 0012fae4 3b32b94d msenv!CMsoCMHandler::FPushMessageLoop+0x86 0012fb0c 3b32b8e9 msenv!SCM::FPushMessageLoop+0xb7 0012fb28 3b32b8b8 msenv!SCM_MsoCompMgr::FPushMessageLoop+0x28 0012fb48 3b32be4e msenv!CMsoComponent::PushMsgLoop+0x28 0012fbe0 3b327561 msenv!VStudioMainLogged+0x482 […]

如何使用dbghlp和pdb获取结构体的字段名称和偏移量

我想用与windbg的dt命令相同的方式来转储结构的字段和偏移量。 比方说,我想转储微软公共符号中的_PEB结构(因为windbg的DT命令起作用)。 从MSDN文档中,我了解到,SymFromName函数应该能够做到这一点,下面是我已经尝试失败SymFromName与LastError 126(无法find指定的模块)的代码。 从注册的callback我得到以下输出: CBA_SET_OPTIONS CBA_SET_OPTIONS CBA_SET_OPTIONS CBA_EVENT: code 0 desc DBGHELP: Symbol Search Path: symsrv*symsrv.dll*C:\Symbols*http://msdl.microsoft.com/download/symbols DBGHELP: Symbol Search Path: symsrv*symsrv.dll*C:\Symbols*http://msdl.microsoft.com/download/symbols CBA_DEFERRED_SYMBOL_LOAD_START: C:\Windows\Sysnative\ntdll.dll CBA_DEFERRED_SYMBOL_LOAD_PARTIAL: C:\Windows\Sysnative\ntdll.dll CBA_EVENT: code 0 desc DBGHELP: No header for C:\Windows\Sysnative\ntdll.dll. Searching for image on disk DBGHELP: No header for C:\Windows\Sysnative\ntdll.dll. Searching for image on disk CBA_EVENT: code 0 desc DBGHELP: […]

你怎么能改变一个年龄不匹配的PDB来正确匹配?

我们每晚的构build过程被打破了很长一段时间,这样它生成的PDB文件的年龄与相应的图像文件相差几个小时。 我已经解决了这个问题。 不过,我想开始使用符号服务器,但不能由于必须使用这些年龄不匹配的pdb文件。 我使用windbg中的.symopt + 0x40方法解决了这个问题。 这意味着我必须手工组织我所有的pdb文件,经过多年的发布,这些都是相加的。 我正在寻找一种方法来修改windbg用来标记pdb年龄的机制,并强制它匹配我的图像文件。 实用程序ChkMatch做了类似的事情,但对于pdb签名。 开发人员在页面上指出:“如果ChkMatch具有不同的签名但是年龄相同,ChkMatch能够使可执行文件和PDB文件匹配(有关PDB签名和年龄的更多信息,请参阅本文)。如果年龄不同,工具无法制作文件匹配“。 我看了一个六合彩的人,甚至发现了与年龄相对应的东西,但是它必须在内部扯些更多的伎俩,因为我不能使它工作。 有任何想法吗? 编辑 :我不知道这是否有帮助,但在我的特殊情况下,年龄差异是由于不必要地重新链接dll的,这将重新创buildPDB文件。 但是,我们的构build过程是将原始dll(在重新链接之前)和重新链接之后的pdb进行存储。 我想到了手工重现这种情况。 意思是强制在DLL上重新链接,但是在两种情况下都要保存pdb。 然后我可以做两个文件的二进制比较,看看他们如何改变。 也许运行某种修补软件,自动执行此操作? 通过查看我的控件情况究竟发生了什么变化,也许我可以对我公司构build过程中保存的DLL和PDB执行相同的操作? 编辑 :我想出来了! 感谢第一个答复的评论之一,我查了一下这本书“无证Windows 2000秘密:程序员食谱”的pdf的链接。 作者详细介绍了pdb文件格式。 正如我之前所说的,我已经把pdb加载到了一个hex编辑器中,并翻转了一些表示我做了年龄/签名匹配的东西,但是它没有起作用。 那么,在使用W2k机密书中的实用程序将pdb“爆炸”到包含的stream中之后,我发现他们隐藏了另一个在stream3中对年龄的引用!!!!!!! 一旦我翻转那一个,它在windbg匹配。 这是巨大的! 非常感谢你….符号服务器在这里我来了!

在内核转储中解释Section对象

我试图追查与3Party应用程序的问题。 当前正在调查的path是查看在每个进程中创build的Section对象: rpsPdf10.mutex 。 如果对象的名称是它的用途的任何迹象,我不知道他们为什么select一个Section对象,并将其用作互斥量,但这可能在很大程度上不相关。 使用LiveKd我已经发出以下命令试图获取Section对象的详细信息 0: kd>!process 0 0 3thParty.exe … PROCESS fffffa800ea80060 SessionId: 0 Cid: 0a00 Peb: fffdf000 ParentCid: 014c DirBase: 99349000 ObjectTable: fffff8a004448bf0 HandleCount: 338. Image: 3thParty.exe … 0: kd> !handle 0 7 fffffa800ea80060 … 08 fffff8a012e26710 Section rpsPdf10.mutex … 0: kd> !object fffff8a012e26710 Object: fffff8a012e26710 Type: (fffffa800cd7cea0) Section ObjectHeader: fffff8a012e266e0 (new […]