Ben.Demystifier

2025-12-07 0 473

Ben.Demystifier

堆栈跟踪输出现代C#7.0+功能,看起来像C#源代码生成它们而不是格式化。

对堆栈痕迹的高性能理解

.NET堆栈跟踪输出编译器转换方法;而不是源代码方法,这使它们在精神上解析并与源代码匹配。

当前的输出适用于C#1.0;但是,由于C#2.0(迭代器,仿制药)随着新功能的添加到.NET语言,并且在C#7.1堆栈痕迹是深奥的(请参阅:当前堆栈痕迹的问题),因此变得越来越糟。

使错误日志提高生产力

以可理解的方式输出堆栈跟踪中的现代C#7.0+功能,看起来像生成它们的C#源代码。

用法

 exception.Demystify()

或而不是环境.stacktrace

 EnhancedStackTrace.Current()

将堆栈解析回呼叫的C#源格式(并且是可检查的堆栈框架列表)

demystified异常上的呼叫.ToString()将产生类似于以下的字符串stacktrace(没有注释):

 System . InvalidOperationException : Collection was modified ; enumeration operation may not execute .
   at bool System . Collections . Generic . List < T > + Enumerator . MoveNextRare ( )
   at IEnumerable < string > Program . Iterator ( int startAt ) + MoveNext ( )                       // Resolved enumerator
   at bool System . Linq . Enumerable + SelectEnumerableIterator < TSource , TResult > . MoveNext ( )  // Resolved enumerator
   at string string . Join ( string separator , IEnumerable < string > values )                    
   at string Program + GenericClass < TSuperType > . GenericMethod < TSubType > ( ref TSubType value ) 
   at async Task < string > Program . MethodAsync ( int value )                                  // Resolved async 
   at async Task < string > Program . MethodAsync < TValue > ( TValue value )                       // Resolved async 
   at string Program . Method ( string value ) + ( ) => { } [ 0 ]                                     // lambda source + ordinal
   at string Program . Method ( string value ) + ( ) => { } [ 1 ]                                     // lambda source + ordinal 
   at string Program . RunLambda ( Func < string > lambda )                                       
   at ( string val , bool ) Program . Method ( string value )                                    // Tuple returning
   at ref string Program . RefMethod ( in string value ) + LocalFuncRefReturn ( )                 // ref return local func
   at int Program . RefMethod ( in string value ) + LocalFuncParam ( string val )                  // local function
   at string Program . RefMethod ( in string value )                                          // in param (readonly ref)    
   at ( string val , bool ) static Program ( ) + ( string s , bool b ) => { }                         // tuple return static lambda
   at void static Program ( ) + ( string s , bool b ) => { }                                       // void static lambda
   at void Program . Start ( ( string val , bool ) param )                                       // Resolved tuple param
   at void Program . Start ( ( string val , bool ) param ) + LocalFunc1 ( long l )                    // void local function 
   at bool Program . Start ( ( string val , bool ) param ) + LocalFunc2 ( bool b1 , bool b2 )          // bool return local function 
   at string Program . Start ( )                                                              
   at void Program ( ) + ( ) => { }                                                              // ctor defined lambda  
   at void Program ( Action action ) + ( object state ) => { }                                     // ctor defined lambda 
   at void Program . RunAction ( Action < object > lambda , object state )                         
   at new Program ( Action action )                                                         // constructor 
   at new Program ( )                                                                      // constructor 
   at void Program . Main ( String [ ] args )                                                    

