Articles of windbg

你怎么能改变一个年龄不匹配的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 […]

如何debugging在启动时启动的进程?

我正在尝试将一个断点设置为在启动时启动的Windows服务。 由于我的一个不幸的错误,该服务强制机器进入重启循环:这意味着我不能达到一个稳定的状态,我可以部署一个修复程序,显然我不能尝试debugging服务在一个更方便的时间。 我可以在内核模式下使用windbg。 当服务碰到wmain函数的时候,我非常想打破它,但是我遇到了问题。 到目前为止,我发现我可以通过使用下面的命令加载图像时停止: !gflag +ksl sxe ld MyServiceExecutable.exe 问题是,一旦中断,我发现自己处于一个空虚的过程,在这个过程中,我显然无法设置断点。 bm MyServiceExecutable!wmain说,它找不到符号,断点将被“延迟”,但它从来没有设置或达到。 在KERNEL32!BaseThreadInitThunk上设置一个断点KERNEL32!BaseThreadInitThunk似乎在运行的所有进程中或多或less的工作,我没有很多运气来停止在我的服务到目前为止。

用windbg在内核模式下debugging时如何突破程序的入口点?

我想在内核模式下debugging一个程序,我想打破像ollydbg程序的入口点。 但是我不能用bp来分解它,因为程序没有启动,符号也不能加载。 我find了一些办法,但我觉得不太好。 1.在内核中打开CreateProcess函数。 但是我不知道哪个函数应该中断,我认为CreateProcess和程序的入口点之间有很长的路要走。 2.用cc改变程序的入口点。 但它需要其他工具,我应该改变字节改回的代码。 我觉得这很烦人。 在ollydbg的帮助下。 在用windbgdebugging的虚拟机中用ollydbgdebugging程序。 我不认为这是一个好主意。 4.使用sxe ld 。 它可以在Listing 3.29的<<Advanced Windows Debugging>> 。 我试过了,但是我发现它只能在第一次使用。 rest后我不知道该怎么做。 5.用bu打破入门function。 但是我不知道我该怎么做。 例如,如何加载符号? 6.使用.create 。 我不知道我说的是否正确。 我认为用windbg在内核模式下进行debugging时,打破一个程序的入口点是一种常见的用法,我认为用强大的windbg必须有一个很好的方法来做到这一点。 什么是最好的办法呢? 顺便说一句,我想在内核模式下debugging一个程序,因为我想获得程序的令牌价值。 我发现windbg可以在用户模式下用!token来标识token,但是我不知道如何在用户模式下得到token的值。 看来我只能在内核模式下得到令牌的价值,对还是错?

内核跟踪Windows 7 WinDbg

在debuggingen_windows_7_checked_build_dvd_x86_398742时,我没有收到debugging信息。 我甚至无法看到我自己的跟踪信息(ATLTRACE)。 相反,Windows XP Checked就像一个魅力。 debugging会话启动时出现“Bad QueryIdType:5”msg。内核debugging显然设置正确。 请帮忙…

如何在重新连接时使windbg强制加载符号?

这是一个愚蠢的。 我在内核模块中遇到了一个问题,每50-100次重启只会发生一次,我想要打断windbg的线路,并且只要检测到问题没有发生就重新启动testing机器。它可以重新启动,看下一次是否发生故障。 问题是我想让windbg停止在启动过程中的断点,在那里我可以看到问题的发生。 但是当testing机器重新启动时,windbg变得不安(当机器不在时),然后当Windows启动时它再次连接。 它加载我的工作区,但它似乎没有加载符号,因此错过了我的断点。 如果我将“周期初始中断”设置为打开,那么只要windbg连接,它将打破并加载我的符号,然后我按f5继续,然后如果我的断点被击中,它会停止。 但重点是自动化,我不想坐在那里,每次testing机器重新启动时打f5。 有没有办法强制windbg加载连接符号,即使它还没有停止?

GFlags设置捕捉堆损坏(页面堆除外)?

