Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3264|回复: 4
打印 上一主题 下一主题

已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。

[复制链接]

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
跳转到指定楼层
楼主
发表于 2020-1-18 18:20:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Qter 于 2020-1-18 21:53 编辑

问题描述

“smtpsend.exe”(Win32):  已加载“F:\github\chunhuitech\firemail\src\firemail_solution\Ext\libetpan\build-windows\x64\Debug\smtpsend.exe”。已加载符号。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\ntdll.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\kernel32.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\KernelBase.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“F:\github\chunhuitech\firemail\src\firemail_solution\Ext\libetpan\build-windows\x64\Debug\libetpan.dll”。已加载符号。
“smtpsend.exe”(Win32):  已加载“F:\github\chunhuitech\firemail\src\firemail_solution\Ext\libetpan\build-windows\x64\Debug\libsasl2.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“F:\github\chunhuitech\firemail\src\firemail_solution\Ext\libetpan\build-windows\x64\Debug\libeay32MD.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\ws2_32.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\msvcrt.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\rpcrt4.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\nsi.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\gdi32.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\user32.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\lpk.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\usp10.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\advapi32.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\sechost.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\crypt32.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\msasn1.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\msvcr120.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“F:\github\chunhuitech\firemail\src\firemail_solution\Ext\libetpan\build-windows\x64\Debug\zlib.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“F:\github\chunhuitech\firemail\src\firemail_solution\Ext\libetpan\build-windows\x64\Debug\ssleay32MDd.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“F:\github\chunhuitech\firemail\src\firemail_solution\Ext\libetpan\build-windows\x64\Debug\libeay32MDd.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\msvcr120d.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\imm32.dll”。无法查找或打开 PDB 文件。
“smtpsend.exe”(Win32):  已加载“C:\Windows\System32\msctf.dll”。无法查找或打开 PDB 文件。
程序“[3256] smtpsend.exe”已退出,返回值为 1 (0x1)。

解决办法:

1. 在VS2013的菜单栏,选择【工具】->【选项】。
2. 在选项窗口中,选择【调试】->【常规】,然后在右侧的窗口中勾选“启用源服务器支持”。
3. 在选项窗口中,选择【调试】->【符号】,然后在右侧的窗口中勾选“Microsoft符号服务器”。
4. 单击“本地Windows调试器”调试运行程序。
5. 在第一次运行程序时,会从Windows服务器上下载相关的符号集,因此需要等待一段时间。
只是第一次加载,不用担心。或者,你也可以等加载完了之后,再把之前勾选的取消掉,也没有问题。

利用缓存


找到这个目录下符号缓存,拷贝出来,找个地方存放。
最后再去掉Microsoft符号服务器,要是不去,每次都要从Microsoft下载很麻烦,已经缓存了,我们就可以利用好这些缓存,至此完美解决。

自己设置了目录还是默认目录下%UserProfile%\AppData\Local\Temp\SymbolCache,但都没找到有缓存文件 -----------要翻墙才能下载下来,可能下载不完整,也加载不成功!


———————————————
但上面方法并没有解决
[size=18.6667px]你只要选择不是调试的方式编程就可以:用ctrl+F5快捷就可以了
[size=18.6667px]






回复

使用道具 举报

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
沙发
 楼主| 发表于 2020-1-18 19:14:33 | 只看该作者
64位vs2017可以运行调试32位工程;

有些错误可能是因为IDE不同版本导致的,例如vs2005工程在vs2017上运行出现一系列错误。

vs里32位项目和64位项目的区别:

由于操作系统内存分配的不同,导致软件开发过程中,需要编译不同版本的软件。
1。编译程序根据需要选择不同的编译环境。
x86和win32为32位程序,x64为64位程序,可以选择不同的编译条件形成不同位的软件。
2。代码中的基本数据类型,会根据操作系统的位数来分类内存大小。
如int型在32位操作系统下为4字节,在64位系统下为8字节。
因此在64位上对int型数据操作,编译生成32位的程序,有可能导致int型越界,软件出现问题。
3。32位的程序在64位操作系统上运行,由于64位操作系统的寻址和偏移问题,也有可能导致程序在运行过程中,计算结果与32位系统不一致。
4。64位操作系统理论上能够箭筒32位和64位软件,32位操作系统不能运行64位程序。

