wenmo8 发布的文章

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.

我经常在windbg中调试.netframeworkv2.0/v 4.0代码。在v 2.0中,主clr dll称为“mscorwks.dll”,在v 4.0中称为“clr.dll”。很多人都知道,要在v 2.0中加载sos,我们必须输入“.loadby sos mscorwks”,在v 4.0中输入“.loadby sos clr”。这对我来说是一种痛苦。提出了一个基于clr版本自动加载sos的脚本

!for_each_module .if(($sicmp( “@#ModuleName” , “mscorwks”) = 0) ) {.loadby sos mscorwks} .elsif ($sicmp( “@#ModuleName” , “clr”) = 0) {.loadby sos clr}

简介

ProcDump是一个命令行实用程序,其主要目的是监视应用程序的CPU峰值,并在峰值期间生成崩溃转储,管理员或开发人员可以使用该转储来确定峰值的原因。ProcDump还包括挂起窗口监视(使用与Windows和任务管理器使用的相同的窗口挂起定义)、未处理的异常监视,并且可以基于系统性能计数器的值生成转储。它还可以作为一个通用的进程转储实用程序,可以嵌入到其他脚本中。

使用ProcDump

procdump [-a] [[-c|-cl CPU usage]
[-u] [-s seconds]] [-n exceeds] [-e [1 [-b]] [-f <filter,...>]
[-g] [-h] [-l] [-m|-ml commit usage] [-ma | -mp] [-o] [-p|-pl
counter threshold] [-r] [-t] [-d <callback DLL>] [-64] <[-w] <process name or service name or PID>
[dump file] | -i <dump file> | -u | -x <dump file> <image file> [arguments] >] [-? [ -e]