通过AutoExpand调试Unreal内置数据类型

通过AutoExpand调试Unreal内置数据类型

--Zephyroal

 

Unreal3引擎中,大量使用了自定义的模版或数据类型,比如TArrayFNameFString等等,想起了以前痛苦的utf-8编码调试,对于这数据类型,难以VS中直接查看他们的值。
同事偶然提到,网上一搜,万幸,有前人走过此路,通过扩展autoexp.dat可以实现对Unreal3数据类型的直观的可视化调试,方法如下:
1,打开调试时对变量进行Auto Expand功能

首先,确保功能打开:

wps_clip_image-24074

VSOption->Debug->General

2[AutoExpand]字段

打开VS安装目录下的Common7/Packages/Debugger/autoexp.dat文件 找到[AutoExpand]

(注,其实无所不能的Epic开发组早已经准备好了相关的文件,放在UE开发文件中, ExternalVisualStudioDebugging的目录下,由于开发环境的问题,不能放出,这里直接转用网上同仁发的脚本,如有不好用的地方,可参照原理,自行修改之,另外还可以举一反三,扩展到其它的情况下使用)

[AutoExpand]的下面添加一行:
FNameEntry=<Name,su>

翻到文件最后,添加以下代码到文件的最后:
; 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格式的FName
FName{
     preview([((FNameEntry**)FName.Names.Data)[$c.Index]])
         stringview([((FNameEntry**)FName.Names.Data)[$c.Index]])
}
; Unreal格式的字符串
FString{
     preview([$c.Data,su])
         stringview([$c.Data,su])
}

3,[Visualizer]字段

[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
             ),
            ")"
         )
     )
}

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

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

然后,开启DebugJust Enjoy it

4,相关知识

1) $e,$c是预先定义,表示是传给变量可视化调试器的值。用$e$c都可以,没有区别。但是$c一般都用在container上。

2) $i是用在#array语句中的一个局部变量,使用了#array后会使用size表达式自动迭代$i

3) 分支语句#if #else:语句必须使用括号包起来,不能省略

4) 井号(#)语句:个人理解是一个串接语句,计算每一个在#('zz',$e.d,3)的变量,然后转为字符串,并串接起来。

5) #array:显示container的内容。需要提供exprsize表达式。expr就是每一个元素的内容,size就是总共显示多少个元素

6) 通配符(*)的使用:通配符经常用于名字空间通配和模板匹配,匹配上之后,会产生$T1,$T2...之类的类型或者名字空间。类型可以用来做类型转换。比如*::QList<*>匹配上QCore::QList<int>$T1就是QCore,$T2就是int类型

7) 类型转换:通配到类型后可以使用C格式的强制转换。

8) 注释:只看到单行注释方式,使用分号(;)

9) 还有一种#tree的结构,用来显示层次化的数据结构

转自:

VS高级使用方法1autoexp.dat使用Visual studiodebug时显示变量内容

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

Thx

posted @ 2012-03-23 18:59  Zephyroal  阅读(934)  评论(0编辑  收藏  举报