ASP.NET黄屏死亡错误 - 它从哪里获取堆栈跟踪?

7

我在应用程序中设置了远程调用类型,避免了TargetInvocationExceptions并抓取内部异常。我调用Exception类上的内部PrepForRemoting方法以保留从调用方法获取的堆栈跟踪。

这似乎正确构造了堆栈跟踪属性:

"\r\nServer stack trace: \r\n

at ZBooking.Environment.Services.BookingService.<>c_DisplayClass9`1.b_5(BookingSlot p) in C:\dev\ZBookings\core\ZZBookings.Services\BookingService.cs:line 79\r\n

at System.Linq.Enumerable.All[TSource](IEnumerable'1 source, Func'2 predicate)\r\n

at ZBookings.BookingService.MoveBooking[TBookingType](Int32 bookingId, >IEnumerable`1 bookingSlots) in C:\dev\ZBooking.Client\core\ZBookings.Services\BookingService.cs:line 79\r\n\r\n

Exception rethrown at [0]: \r\n at ZBookings.BookingService.<>c_DisplayClass9`1.b_5(BookingSlot p) in C:\dev\ZBookings\core\ZBookings.Services\BookingService.cs:line 79\r\n

at System.Linq.Enumerable.All[TSource](IEnumerable'1 source, Func'2 predicate)\r\n

at ZBookings.BookingService.MoveBooking[TBookingType](Int32 bookingId, IEnumerable`1 bookingSlots) in C:\dev\ZBookings\core\ZBookings.Services\BookingService.cs:line 79"

但是,当标准的ASP.NET黄屏幕显示它时:

[NullReferenceException: Object reference not set to an instance of an object.] ZBooking.ApplicationServices.MethodMarshaller.Invoke(Delegate del, ZipIdentity zipIdentity, Object[] args) in C:\dev\ZBooking\core\ZBooking.ApplicationServices\MethodMarshaller.cs:147 ZBooking.ApplicationServices.MethodMarshaller.Invoke(Delegate del, ZipIdentity zipIdentity, Object[] args) in C:\dev\ZBooking\core\ZBooking.ApplicationServices\MethodMarshaller.cs:105 ZBooking.ApplicationServices.MethodMarshaller.Call(Func'3 del, T1 arg1, T2 arg2, ZipIdentity zipIdentity) in C:\dev\ZBooking\core\ZBooking.ApplicationServices\MethodMarshaller.cs:72
...etc.

在Global.asax的Application_Error中调用Server.GetLastError();可以显示正确的堆栈跟踪。黄屏幕的堆栈跟踪来自哪里?


你确定没有第二个异常“覆盖”了第一个吗?这两个异常似乎差别太大了。你能在MethodMarshaler的147行(以及105和72行)设置断点并查看发生了什么吗?也许你可以尝试让调试器停止所有的NullReferenceException。 - xanatos
这就是重点所在。一个例外覆盖了另一个 - 我重新抛出正确的内部异常,然后从那里重写它的堆栈跟踪。堆栈跟踪重写起作用,但似乎没有冒泡到YSOD。 - David Neale
1个回答

7

听起来很有前途。它似乎归结为 internal static extern void GetStackFramesInternal(StackFrameHelper sfh, int iSkip, Exception e); 调用 - 我会查看 SSCLI,看看它调用了哪个方法。 - David Neale
同时,我认为“黄屏堆栈跟踪来自哪里?”这个问题已经得到了回答。;) 不过,我恐怕你还需要更多的努力。 - Atif Aziz

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