在vs中,
x64:生成的程序只能在64位系统中运行。如果你的用户用的是32位的系统(比如XP),则运行不了程序。
x32:生成32位程序,由于64位系统也能运行32位的程序,所以这个选项跟Any CPU一样可以同时运行在两种系统中,但效率没有Any CPU高,因为64位的软件跟CPU交互的数据要比32位的接近大一倍。
所以当你要把项目代码转移到另一台计数机时,就要考虑这个问题。假如你原来选择的目标平台是x64,新电脑的系统是32位,当你按F5调试运行时,则跑不起来,这时把目标平台改成Any CPU或者x32就能解决了。

注意:如果你的项目引用有32位的dll(c++编译生成的),则只能选择32位平台,否则也会报错,整个项目要保持一致。

在项目调试的过程中,我们可以看到32位与64位程序加载的dll不同。

64位系统中 32位程序从C:\Windows\SysWOW64中加载dll;而64位程序从C:\Windows\System32中加载dll。


回复 支持 反对

使用道具 举报

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
板凳
 楼主| 发表于 2020-1-18 21:40:57 | 只看该作者
在 Visual Studio 调试器中指定符号 (.pdb) 和源文件
  • 2016/11/15
  • [color=var(--primary-base)]



[color=var(--info-dark)] 备注
本文适用于 Visual Studio 2015。 如果你正在寻找最新的 Visual Studio 文档,请在左上方使用版本选择器。 建议升级到 Visual Studio 2019。 [color=var(--info-dark)]在此处下载

程序数据库 (.pdb) 文件(也称为符号文件)将你在类、方法和其他代码的源文件中创建的标识符映射到在项目的已编译可执行文件中使用的标识符。 .pdb 文件还可以将源代码中的语句映射到可执行文件中的执行指令。 调试器使用此信息确定两个关键信息:显示在 Visual Studio IDE 中的源文件和行号,以及可执行文件中在设置断点时要停止的位置。 符号文件还包含源文件的原始位置以及(可选)源服务器的位置(可从中检索源文件)。
在 Visual Studio IDE 中调试项目时,调试器知道查找代码的 .pdb 和源文件的默认位置。 如果要在项目源代码之外调试代码(如项目调用的 Windows 或第三方代码),则你必须指定 .pdb(也可以是外部代码的源文件)的位置,这些文件需要与可执行文件完全匹配。
在 Visual Studio 2012 之前,在远程设备上调试托管的代码时,需要将符号文件放置在远程计算机上。 这种情况不会再出现。 所有符号文件必须位于本地计算机上或“工具”/“选项”/“调试”/“符号” 页中指定的位置。
调试器搜索 .pdb 文件的位置
  • 在 DLL 或可执行文件中指定的位置。
    (默认情况下,如果你在计算机上已生成 DLL 或可执行文件,则链接器会将关联的 .pdb 文件的完整路径和文件名放入 DLL 或可执行文件中。 调试器首先会检查在 DLL 或可执行文件内指定的位置中是否存在符号文件。 这很有帮助,因为你的计算机上始终有可供已编译代码使用的符号。)
  • 可存在于与 DLL 或可执行文件相同文件夹中的 .pdb 文件。
  • 所有本地符号缓存文件夹。
  • 在 Microsoft 符号服务器(如果启用)等上指定的任何网络、Internet 或本地符号服务器和位置。

