wenmo8 发布的文章

简介

STATUS_IN_PAGE_ERROR---页内故障,这是当Windows尝试从内存映射文件将数据读入RAM并发生阻止数据读取的I / O错误时发生的非常低级别的错误。当它发生在.exe时,如setup.exe程序,这是一个致命的错误,因为它无法执行无法读取的代码。表示0x%p处的指令引用了位于0x%p的内存。由于0x%x的I/O错误状态,未将所需数据放入内存。线程试图访问一个不存在的页面,并且系统无法加载页面。-即程序或内存映射文件无法调出,因为它不再可访问。设备如果读取出错,驱动程序可以返回此异常。其定义如下:

//
// MessageId: STATUS_IN_PAGE_ERROR
//
// MessageText:
//
// The instruction at 0x%p referenced memory at 0x%p. The required data was not placed into memory because of an I/O error status of 0x%x.
//
#define STATUS_IN_PAGE_ERROR             ((NTSTATUS)0xC0000006L)    // winnt

异常结构说明

ExceptionAddress: 03638c90 (libcef!v8::internal::CopyCharsUnsigned<unsigned char,unsigned short>+0x00000020)
   ExceptionCode: c0000006 (In-page I/O error)
  ExceptionFlags: 00000000
NumberParameters: 3
   Parameter[0]: 00000000
   Parameter[1]: 07b41828//IO操作失败的内存地址
   Parameter[2]: c000000e//具体IO操作错误
Inpage operation failed at 07b41828, due to I/O error c000000e

说明

应用程序有时从网络共享启动,一些客户在运行应用程序时报告了外部异常C0000006。根据我在谷歌的研究,这个“可能”与Image被调出和无法从网络重新加载有关。解决方法是通过设置IMAGE_FILE_NET_RUN_FROM_SWAP标志,告诉Windows将完整的映像文件加载到交换中并从那里运行它。我的应用程序还依赖于运行时加载的各种.bpl和.dll库。其中只有一部分可以由我更改,有些由其他供应商提供。如果exe设置了这个标志,这个库会发生什么?是否也加载到交换文件中,还是仍被调出并在需要时重新加载?我是否也需要在库中包含此标志?该标志仅适用于设置它的PE模块。因此,在EXE中设置标志并不意味着该EXE加载的模块会受到该标志的影响。由EXE加载的每个模块(DLL、包等)将由加载程序根据该模块中指定的PE选项进行处理。因此,您需要在网络共享上的每个模块上设置PE标志。

我还建议添加IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP。

 

COM方法通过返回HRESULT报告错误;.NET方法通过引发异常来报告错误。运行时处理两者之间的转换。.NET Framework中的每个异常类都映射到一个HRESULT。
用户定义的异常类可以指定任何适合的HRESULT。这些异常类可以通过在异常对象上设置HRESULT字段来动态更改生成异常时返回的HRESULT。有关异常的其他信息通过IErrorInfo接口提供给客户端,该接口在非托管进程的.NET对象上实现。如果创建一个扩展System.Exception,必须在构造期间设置HRESULT字段。否则,基类将分配HRESULT值。通过在异常的构造函数中提供值,可以将新的异常类映射到现有的HRESULT。

请注意,在线程上存在IErrorInfo的情况下,运行时有时会忽略HRESULT。在HRESULT和IErrorInfo不表示相同错误的情况下,可能会发生此行为。

尽管可以使用COMException类向非托管客户端返回特定的HRESULT,但引发特定的.NET Framework异常比使用泛型异常要好。考虑到托管客户端和非托管客户端都可以使用.NET Framework对象,向托管调用方抛出HRESULT比引发异常更难理解。

