wenmo8 发布的文章

要查看SOS.dll版本,必然是Windbg已经加载了该文件。在这个前提下输入下面的命令:

!eeversion

例如:

0:000> !eeversion
4.0.30319.36543 retail
Workstation mode
SOS Version: 4.0.30319.36543 retail build

0:000> !eeversion
4.8.4110.0 retail
Workstation mode
SOS Version: 4.8.4121.0 retail build

 

简介

COR_E_NEWER_RUNTIME,值为0x8013101B,代表的意思是"程序集是由比当前加载的运行时新的运行时生成的,因此无法加载。".它定义在cli-2.0-master\clr\src\inc\corerror.h文件里,如下:

#define COR_E_NEWER_RUNTIME             EMAKEHR(0x101B)     //The assembly is built by a runtime newer than the currently loaded runtime, and cannot be loaded.

COM可见的.Net对象由标准COM调用实例化,例如CoCreateInstance。COM在注册表或激活上下文中找到CLSID,加载并调用mscoree.dll,该dll继续激活CLR和创建对象的过程。在此过程中,可能会出现错误0x80131700“未能加载运行时”或0x8013101b“此程序集是由比当前加载的运行时更新的运行时生成的,无法加载”。
这两条消息都是运行时版本不匹配的结果。0x80131700并不一定意味着任何损坏,它只是意味着无法加载运行时。可能是因为未安装,或者未安装所需的版本。0x8013101b表示加载了运行时,但结果与继续处理所需的版本不匹配。
让我们考虑Manifest Maker附带的Visual Studio示例。这里的本机主机程序是cmdEXE.exe,.Net对象是在clrDLL.dll中实现的。在本例中,我们重建了项目,而没有在DLL中嵌入CLR清单。因此,我们在子文件夹clrDLL\clrDLL.DLL中有clrDLL.manifest文件和DLL。当我们现在执行“cmdEXE.exe clr”时,程序使用CoCreateInstance实例化clr对象:

clrDLL::IClrSampleClassPtr scp;
HRESULT hr
=scp.CreateInstance(__uuidof(clrDLL::ClrSampleClass), nullptr, CLSCTX_INPROC_SERVER);if (S_OK !=hr)
{
wprintf(L
"\nCLR class instantiation failed, hresult = 0x%08X\n", hr);returnhr;
}

保护总是好的,公司有两台符号服务器。其中一个已不再使用,但为以前发布的项目保留了符号。因为PDB文件和源代码一样重要,所以想知道是否有办法将符号服务器合并在一起。

由于符号服务器是用作数据库的文件系统,存储方案为\ServerShareFile.PDBGUIDFile.PDB,因此可以将资源管理器中的文件从一个符号服务器拖到另一个符号服务器。这并不理想,因为如果您正在积极地管理符号服务器来修剪死符号,那么那些通过拖放添加的符号将永远停留在那里。为了避免死符号问题,您只需要运行同一个命令,该命令使构建以SYMSTORE.EXE开始,SYMSTORE.EXE是Windows调试工具(也称为WinDBG)的一部分,可以作为Windows SDK的一部分安装。

symstore add /r /f \\Retiring\Share /s \\Combined\Share /t "Merging Symbol Servers"

 

 

DBGHELP.DLL中有一些文档化的WinDBG扩展命令,例如!sym and !dh,分别设置符号加载诊断和转储模块PE头。看到itoldyouso是小写的,我不禁怀疑它是否是一个未经文档化的WinDBG扩展命令。启动WinDBG并输入!itoldyouso,产生了以下结果:

0:000> !itoldyouso!IToldYouSo <module>[symbol]!IToldYouSo tests the validity of a module against a symbol file.
The module can be specified by either its name or base address.
If a symbol
file is not specified, thenthe loaded symbol is tested.
Otherwise,
if a pdb or dbg symbol filepath is specified, it is tested
against the loaded module.