为什么符号文件需要与可执行文件完全匹配?
调试器只会为可执行文件加载与该可执行文件生成之时所创建的 .pdb 文件完全匹配的 .pdb 文件(即该 .pdb 文件必须是原始 .pdb 文件或其副本)。 由于除了创建正确且高效的代码的主要任务之外,编译器的编译速度也得到了优化,因此可执行文件的实际布局可更改,即使代码本身未更改也是如此。 有关详细信息,请参阅 [color=var(--primary-base)]为什么 Visual Studio 要求调试器符号文件必须与同时生成的二进制文件完全匹配?
指定符号位置和加载行为
在 VS IDE 中调试项目时,调试器将自动加载位于项目目录中的符号文件。 可以在“工具”/“选项”/“调试”/“符号”中为 Microsoft、Windows 或第三方组件指定备选搜索路径和符号服务器。还可以指定希望调试器自动为其加载符号的模板。 之后,你可以在主动进行调试时手动更改这些设置。
  • 在 Visual Studio 中,打开“工具”/“选项”/“调试”/“符号” 页。
  • 选择 "文件夹。 “符号文件(.pdb)位置” 框中将显示可编辑的文本。
  • 键入符号服务器或符号位置的 URL 或目录路径。 语句结束有助于找到正确的格式。
  • 若要改进符号加载性能,请在路径中键入符号可由 “在此目录下缓存符号” 框中的符号服务器复制的本地目录,或可将符号复制到其中的本地目录。
    [color=var(--text)]
    [color=var(--info-dark)] 备注
    不要将符号缓存放入受保护文件夹(例如,C:\Windows 文件夹或其子文件夹之一)。 而应使用可读写的文件夹。

    指定符号加载行为
    你可指定开始调试时要从 “符号文件(.pdb)位置” 框位置自动加载的文件。 始终加载项目目录中的符号文件。
  • 选择 “除排除模块之外的所有模块” 来为所有模块(除了你在选择 “指定排除的模块” 链接时指定的模块之外)加载所有符号。
  • 选择 “仅指定的模块” 选项,然后选择 “指定模块” 来列出要自动加载其符号文件的模块。 其他模块的符号文件被忽略。
    指定其他符号选项
    还可以在“工具”/“选项”/“调试”/“符号” 页设置以下选项:
    如果启动时没有任何符号则发出警告(仅限本机)
    选定后,如果尝试调试在调试器中没有对应符号信息的程序,系统将显示警告对话框。
    加载 DLL 导出
    选定后,加载 DLL 导出表。 处理 Windows 消息、Windows 过程 (WindowProc)、COM 对象、封送或不具有其符号的任何 DLL 时,DLL 导出表中的符号信息将很有用。 读取 DLL 导出信息会占用一些系统开销。 因此,默认情况下此功能被禁用。
    若要查看 DLL 导出表中的可用符号,请使用 dumpbin /exports。 符号可用于任何 32 位系统 DLL。 从 dumpbin /exports 输出中,可以查看到精确的函数名,包括非字母数字字符。 这对于在函数上设置断点很有用。 DLL 导出表中的函数名在调试器的其他位置似乎被截断了。 调用将按调用顺序列出,当前函数(嵌套最深的函数)位于顶端。 有关详细信息,请参阅 [color=var(--primary-base)]dumpbin /exports

使用符号服务器查找不在你的本地计算机上的符号文件
Visual Studio 可从实现 symsrv 协议的符号服务器下载调试符号文件。 [color=var(--primary-base)]Visual Studio Team Foundation Server 和 [color=var(--primary-base)]Windows 调试工具 是可实现符号服务器的两个工具。 在 VS “选项” 对话框中指定要使用的符号服务器。
可供使用的符号服务器包括:
Microsoft 公共符号服务器
若要调试在调用系统 DLL 或第三方库时出现的故障,通常需要使用系统 .pdb 文件,这些文件包含表示 Windows DLL、EXE 以及设备驱动程序的符号。 你可从 Microsoft 公共符号服务器获取这些符号。 除了 MDAC、IIS、ISA 和 .NET Framework之外,Microsoft 公共符号服务器为 Windows 操作系统提供符号。
若要使用 Microsoft 符号服务器,请选择 “调试” 菜单上的 “选项和设置” ,然后选择 “符号” 。 选择 “Microsoft 符号服务器” 。
内部网络或本地计算机上的符号服务器
你的团队或公司可为你自己的产品创建符号服务器,并作为外部源符号的缓存。 你自己的计算机上可能具有符号服务器。 你可在 VS “选项” / “符号” / “符号” 。
第三方符号服务器
Windows 应用程序和库的第三方提供程序可提供对 Internet 上的符号服务器的访问。 你还可在 “选项” / “符号” 页上输入这些符号服务器的 URL。
[color=var(--info-dark)] 备注
如果使用 Microsoft 公共符号服务器以外的符号服务器,请确保该符号服务器及其路径是可信任的。 由于符号文件可以包含任意可执行代码,因此你可能面临安全威胁。

