在Visual Studio调试器中显示Unreal的数据类型的值

43 篇文章 7 订阅
2 篇文章 0 订阅

      在Unreal引擎中大量使用了自定义的数据类型如:FName,FString,TArray等等,对于这些自定义的数据类型,我们无法直接查看到这些数据的值,但是我们可以编写VS中的autoexp.dat文件中的脚本,来达到我们需要在调试器中显示的方式。

      由于在VS2003中的autoexp.dat脚本不支持表达式,而无法全部满足我们对Unreal引擎中自定义的数据类型的调试显示。经过研究,笔者实现了FColor,FNameEntry,FString的直接显示,但是对于FName的显示,通过调整FName的代码,也实现了其调试显示的需求。

      而VS2005、VS2008、VS2010中的autoexp.dat脚本实现了对表达式的支持,基本上可以把Unreal引擎中的所有自定义数据类型直观的显示在调试器中。

     VS2003中的方法如下:

     打开VS安装目录下的Common7/Packages/Debugger/autoexp.dat文件,在[AutoExpand]下添加如下脚本:

FNameEntry=<Name,su>
;Unreal的FColor
FColor = R=<R,u> G=<G,u> B=<B,u> A=<A,u>
FString = <Data,su>
FName = <operator*(),su> ;注意:调用operator*()函数需要把代码中的断言去掉,否则在查看未初始化的FName变量时会出现异常。

    VS2005、VS2008、VS2010中的方法如下:

    同上打开autoexp.dat文件,在[AutoExpand]下添加如下脚本:

FNameEntry=<Name,su>
;Unreal的FColor
FColor = R=<R,u> G=<G,u> B=<B,u> A=<A,u>

在[Visualizer]下添加如下脚本:

; Unreal格式的数组
TArray<FString>{
     children
     (
         #array
         (
             expr :    ((FString*)($c.Data))[$i],
             size :     $c.ArrayNum
         )
     )
   
     preview
     (
         #(
            "[",
             $c.ArrayNum ,
            "](",
           
             #array
             (
                 expr :         [((FString*)($e.Data))[$i].Data,su],
                 size :      $c.ArrayNum
             ),
            ")"
         )
     )
    
     stringview
     (
         #(
            "[",
             $c.ArrayNum ,
            "](",
           
             #array
             (
                 expr :         [((FString*)($e.Data))[$i].Data,su],
                 size :      $c.ArrayNum
             ),
            ")"
         )
     )
}

TArrayNoInit<FString>{
     children
     (
         #array
         (
             expr :    ((FString*)($c.Data))[$i],
             size :     $c.ArrayNum
         )
     )
   
     preview
     (
         #(
            "[",
             $c.ArrayNum ,
            "](",
           
             #array
             (
                 expr :         [((FString*)($e.Data))[$i].Data,su],
                 size :      $c.ArrayNum
             ),
            ")"
         )
     )
    
     stringview
     (
         #(
            "[",
             $c.ArrayNum ,
            "](",
           
             #array
             (
                 expr :         [((FString*)($e.Data))[$i].Data,su],
                 size :      $c.ArrayNum
             ),
            ")"
         )
     )
}

; Unreal格式的数组
TArray<FStringNoInit>{
     children
     (
         #array
         (
             expr :    ((FStringNoInit*)($c.Data))[$i],
             size :     $c.ArrayNum
         )
     )
   
     preview
     (
         #(
            "[",
             $c.ArrayNum ,
            "](",
           
             #array
             (
                 expr :         [((FStringNoInit*)($e.Data))[$i].Data,su],
                 size :      $c.ArrayNum
             ),
            ")"
         )
     )
    
     stringview
     (
         #(
            "[",
             $c.ArrayNum ,
            "](",
           
             #array
             (
                 expr :         [((FStringNoInit*)($e.Data))[$i].Data,su],
                 size :      $c.ArrayNum
             ),
            ")"
         )
     )
}

TArrayNoInit<FStringNoInit>{
     children
     (
         #array
         (
             expr :    ((FStringNoInit*)($c.Data))[$i],
             size :     $c.ArrayNum
         )
     )
   
     preview
     (
         #(
            "[",
             $c.ArrayNum ,
            "](",
           
             #array
             (
                 expr :         [((FStringNoInit*)($e.Data))[$i].Data,su],
                 size :      $c.ArrayNum
             ),
            ")"
         )
     )
    
     stringview
     (
         #(
            "[",
             $c.ArrayNum ,
            "](",
           
             #array
             (
                 expr :         [((FStringNoInit*)($e.Data))[$i].Data,su],
                 size :      $c.ArrayNum
             ),
            ")"
         )
     )
}

; Unreal格式的数组
TArray<*>{
     children
     (
         #array
         (
             expr :     (($T1*)($c.Data))[$i], 
             size :     $c.ArrayNum
         )
     )
   
     preview
     (
         #(
            "[",
             $c.ArrayNum ,
            "](",
           
             #array
             (
                 expr : (($T1*)($c.Data))[$i], 
                 size : $c.ArrayNum
             ),
            ")"
         )
     )
}

; Unreal格式的数组
TArrayNoInit<*>{
     children
     (
         #array
         (
             expr :     (($T1*)($c.Data))[$i], 
             size :     $c.ArrayNum
         )
     )
   
     preview
     (
         #(
            "[",
             $c.ArrayNum ,
            "](",
           
             #array
             (
                 expr : (($T1*)($c.Data))[$i], 
                 size :      $c.ArrayNum
             ),
            ")"
         )
     )
}

; Unreal的FName
FName{
     preview([((FNameEntry**)FName.Names.Data)[$c.Index]->Name,su])
         stringview([((FNameEntry**)FName.Names.Data)[$c.Index]->Name])
}
; Unreal的FString
FString{
     preview([$c.Data,su])
         stringview([$c.Data,su])
}

; Unreal的FString
FStringNoInit{
     preview([$c.Data,su])
         stringview([$c.Data,su])
}
; Unreal的UObject
UObject{
     preview([((FNameEntry**)FName.Names.Data)[$c.Name.Index]->Name,su])
         stringview([((FNameEntry**)FName.Names.Data)[$c.Name.Index]->Name])
}

; Unreal的TMap
TMap<*,*>{
     preview(#("size=",[$c.Pairs.ArrayNum,u]))
}

然后就可以在调试中尽情查看以上自定义数据类型的值了。

显示效果如下:

 

Tips显示方式

 

 

 

 

 

 

 

 

 

 

 

 

 

快速监视显示

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值