WinDbg中的“中断指令异常”是什么?
当你在分析一些dmp文件时,可能会发现下面的异常信息:
0:000> .exr -1ExceptionAddress:00000000ExceptionCode:80000003(Break instruction exception)
ExceptionFlags:00000000NumberParameters:0
如何查看当前加载的SOS.dll版本?
要查看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
关于 CLR 内核异常----COR_E_NEWER_RUNTIME(0x8013101B)
简介
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.
CLR 运行时版本和错误0x80131700和0x80113101B
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"