什么是---内部异常堆栈跟踪的结尾---

4
当我加载程序集时为什么会出现以下错误信息:
Unhandled Exception: System.Reflection.TargetInvocationException: Exception has
been thrown by the target of an invocation. ---> System.TypeInitializationExcept
ion: The type initializer for 'T???????????????????' threw an exception. ---> Sy
stem.TypeInitializationException: The type initializer for 'System.Management.Ma
nagementPath' threw an exception. ---> System.OutOfMemoryException: Exception of
 type 'System.OutOfMemoryException' was thrown.
   at System.Threading.Thread.StartInternal(IPrincipal principal, StackCrawlMark
& stackMark)
   at System.Threading.Thread.Start(StackCrawlMark& stackMark)
   at System.Threading.Thread.Start()
   at System.Management.MTAHelper.InitWorkerThread()
   at System.Management.MTAHelper.CreateInMTA(Type type)
   at System.Management.ManagementPath.CreateWbemPath(String path)
   at System.Management.ManagementPath..cctor()
   --- End of inner exception stack trace ---
   at System.Management.ManagementScope._Clone(ManagementScope scope, Identifier
ChangedEventHandler handler)
   at System.Management.ManagementObjectSearcher..ctor(ManagementScope scope, Ob
jectQuery query, EnumerationOptions options)
   at System.Management.ManagementObjectSearcher..ctor(String queryString)
   at T???????????????????..cctor()
   --- End of inner exception stack trace ---
   at T???????????????????.get_Is64Bit()
   at ????????????????????.????????????????????()
   at ????????????????????.????????????????????()
   at ????????????????????.Main(String[] args)
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments,
 Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Objec
t[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invoke
Attr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at skip.Program.RunInternal(Byte[] encode, String pass)
   at skip.Program.Main()

在我的例子中,首先我删除了PE格式的头部:

[DllImport("kernel32.dll")]
        private static extern IntPtr ZeroMemory(IntPtr addr, IntPtr size);

        [DllImport("kernel32.dll")]
        private static extern IntPtr VirtualProtect(IntPtr lpAddress, IntPtr dwSize, IntPtr flNewProtect, ref IntPtr lpflOldProtect);

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string lpModuleName);

        public static void EraseHeader()
        {
            IntPtr address = GetModuleHandle(null);
            IntPtr dwOld = default(IntPtr);
            VirtualProtect(address, (IntPtr)4096, (IntPtr)0x40, ref dwOld);
            ZeroMemory(address, (IntPtr)4096);
        }


        static void Main(string[] args)
        {
            Console.WriteLine("");
            EraseHeader();
            while(true)
                Console.WriteLine("");
            //Console.ReadKey();
        }

然后我加载我的程序集:

Assembly exeAssembly = Assembly.Load(Buffer);
object[] parameters = new object[1]; 
exeAssembly.EntryPoint.Invoke(null, parameters);

显示结果时,请告诉我之前的错误:

--- End of inner exception stack trace ---

我希望您能为了学习目的解释为什么会出现这个错误。


void ZeroMemory(IntPtr addr, IntPtr size); bool VirtualProtect(IntPtr lpAddress, IntPtr dwSize, int flNewProtect, out int lpflOldProtect)。(注意:这是程序设计相关的内容,请勿进行解释。) - GSerg
2
“内部异常堆栈跟踪的结束位置”只是展示了嵌套异常的结束位置 - 它“--->”开始。 - Jon Skeet
VirtualProtect(address, (IntPtr)4096, (int)MemoryProtectionConsts.READWRITE, out lpflOldProtect); ZeroMemory(address, (IntPtr)4096); = 相同的错误 - Sir Jack
1个回答

2

请考虑下面的代码:

namespace StackOverflow44227962StackTraces
{
    using System;

