天道酬勤,学无止境

我已经在windbg 中设置了符号路径,但是为什么每次windbg 都会为同一个exe 下载相同的符号?(I've set symbol path in windbg, but why each time windbg downloads same symbol for same exe?)

问题

我使用windbg.exe 来调试同一个exe。 每次windbg加载这个exe时,都会花一分钟的时间来下载符号。 在windbg窗口的左下角,它显示““正在下载符号[winnt.dll]...”。

我已经多次看到这个。 我已经设置了我的符号路径,其中一行是:

************* Symbol Path validation summary **************
Deferred SRV*D:\SymCache\Microsoft*http://msdl.microsoft.com/download/symbols

这对我来说很奇怪,只要我设置了microsoft下载URL和本地缓存目录,为什么每次打开windbg加载相同的exe时,windbg都会下载相同的winnt.dll.....?

谢谢。

回答1

WinDbg 不会再次下载符号,但会尝试再次下载上次未找到的文件。

在我的示例中,我已经下载了符号,它获取了hal.dllkdcom.dllntkrnlmp.pdbntoskrnl.exe

再次执行.reload ,它再次寻找halaacpi.dll 。 使用 Wireshark 监控流量,您可以看到:

请注意每个请求 8 秒以上的疯狂 HTTP 往返时间,所以花了 66 秒才发现没有任何东西可以下载。 另请参阅:WinDbg 是否应该如此缓慢?

回答2

如果 pdb 在本地缓存中 symsrv 从那里下载它否则它从符号服务器本地缓存下载也可以是映射的网络驱动器当您在虚拟机中调试时主机中的共享文件夹等 diwnloading 是一个术语,它正在获取来自某处的符号可能是内部或外部 vize file://。 或 http://

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何设置Windows符号服务器(How to get a Windows symbol server set up)
    问题 我在网络上有一个备用服务器,希望托管我们所有的构建符号。 我已经知道如何在本地开发系统上设置符号缓存,并将调试器(例如Windbg)指向“符号文件路径”中的该路径。 我以为我可以对网络上具有自己的符号缓存(例如\\ host \ symbols)的另一个系统执行相同的操作。 我在目录中设置了服务器并启用了文件共享,因此可以通过Windows资源管理器远程访问它。 但是,当我尝试在WinDbg中指向它时,它似乎没有在其中拾取符号。 符号文件路径的设置如下: srv*\\192.168.1.20\symbolpath*http://msdl.microsoft.com/download/symbols 似乎我没有在服务器上正确配置它-是否可能缺少我要执行的步骤? 回答1 设置符号服务器和/或符号网络共享时需要了解几件事。 WinDbg符号加载顺序 在符号路径中从头到尾搜索符号,即在符号路径C:\a;C:\b ,它将首先在C:\a查找,然后在C:\b查找。 尽管这并不重要,但它会对性能产生很大影响。 如果您有自己的符号,请始终将其放在第一位,以便将HTTP往返行程保存到Microsoft服务器。 符号存储类型 共有三种符号存储类型: 本地存储(磁盘上的目录) 服务器存储(网络共享) 符号服务器/ HTTP存储(带有HTTP URL) 符号存储层 您可以使用三种类型的符号存储
  • 为什么Minidumps不能提供良好的调用堆栈?(Why don't Minidumps give good call stacks?)
    问题 这些年来,我在许多游戏项目中都使用了小型转储,它们似乎有50%的机会拥有有效的调用堆栈。 我该怎么做才能使它们具有更好的调用堆栈? 我尝试将最新的dbghelp.dll放在exe目录中。 这似乎有所帮助。 Visual Studio 2008或2010更好吗? (我仍在使用VS 2005)。 我使用的代码看起来像此示例。 回答1 要提高转储中调用堆栈的准确性,您可以做的一件事是使用Visual Studio以外的调试器-具体来说,请使用WinDbg或使用dbgeng.dll中提供的“ Windows Debugger”调试引擎的另一种工具(相对于此) (Visual Studio使用的“ Visual Studio Debugger”调试引擎)。 根据我们的经验,WinDbg从相同的转储中生成良好的调用堆栈是100%可靠的,而转储在这些转储中Visual Studio会生成不可用或非常不准确的调用堆栈。 据我所知,如果未处理的异常是崩溃的根源,WinDbg会自动执行重新构造/恢复异常调用栈的棘手过程,但Visual Studio不会(或不能?)。 两种调试器使用不同的启发式方法来解释堆栈 首先,WinDbg可能令人生畏,因此,这是我的快速指南,介绍如何使它更容易甚至避免直接使用它。 提取良好的调用栈的纯粹的凡人指南 这些从“最快/最容易”到“最慢/最难以解释”进行排序。
  • 如何在WinDbg中设置符号?(How to set up symbols in WinDbg?)
    问题 我正在使用Windows调试工具,并且在启动WinDbg / cdb或ntsd时收到以下错误消息: Symbol search path is: *** Invalid *** **************************************************************************** * Symbol loading may be unreliable without a symbol search path. * * Use .symfix to have the debugger choose a symbol path. * * After setting your symbol path, use .reload to refresh symbol locations. * **************************************************************************** 当执行任意命令时,我也会收到错误消息 *** ERROR: Module load completed but symbols could not be loaded for <module>.<ext> 与以下内容似乎相关: *************************************
  • 使用windbg在内核模式下调试时如何中断程序的入口点?(How to break on the entry point of a program when debug in kernel mode with windbg?)
    问题 我想在内核模式下调试一个程序,我想在程序的入口点中断,比如ollydbg 。 但是我不能用bp打破它,因为程序没有启动并且符号无法加载。 我找到了一些方法来做到这一点,但我认为它不是那么好。 1.中断内核中的CreateProcess函数。 但是我不知道我到底应该中断哪个函数,我认为CreateProcess和程序的入口点之间还有很长的路要走。 2.用cc更改程序的入口点。 但它需要其他工具,我应该更改字节变回的代码。 我觉得这很烦人。 3.在ollydbg的帮助下。 在用windbg调试的虚拟机中用ollydbg调试程序。 我不认为这是一个好主意。 4.使用sxe ld 。 它可以在<<Advanced Windows Debugging>> Listing 3.29中找到。 我试过了,但我发现它只适用于第一次。 而且我不知道休息后我到底应该做什么。 5.用bu中断入口函数。 但我也不知道我到底应该做什么。 例如,如何加载符号? 6.使用.create 。 我不知道按照我说的去做是否正确。 我认为在内核模式下使用windbg调试时在程序的入口点中断是一种常见的用法,而且我认为必须有一个使用强大的windbg的好方法来做到这一点。 最好的方法是什么? 顺便说一下,我想在内核模式下调试程序,因为我想获取程序的令牌值。 我发现windbg可以在用户模式下用
  • WinDbg 加载符号需要很长时间; 正在搜索大型网络 UNC 符号存储中的每个目录(WinDbg takes extremely long time to loading symbols; is searching every directory in large network UNC symbol store)
    问题 在使用 WinDbg 调试故障转储时,我花了几天时间试图加快符号的加载,但我无法解决某个特定问题。 问题是当转储中模块的符号不存在于任何可访问的符号存储或符号服务器位置时(例如,它是没有可用符号的第三方模块),WinDbg 将花费数小时寻找它们。 我已经正确设置了符号路径以正确设置搜索顺序和缓存目录: .sympath cache*C:\SymbolCache1;\\our.corp\SymbolStore;SRV*C:\SymbolCache2*http://msdl.microsoft.com/download/symbols 运行!sym noisy和.reload /f我可以看到: SYMSRV: Notifies the client application that a proxy has been detected. SYMSRV: Connecting to the Server: http://msdl.microsoft.com/download/symbols. SYMSRV: Successfully connected to the Server. SYMSRV: Sending the information request to the server. SYMSRV: Successfully sent the information
  • 如何在WinDbg中启动时使“ .cmdtree”窗口停靠?(How do I make a '.cmdtree' window dock at startup in WinDbg?)
    问题 我一直关注Tess Ferrandez的博客,以在WinDbg中设置自定义主题。 我也已经开始使用-c“ .cmdtree c:\ mycmdtree.txt”自动启动WinDbg。 这可以正确打开我的cmdtree文件作为命令窗口,但是我无法使其正确停靠。 问题似乎在于,只有在打开DMP文件后才能打开“命令”窗口,但是打开DMP文件会将您从“基本”工作区中移出,因此不会保存对工作区的任何更改。 有任何想法吗? 回答1 这个简单的请求变得非常复杂。 WinDbg的窗口位置保存在工作区中。 WinDbg有几个默认工作区: 基本-这是开始调试之前使用的工作空间(没有打开转储,没有打开exe,没有附加任何内容) 每个转储文件-对于您打开的每个转储,您都有一个用于该文件的工作区每个可执行文件-针对您打开的每个可执行文件。 用户模式-在进行实时用户模式调试时使用内核模式-在进行内核模式调试时使用每个机器架构-1个用于x64、1个用于x86、1个用于IA64 远程-在进行远程调试时使用 对于任何给定类型的调试(即实时用户模式或事后分析分析),您通常最终都会遇到Base + Your调试类型的设置组合。 如果打开转储文件,则将获得BASE +每个转储文件。如果进行实时用户模式调试,则将获得BASE + User-mode。如果对实时x64计算机进行内核调试,则将获得BASE +
  • Windbg:psscor4 不起作用(Windbg: psscor4 doesn't work)
    问题 我搜索并尝试了很多东西,但无法让 psscor4 正常工作。 当我调用!threads 时,我总是得到 请求 ThreadStore 失败 我检查的内容如下: 我有一个为 X86 平台编译的 .NET 4 应用程序我使用的是 Windbg 版本 6.2.9200.16384,X86 版本我正在使用 Microsoft 提供的当前 psscor4,它可以正确加载。 我正在加载 X86 版本,所以应该没问题符号从 MS 符号服务器加载(命令.symfix+ ,然后.reload ) .cordll显示以下内容: CLR DLL 状态:已加载 DLL C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll 当我尝试将 SOS 与.loadby sos clr一起使用时,也会发生同样的情况有人有想法吗? 回答1 问题是您正在调试 .NET 4.5。 PSSCOR4 不适用于 .NET 4.5。 我还怀疑您在调试机器上运行 .NET 4.0,这会导致您的 SOS 也无法工作。 为了调试 .NET 4.5,您需要 .NET 4.5 SOS 和/或 SOSEX(适用于 .NET 2.0+ 的所有版本)。 回答2 我发现这个问题在以下任一情况下都会发生: 您正在针对进程 (!eeversion) 的 .NET
  • 调查内存泄漏(Investigating Memory Leak)
    问题 我们的应用程序中存在缓慢的内存泄漏,我已经尝试通过以下步骤来分析泄漏的原因: 在 GFlags 中启用用户模式堆栈跟踪数据库在 Windbg 中,键入以下命令: !heap -stat -h 1250000 (其中1250000是存在泄漏的堆的地址)在比较多个转储后,我看到大小为0xC的内存块随着时间的推移而增加,并且可能是泄漏的内存。 输入以下命令: !heap -flt sc给出这些分配的 UserPtr,最后: 在其中一些地址上键入!heap -p -a address总是会显示以下分配调用堆栈: 0:000> !heap -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
  • 可以让 WinDBG 在符号存储中找到 mscordacwks.dll 吗?(Can WinDBG be made to find mscordacwks.dll in the symbol store?)
    问题 问题 有很多手动方法可以让 WinDBG 在没有符号存储的情况下找到 mscordacwks.dll(将文件放在路径中的某处,将它放在与 windbg.exe 相同的文件夹中,将它放在我的 Framework\v 文件夹中,指定路径WinDBG 使用.cordll -lp c:\dacFolder等),但它们都只为我修复。 我需要为使用我的符号存储的每个人更普遍地修复它。 我能想到的可能解决方案是: WinDBG 可以使用 mscordacwks.dll 的子文件夹名称而不是 mscorwks.dll 的文件夹名称来检查符号存储。 SymStore.exe 将在 mscorwks.dll 的子文件夹名称下添加 mscordacwks.dll,以便 WinDBG 在查找时找到它。 问:这些事情中的任何一个都是可能的,还是有其他我没有想到的解决问题的方法? 背景 在分析 .NET 进程时,我遇到了(显然是常见的)问题,即 psscor2(和 sosex)在我的机器上找不到合适的 mscordacwks.dll。 WinDBG 中的错误是: Failed to load data access DLL, 0x80004005 Verify that 1) you have a recent build of the debugger (6.2.14 or newer) 2) the
  • 使用 symstore.exe 无法在 Windbg 或 Visual Studio 中加载用于小型转储的符号(Using symstore.exe cannot load symbols for minidump in Windbg or Visual Studio)
    问题 为了跟踪仅在 Windows 8 用户计算机上发生的 Qt 中的崩溃,我设置了一个本地符号服务器以用于调试崩溃转储。 首先,我使用以下标志集进行了完整构建: QMAKE_CFLAGS_RELEASE += -Zi QMAKE_CXXFLAGS_RELEASE += -Zi QMAKE_LFLAGS_RELEASE += /DEBUG /OPT:REF 并使用 Windows Installer 和 VS 部署项目构建了一个安装程序。 然后我运行了以下 symstore.exe 命令: C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64>symstore.exe add /r /f C:\builddir\*.* /s "C:\Users\Sam\symbols" /t "Application" /v "rev xxxx" /c "test add" 这在C:\Users\Sam\symbols创建了适当的 dll、exe 和 pdb 文件夹。 然后我在用户机器上安装并通过 Process Explorer 生成了一个 minidump 文件。 我尝试将转储加载到 Visual Studio 并将C:\Users\Sam\symbols到符号文件位置,但找不到与我的二进制文件匹配的符号。 然后我尝试将它加载到
  • 不推荐使用CreateProcessW吗?(Is CreateProcessW deprecated?)
    问题 我找不到确切的答案,所以我决定问一下。 我一直在阅读“ Inside Windows Debugging”,并在示例中告诉我在kernel32!Cre​​ateProcessW上设置一个断点。 但是在此之前,它使用.symfix debugger命令将调试器符号搜索路径设置为指向Microsoft在线符号服务器。 当我尝试设置断点时,出现错误,提示它无法解析功能(或类似功能)。 看起来像这样。 0:000> bp kernel32!CreateProcessW Couldn't resolve error at 'kernel32!CreateProcessW' 可能是因为下面的列表中没有“ kernel32!Cre​​ateProcessW”。 0:000> x kernel32!CreateProcess* 76b90cb9 KERNEL32!CreateProcessWithTokenW (void) 76b90d84 KERNEL32!CreateProcessAsUserW (void) 76b90d84 KERNEL32!CreateProcessWithLogonW (void) 76b4e225 KERNEL32!CreateProcessWStub = <no type information> 76b72e04 KERNEL32
  • 如何在Windows上调试Python的C扩展(How to debug C extensions for Python on Windows)
    问题 我在pyodbc中遇到段错误,想在Windows XP x86中对其进行调试。 但是,在线信息似乎主要以Linux为中心。 最好的方法是什么? 回答1 因此,我可以使用Visual Studio 2008成功解决我的问题。我大致遵循此处列出的步骤- http://www.velocityreviews.com/forums/t329214-debugging-python-extensions.html 还有一些解决方法的提示- 编译在MSVC上定义了调试的python模块 这是我针对可能遇到此问题的其他人的步骤版本。 如果还没有,请确保在VS中设置Python标头和libs目录一种。 转到工具>选项>项目和解决方案> VC ++目录。 确保分别将include和libs路径添加到Include和Library文件的路径。 (例如C:\Python27\include , C:\Python27\libs ) 转到您的Python包含文件夹(再次C:\Python27\include ,例如C:\Python27\include )并编辑pyconfig.h 。 注释掉# define Py_DEBUG并保存。 转到您的libs文件夹(如C:\Python27\libs ),并副本python27.lib 。 将副本命名为python27_d.lib 。 创建一个新项目。
  • 来自非托管代码的 System.AccessViolationException?(System.AccessViolationException from unmanaged code?)
    问题 我正在编写这个库,它通过将由托管代码使用的媒体基础框架在 C++/CLI 中实现一些基本的音频播放器功能。 我可以很好地播放音频、停止、暂停等。 对于不熟悉 Media Foundation 的任何人,媒体会话会发布您可以处理的通知事件。 这是通过使用 IMFAsyncCallback 对象在会话对象上调用 BeginGetEvent 来完成的。 IMFAsyncCallback 定义了您应该实现以处理事件的方法 Invoke(IMFAsyncResult)。 发生事件时,工作线程上的会话对象将调用 invoke 方法,并使用您可以查询事件信息的 IMFAsyncResult 对象。 该结果对象由事件线程创建并拥有。 在我的 Invoke 实现中,每当我尝试使用传递的 IMFAsyncResult 对象执行任何操作(包括仅调用 QueryInterface 或其他操作)时,我都会收到 System.AccessViolationException。 我实现了IMFAsyncCallback 的对象是在CRT 堆上分配的基本C++ 类(非托管),并且事件发布在会话对象拥有的线程上,该线程也分配在CRT 堆上。 什么可能导致此异常? 为什么我会从用普通旧 C++ 实现的代码中抛出 .NET 托管异常? 当您使用混合模式程序集时会发生这种情况吗? 回答1 捕获崩溃转储
  • WinDbg Dr. Watson minidump-需要最初为已安装版本构建的pdb / dll吗?(WinDbg Dr. Watson minidump - requires pdb/dll originally built for installed version?)
    问题 我有一个来自目标应用程序崩溃的mindmp文件。 是否可以为某个版本的软件重建dll / pdb文件,并使windbg正确加载符号? 我的问题是,我们的pdb文件仅保留用于主要版本(不幸的是)。 这是一个日常构建,可以重建自己的状态,但是我遇到了错误。 启用!sym noisyy:“图像头与内存图像头不匹配”。 DBGENG: C:\...\XXX.dll image header does not match memory image header. DBGENG: XXX.dll - Partial symbol image load missing image info DBGHELP: Module is not fully loaded into memory. DBGHELP: Searching for symbols using debugger-provided data. DBGHELP: C:\...\XXX.pdb - mismatched pdb 注意我已经用dll构建了pdb,它们来自相同的RELEASE目录(我应该在构建调试吗?) 这些是发行版本(因为发行版本安装在目标上并且崩溃了),我是否应该以某种方式使用调试版本dll来获取更多的符号信息? 回答1 以我的经验,可能不是。 如果您具有完全相同的构建目录,并且使用完全相同的编译器设置进行构建
  • 如何在小型转储中更改模块的校验和?(How can I change a module's checksum in a minidump?)
    问题 我编写(和销售)的软件在分发之前经过压缩和加密。 每次发布新版本时,我都会在压缩和加密之前保留所有 .map 文件和生成的二进制文件,包括 exe。 当它在客户端的机器上崩溃时,我会返回一个小型转储。 我在 Visual Studio 中打开这些小型转储并在那里探索它们。 通过在 .map 文件中搜索地址,我很好地利用了这些小型转储。 这通常会让我进入正确的代码区域,我通常可以推断发生崩溃的原因并修复它,但这非常耗时。 如果我可以在小型转储的调试中使用我从原始版本中保存的符号,那将会很有帮助。 我的问题是我收到有关无法找到正确符号的警告。 我的研究使我相信这是因为客户端计算机上 exe 的校验和与 Visual Studio 构建的 exe 的校验和不匹配。 我明白为什么,它已被压缩和加密。 当然校验和不匹配。 我想我可以手动编辑小型转储或更改已保存二进制文件的校验和以匹配可分发文件的校验和。 我更愿意操作存储的副本,这样我就不必修改进入的每个转储,但我会对两者都感到满意。 所以,我的问题是:我怎样才能找到这些校验和并找出我应该用什么替换它们? 作为辅助问题:有没有更好的方法? 回答1 在不知道您是如何压缩和加密二进制文件的情况下,我很难说得非常具体。 John Robbins 的这篇博文指出,可执行映像通过嵌入在可执行文件 PE 标头中的 GUID 与其 PDB 相关联。
  • 如何调试w3wp clr.dll错误(How to debug w3wp clr.dll error)
    问题 我的客户端在两个生产服务器上安装了ASP.NET应用程序(与NLB保持平衡,但这无关紧要)。 两台服务器每3-4小时崩溃一次,并显示以下事件查看器记录的错误: 错误的应用程序名称:w3wp.exe,版本:7.5.7601.17514,时间戳:0x4ce7afa2 故障模块名称:clr.dll,版本:4.0.30319.18034,时间戳:0x50b5a783 异常代码:0xc00000fd故障偏移量:0x000000000001a840 故障进程ID:0xd50 错误的应用程序开始时间:0x01ce97fe076d27b4 错误的应用程序路径:c:\ windows \ system32 \ inetsrv \ w3wp.exe 错误的模块路径:C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ clr.dll报告ID:e0c90a5f-0455-11e3-8f0e-005056891553 我不知道如何调试或从哪里开始。 当崩溃即将发生时,服务器处理器的使用率将跃升至100%并保持不变。 错误的进程是w3wp.exe。 我什至不确定我的代码是否正在生成错误。 是IIS 7.5。 任何指针将不胜感激。 回答1 看起来您有一个StackOverflow异常,它是由无限制的递归(函数反复调用自身等)引起的。
  • 如何解决 Windbg 上显示的此错误?(How to solve this error that is shown on Windbg?)
    问题 我已经加载了一个 .exe,它给出了这个错误: Microsoft (R) Windows Debugger Version 6.12.0002.633 X86 Copyright (c) Microsoft Corporation. All rights reserved. CommandLine: "C:\Users\Public\SoundLog\Code\Código Python\SoundLog\dist\SoundLog.exe" Symbol search path is: *** Invalid *** **************************************************************************** * Symbol loading may be unreliable without a symbol search path. * * Use .symfix to have the debugger choose a symbol path. * * After setting your symbol path, use .reload to refresh symbol locations. * *****************************************************
  • WinDbg,显示加载模块的符号服务器路径(即使符号没有加载)?(WinDbg, display Symbol Server paths of loaded modules (even if the symbols did not load)?)
    问题 有没有办法从 WinDbg 不使用 DbgEng API 来显示所有加载模块的符号服务器路径(即 PdbSig70 和 PdbAge)? 我知道 lml 为已加载符号的模块执行此操作。 我想知道未加载的符号的这些路径,以便诊断问题。 任何人都知道这是否可能而不必使用 DbgEng API? 编辑: 我也意识到你可以使用 !sym noisy 获取有关符号加载的错误消息。 虽然这确实有有用的输出,但它与我想要的其他输出交错,并不像“lml”那样简单明了 回答1 !sym noise 和 !sym quiet 可以为符号加载打开额外的输出,即: !sym noisy .reload <dll> X <some symbol in that DLL to cause a load> !sym quiet 当调试器尝试加载 PDB 时,您将看到它尝试加载的每条路径,以及是否未找到或拒绝 PDB。 回答2 据我所知,windbg 中没有现成的解决方案。 您的选择是编写一个漂亮的脚本或扩展,这取决于您在哪里最适合。 在windbg 中作为脚本非常可行。 您需要的信息在 PE 调试目录中进行了描述。 这是一个指向 c++ 示例代码的链接,其中详细介绍了提取有用信息(例如您的情况下的符号文件的名称)。 将它改编成windbg 脚本应该不会出汗。 这是另一个有用的指针,其中包含大量有关自动
  • 从Visual Studio使用Windbg(Using windbg from Visual Studio)
    问题 是否可以从Visual Studio命令窗口(在调试会话中)使用诸如!locks和.loadby sos mscorwks类的windbg命令? 我注意到我可以使用例如k来打印堆栈跟踪,所以我想知道是否有某种方法可以访问其他命令。 回答1 是的,您可以这样做。 将Visual Studio 2008附加到您的过程中以进行调试。 中断一些代码。 前往即时视窗输入!load sos 现在您可以自由使用任何windbg命令,例如!EEHeap,!DumpHeap 有一些条件。 您需要在项目属性中启用非托管代码调试。 通常在64位版本中,studio不支持此功能。 玩得开心。 回答2 Visual Studio 2012在“附加到进程”对话框中具有“ Windows用户模式调试器”传输。 这使您可以在立即窗口中使用windbg命令。 来源:在Visual Studio用户模式调试中使用WinDbg引擎 回答3 从Windows驱动程序开发工具包(WDK)8.0开始,Windows调试器已集成到Visual Studio中(请参阅调试环境)。 在Visual Studio安装的顶部安装WDK将使开发人员能够从“附加到进程”对话框中选择许多调试器,或在项目的“调试器”设置中设置调试引擎。 这已针对Visual Studio 2012和2013进行了验证。我阅读上面的MSDN链接的方式
  • 调试C#代码时出现符号问题(Symbol issue when debugging C# code)
    问题 我正在使用WinDbg从托管代码(C#,为Any CPU构建的控制台应用程序)中加载故障转储,并且在x64平台上创建了故障转储。 我正在x64平台上调试。 我已将相关的PDB文件放入符号路径。 但是WinDbg总是从一个陌生的文件夹中找到该符号。 这是一个示例(当我使用!sym noisy时): SYMSRV: c:\MySymbols\FooService.pdb\4311207E2E2D442CB7473828D2488F941\FooService.pdb not found 我的应用程序名为FooService.exe ,相关的PDB文件名为FooService.pdb 。 我将C:\MySymbols设置为符号路径,并将FooService.pdb复制到目录C:\MySymbols 。 但是,为什么WinDbg不在C:\MySymbols找到FooService.pdb ,而是从一个奇怪的子文件夹“ FooService.pdb \ 4311207E2E2D442CB7473828D2488F941”中找到? 在我的方案中,为了加载PDB符号文件,什么是最佳解决方案(我必须自己创建一个子文件夹FooService.pdb\4311207E2E2D442CB7473828D2488F941 )吗? 回答1 我相信路径的奇怪部分用于对符号缓存中的PDB进行版本控制。