在一个生产站点,我们的应用程序(*)反复崩溃,但不可重复。 分析崩溃转储清楚地表明,这是一个堆腐败:崩溃是在不同的位置,但总是访问ntdll!RtlpLowFragHeapFree kernel32!HeapFree / ntdll!RtlpLowFragHeapFree 。 赢得Dbg !analyze -v也报告堆腐败。 我们迄今为止所尝试的是使用GFlags选项Page Heap来运行应用程序。 问题是页堆的内存开销是这样的,应用程序将不再运行(达到32位进程的虚拟内存限制)。 所以, 我们不能使用Page Heap 。 哪些其他的标志将是有用的添加,以便我们要么 在腐败网站发生崩溃 或者至less可以从崩溃转储中获得更多的信息,这些崩溃转储最终将在我们在HeapFree崩溃时生成? 我们正在尝试标志: 启用堆标记 启用堆尾检查 希望下一次故障转储能够包含更多的错误信息。 我考虑过这些标志,但是现在就把它们留下了: 启用堆参数检查 …当系统每次调用堆函数时,我都会期待一些开销 启用堆检查 …不知道这是否真的会给我买东西 在通话中启用堆validation …即使文档警告高开销 我(也)有一个问题是,我不确定这些标志如何帮助发生内存损坏。 页面堆显然会产生访问冲突,当一些东西写入到警卫页面,但其他标志如何操作? 我是否必须使用Application Verifier来运行这些其他标志的帮助? 或者当检查代码检测到什么时会引发exception? 这些标志的哪个组合最有意义,这样应用程序仍然可以在生产中正常运行并消耗内存。 (*):这是工业自动化中的32位Windows桌面应用程序。 在这种情况下运行在Win7 64bit(它在很多其他站点上都可以正常运行)。

为什么windbg命令开始。 要么 !

有什么区别吗? 和! ?

如何获取Windows上的线程堆栈信息?

我通过CreateToolhelp32Snapshot函数枚举进程中的所有线程。 我想为每个线程获取一些基本的堆栈信息。 更具体地说,我想获得堆栈底部地址,如果可能的话,我想获得当前的堆栈顶部地址。 基本上这是在WinDbg中用~*k命令显示的信息。 那么我怎样才能从线程的ID或HANDLE中获取堆栈信息呢?

WinDBG适用于从Visual Studio 2015中保存的转储,但不是任务pipe理器。 显示exception代码“找不到”

我无法使用任务pipe理器(32位或64位)或Process Explorer创build转储文件,以便在WinDBG或Visual Studio 2015中提供有用的结果,而直接从VS编写的转储在两者中都非常出色。 我需要任务pipe理器转储工作,以便我可以分析我的最终用户发送的转储文件。 我已经将问题简化为在VS 2015 C ++中创build的最简单的可能的Win32应用程序,并且故意写入NULL指针以引发exception。 如果我在VS中运行程序并使用Save Dump As,当发生exception时,可以在VS和WinDBG中使用转储文件来查看导致问题的代码。 这是预期的。 但是,如果我在VS之外运行应用程序,那么Windows将显示通常的对话框: “Win32Project.exe已停止工作…debugging/closures程序”。 虽然这个对话框仍然活跃,我去任务pipe理器32位,并select创build转储文件。 但是将这个转储文件加载到VS或者WinDBG中并没有提供有用的信息。 特别是VS显示exception代码为“未find”。 点击“仅使用本地debugging”会导致“应用程序处于中断模式”。 见下文… 我正在运行一个新的Win 10 64位PC。 DMP,PDB和EXE文件在同一个目录下,我已经无休止地尝试了符号目录 加载.DMP文件后的Visual Studio 2015输出: Dump Summary ———— Dump File: Win32Project1 (4).DMP : C:\Users\Rob\AppData\Local\Temp\Win32Project1 (4).DMP Last Write Time: 24/08/2017 16:38:27 Process Name: Win32Project1.exe : C:\Temp\ConsoleAp2\Win32Project2\Debug\Win32Project1.exe Process Architecture: x86 Exception Code: not found Exception […]