调试时查找并加载符号
只要调试器处于中断模式,你就可以为之前被调试器选项排除的或编译器无法找到的模块加载符号。 可以从调用堆栈窗口、模块窗口、局部变量窗口、自动窗口和所有监视窗口的快捷菜单中加载符号。 如果调试器在没有可用符号或源文件的代码中中断,则将显示一个文档窗口。 在此可以找到所缺文件的相关信息,并采取相应措施来查找并加载它们。
使用未加载任何符号的文档页查找符号
调试器可通过多种方式中断没有可用符号的代码:
  • 单步执行代码。
  • 通过断点或异常中断代码。
  • 切换到其他线程。
  • 通过在“调用堆栈”窗口中双击帧来更改堆栈帧。
    出现上述事件之一时,调试器将显示 “未加载任何符号” 页来帮助你查找和加载必需的符号。

  • 若要更改搜索路径,请选择未选定的路径或选择 “新建” ,然后输入新路径。 选择 “加载” 以再次搜索路径,并在找到符号文件时加载符号文件。
  • 选择“浏览并查找_executable-name_ ... ”重写任何符号选项并重试搜索路径。 如果找到符号文件,或显示了文件资源管理器供你手动选择符号文件,则加载符号文件。
  • 选择 “更改符号设置...” 可显示 VS“选项”对话框的 “选项” / “符号” 页。
  • 选择 “查看反汇编” 可在新窗口中显示一次反汇编。
  • 若要在未找到源文件或符号文件的情况下始终显示反汇编,请选择 “选项” 对话框链接,然后选择 “启用地址级调试” 和 “源代码不可用时显示反汇编” 。
    从快捷菜单更改符号选项
    当你处于中断模式时,可查找并加载调用堆栈窗口、模块窗口、局部变量窗口、自动窗口和所有监视窗口中显示的项的符号。 在窗口中选择一个项,打开快捷菜单,然后选择下列选项之一:

选项
描述

加载符号
尝试从 “选项” / “符号” / “选项” 对话框中指定要使用的符号服务器。 如果无法找到符号文件,则将启动文件资源管理器,以便你能够指定要搜索的新位置。

符号加载信息
显示已加载符号文件的位置或调试器无法查找文件时已搜索位置的信息。

符号设置...
打开 VS “选项” / “符号” / “选项” 对话框中指定要使用的符号服务器。

始终自动加载
将符号文件添加到由调试器自动加载的文件列表中。