在同一例外情况下调用.ToString()将产生以下输出

 System . InvalidOperationException : Collection was modified ; enumeration operation may not execute .
   at System . ThrowHelper . ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion ( ) // ? low value
   at System . Collections . Generic . List ` 1 . Enumerator . MoveNextRare ( )                         
   at Program . < Iterator > d__3 . MoveNext ( )                                                   // which enumerator?
   at System . Linq . Enumerable . SelectEnumerableIterator ` 2 . MoveNext ( )                        // which enumerator?
   at System . String . Join ( String separator , IEnumerable ` 1 values )                          
   at Program . GenericClass` 1 . GenericMethod [ TSubType ] ( TSubType & value )                     
   at Program . < MethodAsync > d__4 . MoveNext ( )                                                // which async overload?
-- - End of stack trace from previous location where exception was thrown -- -              // ? no value
   at System . Runtime . ExceptionServices . ExceptionDispatchInfo . Throw ( )                      // ? no value
   at System . Runtime . CompilerServices . TaskAwaiter . HandleNonSuccessAndDebuggerNotification ( Task task ) // ? no value
   at System . Runtime . CompilerServices . TaskAwaiter ` 1 . GetResult ( )                           // ? no value
   at Program . < MethodAsync > d__5 ` 1 . MoveNext ( )                                              // which async overload?
-- - End of stack trace from previous location where exception was thrown -- -              // ? no value
   at System . Runtime . ExceptionServices . ExceptionDispatchInfo . Throw ( )                      // ? no value
   at System . Runtime . CompilerServices . TaskAwaiter . HandleNonSuccessAndDebuggerNotification ( Task task ) // ? no value
   at System . Runtime . CompilerServices . TaskAwaiter ` 1 . GetResult ( )                           // ? no value
   at Program . < > c__DisplayClass8_0 . < Method > b__0 ( )                                         //  ¯\\_(ツ)_/¯
   at Program . < > c__DisplayClass8_0 . < Method > b__1 ( )                                         //  ¯\\_(ツ)_/¯
   at Program . RunLambda ( Func ` 1 lambda ) 
   at Program . Method ( String value )
   at Program . < RefMethod > g__LocalFuncRefReturn | 10_1 ( < > c__DisplayClass10_0 & )              // local function
   at Program . < RefMethod > g__LocalFuncParam | 10_0 ( String val , < > c__DisplayClass10_0 & )      // local function
   at Program . RefMethod ( String value )
   at Program . < > c . < . cctor > b__18_1 ( String s , Boolean b )                                    //  ¯\\_(ツ)_/¯
   at Program . < > c . < . cctor > b__18_0 ( String s , Boolean b )                                    //  ¯\\_(ツ)_/¯
   at Program . Start ( ValueTuple ` 2 param )                                                   // Tuple param?
   at Program . < Start > g__LocalFunc1 | 11_0 ( Int64 l )                                          // local function
   at Program . < Start > g__LocalFunc2 | 11_1 ( Boolean b1 , Boolean b2 )                           // local function
   at Program . Start ( )
   at Program . < > c . < . ctor > b__1_0 ( )                                                         //  ¯\\_(ツ)_/¯
   at Program . < > c__DisplayClass2_0 . < . ctor > b__0 ( Object state )                              //  ¯\\_(ツ)_/¯
   at Program . RunAction ( Action ` 1 lambda , Object state )
   at Program..ctor ( Action action )                                                        // constructor
   at Program . . ctor ( )                                                                     // constructor
   at Program . Main ( String [ ] args )

它的帮助远不多

当前堆栈跟踪的问题:

  • 构造函数

    不匹配代码,输出为.ctor.cctor

  • 参数

    请勿指定预选赛refoutin

  • 迭代器

    无法确定过载<Iterator>d__3.MoveNext()而不是Iterator(int startAt)+MoveNext()

  • linq

    无法确定超负荷

    Linq.Enumerable.SelectEnumerableIterator``2.MoveNext()

    而不是

    Linq.Enumerable+SelectEnumerableIterator<TSource, TResult>.MoveNext()

  • 异步

    无法确定过载,也无法确定诸如async修饰符

    <MethodAsync>d__5``1.MoveNext()

    而不是

    async Task<string> Program.MethodAsync(int value)

    噪音!

     --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
    
  • Lambdas

    主要是jibberish <>c__DisplayClass2_0.<.ctor>b__0(Object state)建议他们声明的位置,但如果该方法有多个过载,则没有提示。

  • 本地功能

    大多数是Jibberish <RefMethod>g__LocalFuncParam|10_0(String val, <>c__DisplayClass10_0& )建议他们声明的位置,但如果该方法有多个过载,则没有提示。

  • 通用参数

    无法解决,仅指示数字RunLambda(Func``1 lambda)而不是RunLambda(Func<string> lambda)

  • 价值元组

    请勿匹配代码,将输出作为ValueTuple``2 param而不是(string val, bool) param

  • 原始类型

    不匹配代码,输出为Int64BooleanString而不是longboolstring

  • 返回类型

    完全从方法签名跳过

基准

从存储库根运行基准:

 dotnet run -p .\\test\\ Ben.Demystifier .Benchmarks\\ -c Release -f netcoreapp2.0 All

注意:我们只通过netcoreapp2.0开始,基准将用于所有配置的平台(如net462

下载源码

通过命令行克隆项目:

git clone https://github.com/benaadams/Ben.Demystifier.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 开发教程 Ben.Demystifier https://www.zuozi.net/32066.html

math php
上一篇: math php
php qrcode
下一篇: php qrcode
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务