以下是对COMException异常进行故障排除的一些注意事项。

  1. 检查ErrorCode属性
    当运行时遇到不熟悉的HRESULT并引发COMException异常时,ErrorCode属性将包含错误消息,或者如果错误消息不可用,则包含八位数的HRESULT值。错误消息或HRESULT值可以帮助您确定异常的原因。
  2. 有关HRESULT值的列表,请参阅HRESULT值。
  3. 后期绑定参数和Microsoft Office对象
    当向Microsoft Office对象的方法传递后期绑定参数时,当对象是COM对象时,可能会引发COMException异常。后期绑定器假定此类方法调用涉及ByRef参数,并且传递的属性具有set访问器。如果属性不存在,则.NET Framework将生成MissingMethodException异常(CORE_E_MISSINGMETHOD HRESULT)。要解决此问题,请使用早期绑定对象或传递变量而不是对象的属性。
  4. visualstudio和宿主进程
    COM用于在visualstudio和宿主进程之间进行通信。因为它是在代码运行之前使用的,所以调用CoInitializeSecurity会引发此异常。在某些情况下,以管理员身份运行visualstudio可能会解决此问题。您也可以禁用托管进程。

当调用 StringBuilder.Insert 方法

尝试增加 StringBuilder 对象的长度超出其 StringBuilder.MaxCapacity 属性指定的大小。 下面的示例演示了在示例尝试插入将导致对象的 Length 属性超过其最大容量的字符串时,调用 StringBuilder.Insert(Int32, String, Int32) 方法所引发 OutOfMemoryException 异常。

usingSystem;usingSystem.Text;public classExample
{
public static voidMain()
{
StringBuilder sb
= new StringBuilder(15, 15);
sb.Append(
"Substring #1");try{
sb.Insert(
0, "Substring #2", 1);
}
catch(OutOfMemoryException e) {
Console.WriteLine(
"Out of Memory: {0}", e.Message);
}
}
}
//The example displays the following output://Out of Memory: Insufficient m

简介

RPC_NT_INVALID_STRING_BINDING即无效的字符串绑定,值为0xC0020001。其定义如下:

/
// MessageId: RPC_NT_INVALID_STRING_BINDING
//
// MessageText:
//
// The string binding is invalid.
//
#define RPC_NT_INVALID_STRING_BINDING    ((NTSTATUS)0xC0020001L)

说明

默认情况下,作为DLL创建的C++项目的托管扩展不链接到诸如C/C++运行库(CRT)库、ATL或MFC的本地C/C++库,不使用任何静态变量。此外,项目设置还指定应在启用/NOENTRY选项的情况下链接DLL。这样做是因为与入口点的链接会导致托管代码在DllMain期间运行,这是不安全的。没有入口点的DLL无法初始化静态变量,除非是非常简单的类型,例如整数。通常在/NOENTRY DLL中没有静态变量。ATL、MFC和CRT库都依赖于静态变量,因此如果不首先进行修改,也不能从这些DLL中使用这些库。如果混合模式DLL需要使用依赖于静态的静态或库(如ATL、MFC或CRT),则必须修改DLL,以便手动初始化静态。手动初始化的第一步是确保禁用自动初始化代码,这对于混合DLL是不安全的,并且可能导致死锁。要禁用初始化代码,请执行以下步骤。

某些DLL不与本机库链接,因此它们的DllMain不会初始化一些所需的本机子系统(如CRT或ATL)。一种推荐的解决方案是从托管DLL中删除入口点:
删除托管DLL的入口点

  1. 与/ NOENTRY联系。在解决方案资源管理器中,右键单击该项目
    单击节点,单击属性。在“属性页”对话框中,单击“确定”
    链接器,单击命令行,然后将此开关添加到
    附加选项字段。
  2. 链接msvcrt.lib。在“属性页”对话框中,单击“链接器”,
    单击输入。,然后将msvcrt.lib添加到其他依赖项
    属性。
  3. 删除nochkclr.obj。在“输入”页面(与上一步骤相同的页面)中,从“附加依赖项”属性中删除nochkclr.obj。
  4. CRT中的链接。在“输入”页面(与上一步骤相同的页面)中,将__DllMainCRTStartup @ 12添加到“强制符号引用”属性中。

异常结构信息

ExceptionAddress: 775d4402 (KERNELBASE!RaiseException+0x00000062)
   ExceptionCode: c0020001
  ExceptionFlags: 00000001
NumberParameters: 1
   Parameter[0]: 8007042b//真实错误码或进程退出码