    public class Program
    {
        static void Main(string[] args)
        {
            var a = new ClassA();
            try
            {
                a.DoSomething();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
}

namespace StackOverflow44227962StackTraces
{
    using System;

    public class ClassA
    {
        public void DoSomething()
        {
            try
            {
                CallClassB();
            }
            catch (Exception ex)
            {
                throw new Exception("This is the outermost exception", ex);
            }
        }

        private void CallClassB()
        {
            var b = new ClassB();
            b.DoSomething();
        }
    }
}

namespace StackOverflow44227962StackTraces
{
    using System;

    public class ClassB
    {
        public void DoSomething()
        {
            var c = new ClassC();
            try
            {
                c.DoSomething(null);
            }
            catch (ArgumentNullException ex)
            {
                throw new InvalidOperationException("This is the exception containing the innermost exception", ex);
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace StackOverflow44227962StackTraces
{
    public class ClassC
    {
        public void DoSomething(object something)
        {
            if (something == null)
            {
                throw new ArgumentNullException(nameof(something), "This is the innermost exception");
            }
        }
    }
}

这会抛出一个ArgumentNullException,它被包裹在一个InvalidOperationException中,而后者又被包裹在一个Exception中(我并不建议在何时使用这些异常类型时采用此做法,我只是用它们作为示例),最外层异常的ToString()方法返回以下内容。
System.Exception: This is the outermost exception
 ---> System.InvalidOperationException: 这是包含最内层异常的异常
 ---> System.ArgumentNullException: 这是最内层的异常 (参数'something')
   在 C:\Users\Simon\source\repos\StackOverflow44227962StackTraces\ClassC.cs 的 StackOverflow44227962StackTraces.ClassC.DoSomething(Object something):行号 15
   在 C:\Users\Simon\source\repos\StackOverflow44227962StackTraces\ClassB.cs 的 StackOverflow44227962StackTraces.ClassB.DoSomething():行号 12
   --- 结束于内部异常堆栈跟踪 ---
   在 C:\Users\Simon\source\repos\StackOverflow44227962StackTraces\ClassB.cs 的 StackOverflow44227962StackTraces.ClassB.DoSomething():行号 16
   在 C:\Users\Simon\source\repos\StackOverflow44227962StackTraces\ClassA.cs 的 StackOverflow44227962StackTraces.ClassA.CallClassB():行号 23
   在 C:\Users\Simon\source\repos\StackOverflow44227962StackTraces\ClassA.cs 的 StackOverflow44227962StackTraces.ClassA.DoSomething():行号 11
   --- 结束于内部异常堆栈跟踪 ---
   在 C:\Users\Simon\source\repos\StackOverflow44227962StackTraces\ClassA.cs 的 StackOverflow44227962StackTraces.ClassA.DoSomething():行号 15
   在 C:\Users\Simon\source\repos\StackOverflow44227962StackTraces\Program.cs 的 StackOverflow44227962StackTraces.Program.Main(String[] args):行号 12

粗体文本与最内层异常相关,斜体文本与包装最内层异常的异常相关,普通文本与最外层异常相关,即在Program类中捕获的异常。该消息“--- End of inner exception stack trace ---”意味着“这是有关内部异常信息的结尾,之后的内容与包装它的异常相关”。

如果您愿意,您可以像这样报告异常及其内部异常:

Exception cex = ex;
while (cex != null)
{
    Console.WriteLine(cex.GetType().Name);
    Console.WriteLine(cex.Message);
    Console.WriteLine(cex.StackTrace);
    Console.WriteLine();
    cex = cex.InnerException;
}

输出如下:

异常
这是最外层的异常
   在C:\ Users \ Simon \ source \ repos \ StackOverflow44227962StackTraces \ ClassA.cs的StackOverflow44227962StackTraces.ClassA.DoSomething()中:第15行
   在C:\ Users \ Simon \ source \ repos \ StackOverflow44227962StackTraces \ Program.cs的StackOverflow44227962StackTraces.Program.Main(String [] args)中:第12行
无效操作异常 这是包含最内层异常的异常 在C:\ Users \ Simon \ source \ repos \ StackOverflow44227962StackTraces \ ClassB.cs的StackOverflow44227962StackTraces.ClassB.DoSomething()中:第16行 在C:\ Users \ Simon \ source \ repos \ StackOverflow44227962StackTraces \ ClassA.cs的StackOverflow44227962StackTraces.ClassA.CallClassB()中:第23行 在C:\ Users \ Simon \ source \ repos \ StackOverflow44227962StackTraces \ ClassA.cs的StackOverflow44227962StackTraces.ClassA.DoSomething()中:第11行
参数为空异常 这是最内层的异常(参数'something') 在C:\ Users \ Simon \ source \ repos \ StackOverflow44227962StackTraces \ ClassC.cs的StackOverflow44227962StackTraces.ClassC.DoSomething(Object something)中:第15行 在C:\ Users \ Simon \ source \ repos \ StackOverflow44227962StackTraces \ ClassB.cs的StackOverflow44227962StackTraces.ClassB.DoSomething()中:第12行

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接