为符号文件设置编译器选项
当你从 VS IDE 生成项目并使用标准 “调试” 生成配置时,C++ 和托管编译器将为你的代码创建相应的符号文件。 也可在命令行上设置编译器选项以创建符号文件。
C++ 选项
程序数据库 (.pdb) 文件保存调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。 使用 [color=var(--primary-base)]/ZI 或 /Zi (适用于 C/C++)生成时,将创建 .pdb 文件。
在 Visual C++中, [color=var(--primary-base)]/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 文件包含完整的调试信息(包括函数原型),而不仅仅是在 VCx.pdb 中找到的类型信息。 这两个 .pdb 文件都允许增量更新。 链接器还在其创建的 .exe 或 .dll 文件中嵌入 .pdb 文件的路径。
    Visual Studio 调试器使用 EXE 或 DLL 文件中的 .pdb 文件的路径查找 project.pdb 文件。 如果调试器在该位置无法找到 .pdb 文件或者路径无效(例如,如果项目已移至另一台计算机),则调试器将搜索包含 EXE 的路径以及在 “选项” 对话框( “调试” 文件夹, “符号” 节点)中指定的符号路径。 调试器将不会加载与所调试的可执行文件不匹配的 .pdb 文件。 如果调试器无法找到 .pdb 文件,则将显示 “查找符号” 对话框,这将允许你搜索符号或向搜索路径添加其他位置。
    .NET Framework 选项
    程序数据库 (.pdb) 文件保存调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。 使用 /debug进行生成时,将创建一个 .pdb 文件。 可以使用 /debug:full 或 /debug:pdbonly生成应用程序。 使用 /debug:full 进行生成可以生成可调试的代码。 使用 /debug:pdbonly 进行生成可以生成 .pdb 文件,但是不会生成通知 JIT 编译器调试信息可用的 DebuggableAttribute 。 如果想为不希望其成为可调试的发布版本生成 .pdb 文件,请使用 /debug:pdbonly 。 有关详细信息,请参阅 [color=var(--primary-base)]/debug (C# Compiler Options) 或 [color=var(--primary-base)]/debug (Visual Basic)
    Visual Studio 调试器使用 EXE 或 DLL 文件中的 .pdb 文件的路径查找 project.pdb 文件。 如果调试器无法在该位置找到.pdb 文件,或者该路径无效,调试器将先搜索包含 EXE 的路径,然后搜索 “选项” 对话框中指定的符号路径。 该路径通常是 “符号” 节点中的 “调试” 文件夹。 调试器将不会加载与所调试的可执行文件不匹配的 .pdb 文件。 如果调试器无法找到 .pdb 文件,则将显示 “查找符号” 对话框,这将允许你搜索符号或向搜索路径添加其他位置。
    Web 应用程序
    一定要把你的应用程序配置文件 (Web.config) 设为调试模式。 调试模式将导致 ASP.NET 为动态生成的文件生成符号,并允许调试器附加到 ASP.NET 应用程序。 如果项目是通过 Web 项目模板创建的,则 VS 会在你开始调试时自动完成此设置。

查找源文件调试器搜索源文件的位置
调试器在下列位置查找源文件:
  • 在启动调试器的 Visual Studio 实例的 IDE 中打开的文件。
  • 在 Visual Studio 实例中打开的解决方案中的文件。
  • 在解决方案的属性中的 “公共属性” / “调试源文件” 页中指定的目录。 (在“解决方案资源管理器”中,选择该解决方案节点,右键单击,然后选择“属性”。 )
  • 模块的 .pdb 的源信息。 这可能是生成模块时源文件的位置,也可能是源服务器的命令。

使用“无源”/“未加载任何符号”页查找并加载源文件
当调试器在源文件不可用的位置中断执行时,它将显示 “未加载任何源” 或 “未加载任何符号” 页,这些页可帮助你查找源文件。 当调试器无法找到可执行文件的符号 (.pdb) 文件来完成搜索时,将显示 “未加载任何符号” 。 “无符号”页将提供用于搜索文件的选项。 如果在执行选项之一后找到 .pdb,并且调试器可以使用符号文件中的信息检索源文件,则将显示源。 否则,将显示描述问题的 “未加载任何源” 页。 此页将显示选项链接,这些链接可执行可以解决问题的操作。
将源文件搜索路径添加到解决方案
你可指定网络或本地目录来搜索源文件。
  • 在解决方案资源管理器中选择解决方案,然后从快捷菜单中选择 “属性” 。
  • 在 “公共属性” 节点下,选择 “调试源文件” 。
  • 单击 "文件夹。 可编辑文本将显示在 “包含源代码的目录” 列表中。
  • 添加要搜索的路径。
    请注意,只搜索指定的目录。 你必须为要搜索的任何子目录添加项。

使用源服务器
如果本地计算机上没有源代码,或者 .pdb 文件与源代码不匹配,则可使用源服务器来帮助调试应用程序。 源服务器接受文件请求并返回实际的文件。 源服务器通过名为 srcsrv.dll 的 DLL 文件运行。 源服务器读取应用程序的 .pdb 文件,该文件包含指向源代码存储库的指针,以及用于从该存储库检索源代码的命令。 你可以限制允许从应用程序的 .pdb 文件执行的命令,方法是在名为 srcsrv.ini 的文件内列出允许的命令,该文件必须与 srcsrv.dll 和 devenv.exe 位于同一个目录中。
[color=var(--primary-dark)] 重要
任意命令都可嵌入应用程序的 .pdb 文件中,因此请确保在 srcsrv.ini 文件中仅放入要执行的命令。 任何尝试执行不在 srcsvr.ini 文件中的命令都将导致出现一个确认对话框。 有关更多信息,请参见 [color=var(--primary-dark)]Security Warning: Debugger Must Execute Untrusted Command。 未对命令参数执行任何验证,因此请慎用受信任的命令。 例如,如果你信任 cmd.exe,恶意用户则可能会指定使该命令变得危险的参数。

启用源服务器的使用
  • 确保你在编译时采用了上一节中介绍的安全措施。
  • 在 “工具” 菜单上,选择 “选项” 。
    这将显示 “选项” 对话框。
  • 在 “调试” 节点下,选择 “常规” 。
  • 选择 “启用源服务器支持” 复选框。
  • (可选)选择所需的子选项。
    请注意, “允许源服务器中的部分信任程序集(仅限托管)” 和 “始终运行不受信任的源服务器命令并且不再提示” 都会增大上述安全风险。


回复 支持 反对

使用道具 举报

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
地板
 楼主| 发表于 2020-1-19 00:37:59 | 只看该作者

说在前面:   微软符号服务器地址http://msdl.microsoft.com/download/symbols, 但是你手动在浏览器里面输入是访问不到的,他只提供给调试程序进行下载,可以用下面方法进行下载。

  方法1:  VS2003以后的版本,通过attach到一个进程中或者启动一个程序进行调试,然后打开模块列表窗口(主菜单-->调试--> 窗口--> 模块,或者按Ctrl+D,M直接打开),在列表中每一个模块进行右键,即可进行下载符号。

 方法2: 使用windbg进行下载,同样是attach或run一个程序,设置一下符号路径,然后使用 .reload 或者.reload /f /v ntoskrnl.exe  (这个试过好像不可以,具体请高手指出原因),当然也可以强制进行符号加载 使用  ld *  加载当前模块中所有的模块符号,或者 ld ntdll (加载指定模块)。

  方法3:  采用symchk.exe 来进行加载(优点:在不调用dl的情况就可对dll进行符号加载,防止dll符号文件遗漏加载的问题)。

  symchk /r c:\windows\system32 /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols

  这个的意思是对c:\windows\system32下的exe和dll进行递归加载符号,目前不太清楚,怎么指定只对特定文件进行单独加载符号文件,请高手指出。

  方法4: 自己写下载符号文件的程序(当然如果你对windows的整个调试机制比较熟悉,可以采用,但是个人觉得没那个必要,毕竟微软提供了工具让你使用了)。

建立 Symbols服务器
  最简单和方便的办法是使用网络共享路径,典型的,我们会在一台服务器上,依Symbols的类型建立多个路径:
  [url=]\\symbols_server\ReleaseSymbols[/url]
  [url=]\\symbols_server\TempSymbols[/url]
  [url=]\\symbols_server\WinSymbols[/url]
  ReleaseSymbols用于保存所有产品正式发布版本的symbols,这个目录中的pdb文件是不能删除的,
  TempSymbols用于保存非正式版本(例如测试阶段)的pdb文件,把它们分开保存,是因为pdb文件比较大,如果磁盘空间不够,就可以删除一些。
  WinSymbols用于存储各种windows版本系统本身的symbols。

  对于ReleaseSymbols和TempSymbols目录应该是可控的,即一般设置管理员可写,其它人只读,通常由管理员在编译机编译完后同时更新其pdb文件。WinSymbols可以设置所有人可读写。

设置调试器Symbols路径
  WinDBG、VC.Net及以上版本都可以通过设置环境变量指定Symbols路径,并都能根据环境变量设置自动去微软服务器拉取window系统symbols。右键我的电脑—〉“属性”—〉“高级”—〉“环境变量”—〉“系统变量”,新建两个环境变量:
  _NT_SYMBOL_PATH=srv*\\symbols_server\WinSymbols*http://msdl.microsoft.com/download/symbols
_NT_ALT_SYMBOL_PATH=cache*c:\symbols;\\symbols_server\ReleaseSymbols;\\symbols_server\TempSymbols;\\symbols_server\WinSymbols

  这样设置后,调试器首先会到_NT_ALT_SYMBOL_PATH指定的共享路径中去寻找pdb文件,并把找到的文件缓存到c:\symbols目录下,下次访问时就不用到共享目录中查找,这样可以提高速度。

  当在_NT_ALT_SYMBOL_PATH中找不到时会查看路径_NT_SYMBOL_PATH,接着自动从微软官方网站下载windows系统的pdb文件,并缓存到共享目录[url=]\\symbols_server\WinSymbols[/url]中,缓存的好处是当其它人下载相同pdb文件时就直接从共享目录拉取,不用再跳到微软网站拉取。

  注意设置以上变量后第一次使用Windbg或者VS调试时,因为要下载windows系统的pdb文件,可能要等待一段时间(Windbg会在命令行窗口右下角显示“BUSY”状态,但也有可能不显示状态,VS在状态栏会显示Loading symbols for XXX),并且pdb文件都相对比较大,视网速快慢可能要等待十几分钟到几个小时。另外在测试中发现,WinDbg下载symbols的速度比VS快得多。

  如果要经常使用VC.Net及以上版本,上面的设置会有些问题,因为如果有一些dll没有symbols,这时VS每次进入调试状态时都会试图到微软网站查找相应的pdb文件,导致启动调试的速度很慢。

  最好的方法是在windbg的菜单“File”->“Symbol File Path...”填入
  cache*c:\symbols;
  \\bobdeng-pc\ReleaseSymbols;
  \\bobdeng-pc\TempSymbols;
  \\bobdeng-pc\WinSymbols;srv*
  \\bobdeng-pc\WinSymbols*http://msdl.microsoft.com/download/symbols

  而对VS.Net及以上版本,在“Tools”—〉“Options”—〉“Bebugging”—〉“Symbols”面板中,逐一添加pdb路径
  [url=]\\bobdeng-pc\ReleaseSymbols[/url]
  [url=]\\bobdeng-pc\TempSymbols[/url]
  [url=]\\bobdeng-pc\WinSymbols[/url]
  在“Cache symbols from server...”中填入c:\symbols。
  然后仅仅在需要用VS打开dmp文件定位Crash时才添加Windows系统Symbols路径:http://msdl.microsoft.com/download/symbols,当调试完后可以去掉该项选中状态使其失效。

  或者使用symchk工具下载symbols,见后面《附注:手工下载windows symbols的方法》

配置pdb文件编译输出目录
  常常一个产品包含许多模块,为方便pdb管理,可以设置编译时统一输出symbol到一个的目录,例如Debug版本输出到pdbDebug,Release版本输出到pdb目录。在VC6.0下可以通过“工程属性”-〉“Link”-〉“Project Options”手工修改输出路径,VS.Net类似也可以指定输出目录。

同步PDB文件到Symbols服务器
  pdb文件同步可以使用windbg安装目录下的symstore.exe命令行工具,为方便操作,可以在pdb文件输出目录建立两个批处理文件,例如
新建批处理文件UpdateTemp.bat,用于同步该目录下所有的pdb文件到服务器共享目录[url=]\\symbols_server\TempSymbols[/url],内容如下:
"C:\Program Files\Debugging Tools for Windows (x86)\symstore.exe" add /r /f "./*.*" /s [url=]\\symbols_server\TempSymbols[/url] /t "MyProduct" /v "Temp"
@PAUSE
类似的,建立另一个批处理文件UpdateRelease.bat,同步pdb文件到服务器共享目录[url=]\\symbols_server\ReleaseSymbols[/url]

开发人员配置编译生成的本地symbols路径
  并非所有编译的pdb都同步到symbols服务器上,为方便开发者自己调试,还需要配置本机的pdb文件路径。

  对于windbg,可以在菜单“File”->“Symbol File Path...”填入编译时的pdb输出目录,多个目录用;隔开。

  使用VS时,在菜单“Tools”—〉“Options”—〉“Bebugging”—〉“Symbols”面板中填入编译时的pdb输出目录。


附注:手工下载windows symbols的方法
  如果不想等到调试时才下载,也可用通过windbg自带的symchk.exe工具下载windows系统的symbols,或者某个dmp文件所有相关模块的symbols,并且通过这个工具下载速度也会更快一些,具体方法如下:
1. 下载dmp文件所有相关模块的symbols,缓存到共享路径,便于其它人快速下载。
"C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" /id c:\MyApplication.dmp /s SRV*\\symbols_server\WinSymbols\*http://msdl.microsoft.com/download/symbols

2. 下载某个已运行进程所有相关模块的symbols,缓存到共享路径,便于其它人快速下载。
"C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" /ie qq.exe /s SRV*\\symbols_server\WinSymbols\*http://msdl.microsoft.com/download/symbols

3. 下载某个exe/dll文件对应的symbols,例如user32.dll,输入命令行:
"C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" c:\windows\system32\user32.dll /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols

4. 下载整个目录下(例如system32)所有模块的symbols:
"C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" /r c:\windows\system32\ /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols


回复 支持 反对

使用道具 举报

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
5#
 楼主| 发表于 2020-1-19 00:50:06 | 只看该作者
本帖最后由 Qter 于 2020-1-19 01:05 编辑

Windbg下载微软符号表1.      设置环境变量

_NT_SYMBOL_PATH

srv*c:\symbols*http://msdl.microsoft.com/download/symbols



2.      翻墙

发现不翻墙好像下载不了。



3.      发现有时候需要某个模块(dll或者exe)的pdb(pdb文件ida也能识别),不过windbg就是不自动下载。

这儿有两种下载方法:

1>    命令:

symchk tlntSess.exe

//下载tlntsess.pdb到c:\symbols目录下



2》     Windbg命令:

.reload /f tlntSess.exe



参考:

http://bbs.pediy.com/showthread.php?t=151058
———————————————
下载安装 http://www.firemail.wang:8088/fo ... thread&tid=9866




回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-3 18:28 , Processed in 0.074803 second(s), 21 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表