查找并指定符号文件和源文件;指定符号加载行为、使用符号和源服务器上;加载符号自动或在要求。
说明 |
---|
在之前的 Visual Studio 版本与 2012 中,调试在远程计算机上的管理的代码需要符号文件还查找了远程计算机。 现在,这已经不成问题了。 所有符号文件必须本地计算机或位于 Visual Studio 选项 对话框的 调试 / 符号 页上指定的位置。 |
如果调试器搜索 .pdb 文件 | 符号文件的原因需要完全匹配可执行文件?|指定符号位置和加载行为 | 使用符号服务器以查找符号文件不在本地计算机 | 查找并加载符号,在调试时 | 设置符号文件的编译器选项
程序数据库 (.pdb) 文件,也称为符号文件,映射您在选件类、方法和其他代码的源文件创建对标识符用于您的项目生成可执行文件的标识符。 .pdb 文件映射还可以在源代码中的语句到可执行文件的执行命令。 调试器使用这些信息确定两个关键信息:在 Visual Studio IDE 和位置显示可执行终止时的源文件和行号,在设置断点时。 符号文件还包含源文件的原始位置,以及可选,可以将源文件检索从源服务器的位置。
在 Visual Studio 中调试 IDE 项目时,调试器在何处正确地知道找到 .pdb 文件和源文件您的代码。 如果要调试项目中的源代码之外的代码,如 windows 或第三方代码项目中调用,您必须可以选择指定该 .pdb 的位置 (和,外部代码的源文件),这些文件需要完全匹配可执行文件的生成。
如果调试器搜索 .pdb 文件
指定在 DLL 或可执行文件内的位置。
(默认情况下,因此,如果您生成了 DLL 或可执行文件在计算机中,链接器将关联的 .pdb 文件的完整路径和文件名。DLL 或可执行文件中。 看到调试器的第一个选定符号文件是否存在于指定在 DLL 或可执行文件内的位置。 此方法非常有用,因为您始终有符号可用于您的计算机上生成的。) 的代码
可能存在文件夹和 DLL 或可执行文件相同的 .pdb 文件。
任何本地符号缓存文件夹。
指定的任何网络、internet 或本地符号服务器和位置,如 microsoft 符号服务器,如果启用。
符号文件的原因需要完全匹配可执行文件?
调试器将加载与 .pdb 文件中创建的可执行文件的一 .pdb 文件,并且可执行文件编译时 (即该 .pdb 必须是原 PDB 或基元 .pdb 文件的副本)。 除了创建外部正确有效的代码,但是主要任务由于编译器用于生成速度进行了优化,实际布局可执行文件能够更改,即使代码自身没有变化。 有关更多信息,请参见 MSDN 博客文章为什么 Visual Studio 要求调试器符号文件须与同时生成的二进制文件完全匹配?
指定符号位置和加载行为
在调试中的项与 IDE 时,调试器会自动填充位于项目目录中的符号文件。 可以为基于、窗口或第三方组件指定替换搜索路径和符号服务器在 调试/符号 页与选项 对话框。 在 符号 页,还可以指定特定模块希望调试器将自动加载符号。也可以手动然后更改这些设置,当您有效地调试时。
打开调试/符号页
在 调试 菜单中,选择 选项。
在 选项 对话框中,选择 符号 在 调试 节点下。
指定符号服务器或搜索位置
选择文件夹 图标。 “符号文件(.pdb)位置”框中将显示可编辑的文本。
键入符号服务器或符号位置的 URL 或目录路径。 语句结束有助于找到正确的格式。
若要提高符号加载性能键入路径符号可以由 在此目录下缓存符号 框中的符号服务器复制本地目录的本地目录可将符号复制。
说明 不要放置符号缓存在一个受保护的文件夹 (例如 C:Windows 文件夹或其子文件夹。 而应使用可读写的文件夹。
指定符号加载行为
您可以指定要从 符号文件 (.pdb) 位置 框位置自动加载的文件中,在开始调试时。 在项目目录中的符号文件始终加载。
选择 除排除模块之外的所有模块 加载的所有模块的所有符号只不过您指定的那些何时选择 指定排除的模块 链接。
选择 仅指定的模块 选项并选择 指定模块 列出了符号文件要自动加载的模块。 其他模块的符号文件被忽略。
指定其他符号选项
您也可以选择在调试/常规页的以下选项与选项对话框:
启动时若无符号则发出警告(仅限本机)
选定后,如果您尝试对调试器没有其符号信息的程序进行调试,系统将显示警告对话框。
加载 DLL 导出
选定后,加载 DLL 导出表。 处理 Windows 消息、Windows 过程 (WindowProc)、COM 对象、封送或任何您不具有其符号的 DLL 时,DLL 导出表中的符号信息很有用。 读取 DLL 导出信息会占用一些系统开销。 因此,默认情况下此功能被禁用。
若要查看 DLL 导出表中的可用符号,请使用dumpbin /exports。 符号可用于任何 32 位系统 DLL。 通过阅读dumpbin /exports输出,可以查看到精确的函数名,包括非字母数字字符。 这对于在函数上设置断点很有用。 DLL 导出表中的函数名在调试器的其他位置似乎被截断了。 调用将按调用顺序列出,当前函数(嵌套最深的函数)位于顶部。 有关更多信息,请参见 dumpbin /exports。
使用符号服务器以查找符号文件不在本地计算机
Visual Studio 能下载调试从实现 symsrv 协议的符号服务器下载符号文件。Visual Studio Team Foundation Server 和 windows 调试工具 可以实现符号服务器的两个工具。 在指定符号服务器用于 选项 对话框。
可供使用的符号服务器包括:
基于公共符号服务器
若要调试发生在调用系统 DLL 或第三方库的故障,通常需要系统 .pdb 文件,包含 windows DLL、EXE 和设备驱动程序的符号。 可以从 microsoft 公共 sysmbol 服务器的这些符号。 除了 MDAC、IIS、ISA 和 .NET Framework外,基于公共符号服务器为 windows 操作系统提供符号。
若要使用 microsoft 符号服务器,请选择在 调试 菜单的 选项和设置 然后选择 符号。 选择 Microsoft 符号服务器。
符号服务器在一个内部网络或在本地计算机
您的团队或公司可以创建符号服务器产品的和作为符号的一个缓存从外部源。您可能仅有符号服务器处理。 可以输入符号服务器的位置作为 URL 或作为 调试/符号 页的路径与 选项对话框。
第三方符号服务器
windows 应用程序和库第三方提供程序在 internet 可提供对符号服务器。 还输入这些符号服务器 URL。调试/符号 页的,
说明 |
---|
如果使用 Microsoft 公共符号服务器以外的符号服务器,请确保该符号服务器及其路径是可信任的。 由于符号文件可以包含任意可执行代码,可以会面临安全威胁。 |
查找和加载符号,在调试时
随时调试器处于中断模式下,可以由调试器选项以前排除或编译器无法找到的模块的符号。 可以从调用堆栈的快捷菜单,模块,本地,汽车加载符号,因此,所有注意窗口。 如果调试器在没有符号或可用的源文件中的代码中断,文档窗口显示。 可以找到有关缺少文件的信息并执行相应找到并加载它们。
带有已加载的无符号的查找符号文档页
具有调试器的许多方法可以将没有可用的符号的代码:
单步执行代码。
将从断点或异常的代码。
切换到其他线程。
更改堆栈帧通过双击"调用堆栈"窗口的一个帧。
当这些事件之一时,调试器显示 未加载符号 页帮助您查找和加载必要的符号。
更改搜索路径,选择未选择的路径或选择 新建 然后输入新路径。 如果找到,选择 加载 再次搜索路径和加载符号文件。
选择 浏览并查找executable-name... 重写任何符号选项并再次尝试搜索路径。 符号文件加载,如果找到,或文件资源管理器中显示为可以手动选择符号文件。
选择 更改符号设置 ... 显示 调试 / 符号 页与选项对话框。
选择 查看反汇编 显示该反汇编在新窗口时间。
始终显示该反汇编,当未找到源时或符号文件,请选择 选项”对话框 链接,然后选择 启用地址层位调试 和 显示反汇编,如果不可用的源。
从快捷菜单更改符号选项
当您处于中断模式时,可以找到,将加载在调用堆栈上显示的项,模块、本地,汽车和所有符号请注意窗口。 在窗口中选择一个项目,打开快捷菜单,然后选择以下选项之一:
选项 | 描述 |
---|---|
加载符号 | 尝试从在 选项 对话框的 调试 / 符号 页上指定的位置加载符号。 如果无法找到符号文件,资源管理器生成,以便您能够指定新位置搜索。 |
符号加载信息 | 存在信息显示所加载的符号文件的位置或要搜索的位置,如果调试器无法找到文件。 |
符号设置... | 打开 调试 / 符号 页与 选项 对话框。 |
始终自动加载 | 添加符号文件添加到由调试器自动填充文件的列表。 |
设置符号文件的编译器选项
当您生成项目从与 IDE 并使用标准 调试 生成配置时,C++ 和托管编译器创建编码的相应的符号文件。 还可以在命令行上设置编译器选项创建符号文件。
C++ 选项
程序数据库 (.pdb) 文件保存着调试和项目允许增量链接程序的调试配置的状态信息。 .pdb 文件后,在使用 /ZI 或 /Zi 生成时 (对于 C/C++)。
在 Visual C++,/Fd 选项命名编译器创建的 .pdb 文件。 使用向导时,在 Visual Studio 创建项目,/Fd 选项设置创建名为 project.pdb 的.pdb 文件。
使用生成文件,如果您生成 C/C++ 应用程序,并且,如果您指定 /ZI 或 /Zi,而无需 /Fd,则最终获得两个 .pdb 文件:
VCX.PDB,其中 x 表示 Visual C++ 的版本,例如 VC11.pdb。 该文件存储各个 OBJ 文件的所有调试信息并与项目生成文件驻留在同一个目录中。
project.pdb 该文件存储 .exe 文件的所有调试信息。 对于 C/C++,它驻留在 debug 子目录中。
每当创建 OBJ 文件,C/C++ 编译器将调试信息合并到 VCX.PDB。 插入的信息包括类型信息,但不包括函数定义等符号信息。 因此,即使每个源文件包括常用标头文件 <(如 windows.h,从>这些标头的 typedef 一次只存储,而不是在各个 OBJ 文件。
链接器创建 project.pdb,包含项目的 EXE 文件的调试信息。 project.pdb 文件包含完整的调试信息,包括函数原型,而不仅仅是该类型在 VC 中的信息x.pdb)。 两 .pdb 文件允许增量更新。 链接器还在其创建的 .exe 或 .dll 文件中嵌入 .pdb 文件的路径。
Visual Studio 调试器使用 .pdb 文件的路径。在 EXE 或 DLL 文件中查找 project.pdb 文件。 如果调试器在该位置找到 .pdb 文件,或者路径无效 (例如,在中,如果项目被移动到另一台计算机上),调试器将搜索包含 EXE,符号路径的路径指定在 选项 对话框 (调试 文件夹,符号 节点)。 调试器不会加载不与所调试的可执行文件的 .pdb 文件。 如果调试器无法找到 .pdb 文件,查找符号 出现对话框,允许您搜索符号或添加其他位置到搜索路径中。
.NET Framework 选项
程序数据库 (.pdb) 文件保存着调试和项目允许增量链接程序的调试配置的状态信息。 在使用 /debug时,生成 .pdb 文件中创建。 可以使用 /debug:full 或/debug:pdbonly 生成应用程序。 使用 /debug:full 生成将产生可调试的代码。 通知 JIT 编译器有可用的调试信息与 /debug:pdbonly 生成生成 .pdb 文件,但不会生成DebuggableAttribute。 请使用 /debug:pdbonly,如果您想为不希望可调试的版本生成的 .pdb 文件。 有关更多信息,请参见 /debug (C# 编译器选项)或 /debug (Visual Basic)。
Visual Studio 调试器使用 .pdb 文件的路径。在 EXE 或 DLL 文件中查找 project.pdb 文件。 如果调试器在该位置找到 .pdb 文件,或者,如果路径无效,调试器将搜索包含 EXE 的路径,然后在 选项 对话框中指定的符号路径。 该路径通常是“符号”节点中的“调试”文件夹。 调试器不会加载不与所调试的可执行文件的 .pdb 文件。 如果调试器无法找到 .pdb 文件,查找符号 出现对话框,允许您搜索符号或添加其他位置到搜索路径中。
Web 应用程序
一定要把您的应用程序配置文件 (Web.config) 设为调试模式。 调试模式会导致 ASP.NET 生成动态生成的文件的符号并使调试器附加到 ASP.NET 应用程序。 使用自动设置此属性,并在开始调试时,因此,如果创建了从 Web 项目模板的项目。
如果调试器搜索源文件
调试器在以下位置查找源文件:
在 Visual Studio 中打开实例 IDE 启动调试器的文件。
在打开的与实例的解决方案的文件。
在解决方案的属性的 通用属性 / 调试源文件 页上指定的内容。
模块的 .pdb 的源信息。 这可能是源文件的位置,当模块生成的,也可以是命令到源服务器。
在没有源/无符号加载的页查找并加载源文件
当调试器在源文件不可用的位置中断执行,它将显示可帮助您查找源文件的 未加载的源 或 未加载符号 页。 未加载符号 显示调试器无法找到可执行文件中的符号 (.pdb) 文件中完成其搜索。 符号页不提供选项搜索文件。 如果该 .pdb 找到,在执行后的某个选项使用在符号文件,的信息,并且调试器可以检索源文件,源显示。 否则,描述问题的 未加载的源 页。 可以执行操作可能解决问题的页显示选项链接。
添加源文件搜索路径添加到解决方案
您可以指定网络或本地目录搜索源文件。
在解决方案资源管理器中选择解决方案从快捷菜单中选择 属性。
在 通用属性 节点下,选择 调试源文件。
单击文件夹 图标。 显示可编辑的文本 包含源代码的目录 列表。
添加要搜索的路径。
请注意只所指定的目录下搜索。 必须添加要搜索的所有子目录中的项。
使用源服务器
当本地计算机上没有源代码或 .pdb 文件与源代码不匹配,您可以使用源服务器帮助调试应用程序。 源服务器接受文件请求并返回实际的文件。 源服务器通过名为 srcsrv.dll 的 DLL 文件运行。 源服务器读取应用程序中使用的 .pdb 文件,该文件包含指向源代码储存库,以及命令从储存库检索源代码。 可以限制哪些命令允许从应用程序的 .pdb 文件执行通过列表在名为 srcsrv.ini 的文件内允许的命令,在内容必须与 srcsrv.dll 和 devenv.exe 相同。
安全说明 |
---|
任何命令在应用程序的 .pdb 文件中嵌入,因此,请确保放入 srcsrv.ini 文件若要执行的只有一个。 任何尝试执行不在 srcsvr.ini 文件中的命令都将导致出现一个确认对话框。 有关详细信息,请参阅 安全警告:调试器必须执行不受信任的命令。 未对命令参数执行任何验证,因此请慎用受信任的命令。 例如,如果您信任 cmd.exe,恶意用户则可能会指定使该命令变得危险的参数。 |
允许使用源服务器
确保您在编译时采用了上一节中介绍的安全措施。
在“工具”菜单上选择“选项”。
此时将出现“选项”对话框。
在 调试 节点,选择 常规。
选择“启用源服务器支持”复选框。
(可选) 选择所需的子选项。
请注意 允许源服务器中的部分信任程序集 (仅限托管) 和 始终运行不受信任的源服务器命令,但不想提示可能会增加讨论的安全风险上面。
from:http://technet.microsoft.com/zh-cn/magazine/ms241613.aspx