StackFrame和StackTrace在Unity和C#中的区别
本文通过实际例子来看看StackFrame和StackTrace有什么区别,分别在.NET和Unity中测试。
.NET环境
测试代码
using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
internal class Program
{
public static void Main(string[] args)
{
MyFunc1();
MyFunc2();
Console.ReadKey();
}
static void MyFunc1() { Console.WriteLine(new StackFrame(true)); }
static void MyFunc2() { Console.WriteLine(new StackTrace(true)); }
}
}
通过Debug或Release模式生成exe运行而非在IDE下运行,在这两种模式下有、无pbd文件,输出结果是一致的,如下所示
有pdb文件
MyFunc1 at offset 59 in file:line:column E:\Code\csharp_study\ConsoleApplication1\ConsoleApplication1\Program.cs:15:34
在 ConsoleApplication1.Program.MyFunc2() 位置 E:\Code\csharp_study\ConsoleApplication1\ConsoleApplication1\Program.cs:行号 16
在 ConsoleApplication1.Program.Main(String[] args) 位置 E:\Code\csharp_study\ConsoleApplication1\ConsoleApplication1\Program.cs:行号 11
删除pdb文件
MyFunc1 at offset 59 in file:line:column :0:0
在 ConsoleApplication1.Program.MyFunc2()
在 ConsoleApplication1.Program.Main(String[] args)
Unity环境
我的unity版本 unity 2019.3.7 个人版
在Unity编辑器下
测试代码如下:
void OnClickBtn1()
{
MyFunc1();
MyFunc2();
}
void MyFunc1()
{
Debug.Log(this.name + "click stacktrace:\n" + new StackTrace(true) + "\n");
}
void MyFunc2()
{
Debug.Log(this.name + "click stackframe:\n" + new StackFrame(true) + "\n");
}
new StackFrame(true)打印的堆栈如下:
Canvasclick stackframe:
MyFunc2 at offset 1 in file:line:column E:\Code\UGUIDemo\Assets\Function\TestLogStackTrace.cs:58:9
new StackTrace(true) 打印的堆栈(在上面的基础上会有更多的Unity底层堆栈)
Canvasclick stacktrace:
at TestLogStackTrace.MyFunc1 () [0x00001] in E:\Code\UGUIDemo\Assets\Function\TestLogStackTrace.cs:53
at TestLogStackTrace.OnClickBtn1 () [0x00001] in E:\Code\UGUIDemo\Assets\Function\TestLogStackTrace.cs:35
.....中间省略一些Unity的调用栈
at UnityEngine.EventSystems.EventSystem.Update () [0x000f9] in D:\Program Files\Unity\Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\EventSystem\EventSystem.cs:377
UnityEngine.Debug:Log(Object)
ButtonScene:OnClickBtn1() (at Assets/uGUI/Scripts/ButtonScene.cs:40)
UnityEngine.EventSystems.EventSystem:Update() (at D:/Program Files/Unity/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/EventSystem.cs:377)
结论
结合实践和反编译mscorlib.dll的代码来看
StackTrace中有一个StaceFrame列表,包含完整的调用栈,对于第二个函数的完整调用栈如下
new StackTrace(true) = {StackTrace} " 在 ConsoleApplication1.Program.MyFunc2()\r\n 在 ConsoleApplication1.Program.Main(String[] args)\r\n"
FrameCount = {int} 2
Static members = {}
Non-public members = {}
frames = {StackFrame[]} Count = 5
[0] = {StackFrame} "GetStackFramesInternal at offset 0 in file:line:column <filename unknown>:0:0\r\n"
[1] = {StackFrame} "CaptureStackTrace at offset 188 in file:line:column <filename unknown>:0:0\r\n"
[2] = {StackFrame} ".ctor at offset 100 in file:line:column <filename unknown>:0:0\r\n"
[3] = {StackFrame} "MyFunc2 at offset 27 in file:line:column <filename unknown>:0:0\r\n"
[4] = {StackFrame} "Main at offset 43 in file:line:column <filename unknown>:0:0\r\n"
m_iMethodsToSkip = {int} 3
m_iNumOfFrames = {int} 2
而stackFrame中只有当前函数的这一帧调用者信息
这个结论同时适用于.NET环境和Unity环境中。
目前我们Unity线上项目设置的堆栈为Script only
StackFrame和StackTrace在Unity和C#中的区别的更多相关文章
- DDD~Unity在DDD中的使用
回到目录 上一讲介绍了DDD中的领域层,并提到下次要讲Unity,所以这篇文章当然就要介绍它了,呵呵,Unity是Microsoft.Practices中的一部分,主要实现了依赖注入的功能,或者叫它控 ...
- Unity制作游戏中的场景
Unity制作游戏中的场景 1.2.3 场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...
- Unity3D 将 Unity 嵌入WPF中的一些研究笔记
一. 在 WPF 中使用 WebBrowser,直接打开 WebPlayer.html 以这种方式有一个问题是. 无法在 WebBrowser 的上面 放置其它的控件, 在运行时,都不会显示 . 以 ...
- 【Unity游戏开发】浅谈Unity游戏开发中的单元测试
一.单元测试的定义与作用 单元测试定义:单元测试在传统软件开发中是非常重要的工具,它是指对软件中的最小可测试单元进行检查和验证,一般情况下就是对代码中的一个函数去进行验证,检查它的正确性.一个单元测试 ...
- Unity项目开发过程中常见的问题,你遇到过吗?
最近看到有朋友问一个unity游戏开发团队,需要掌握哪些知识之类的问题.事实上Unity引擎是一个很灵活的引擎,根据团队开发游戏类型的不同,对人员的要求也有差异,所以不能一概而论.但是,一些在Unit ...
- Unity 处理预设中的中文
Unity 处理预设中的中文 需求由来 项目接入越南版本 需要解决的文本问题 获取UI预设Label里面的中文(没被代码控制)提供给越南 Label里面的中文替换成越南文 解决流程 迭代获取Asset ...
- Unity 4.0 中的新动画系统——MecAnim
分享一个文档资料,关于动画系统的,版本应该很老了,但是有借鉴意义的: Unity 4.0 已于 2012 年 11 月 15 日正式发布,Unity 每一次版本的提升,都给游戏开发者带来惊喜,这一次也 ...
- [转] Draw Call未被批处理?告诉你在Unity 5.6中如何查找原因 [复制链接]
Unity在5.6之前的版本中并未提供很直接的方式来查找Draw Call未被批处理的原因,但Unity 5.6在Frame Debugger中新增了一项功能,帮助开发者查找相关信息.今天这篇文章就为 ...
- Unity 5.6中的混合光照(下)
https://mp.weixin.qq.com/s/DNQFsWpZm-ybIlF3DTAk2A 在<Unity 5.6中的混合光照(上)>中,我们介绍了混合模式,以及Subtracti ...
- Unity 5.6中的混合光照(上)
https://mp.weixin.qq.com/s/AbWM21sihHw5pFdMzENDPg 在Unity 5中,光照得到了很大的改进.现在,创建高度逼真的游戏已成为可能.但是,出于对性能的考虑 ...
随机推荐
- PPT 如何将大段WORD制作成PPT
PPT 如何将大段WORD制作成PPT 标记等级 发送到PPT 图片.表格,无法发送
- MySQL 数据库中的数据类型
整数类型 标准 SQL 中支持 INTEGER 和 SMALLINT 这两种类型,MySQL 数据库除了支持这两种类型以外,还扩展支持了 TINYINT.MEDIUMINT 和 BIGINT 整数类型 ...
- 基于 Serverless+OSS 分分钟实现图片秒变素描
简介: 在阿里云Serverless函数计算服务中部署普通图片转素描图函数服务,实现将批量上传到指定OSS桶内的图片自动转换为素描图并保存到另一个OSS桶内 场景介绍 小明接到学校老师安排的任务,需要 ...
- <vue 组件 3、父子组件相互访问>
代码结构 一. 01-组件访问-父访问子 1. 效果 点击后在父组件里展示子组件的参数 2.代码 01-组件访问-父访问子.html <!DOCTYPE html> <htm ...
- VueTreeselect
https://www.vue-treeselect.cn/ 官网简介
- freeswitch xml_rpc模块
概述 freeswitch有非常多的周边模块,给我们提供各种各样的功能,有些功能在适当的场景下可以极大的方便我们的开发和应用. 今天我们介绍一个不常用的模块mod_xml_rpc. freeswitc ...
- nginx.conf 配置解析及常用配置
本文为博主原创,未经允许不得转载: nginx.conf 配置文件配置解析 #定义 Nginx 运行的用户和用户组.默认nginx的安装用户为 nobody user www www: #启动进程,通 ...
- [转帖]Oracle-UNDO篇
原文地址:https://www.modb.pro/db/70802?xzs= 一:请描述什么是Oracle Undo. 二:请描述UNDO的作用. 三:请谈谈你对Manual Undo Mana ...
- [转帖]Debian开启SSH
一.Debian开启SSH 参考链接: https://blog.csdn.net/zzpzheng/article/details/71170572 https://help.aliyun.com/ ...
- [转帖]SSL数字证书分类DV/OV/EV
SSL证书的分类主要是通过下面两个维度进行分类: 1.根据验证模式分类 根据CA机构对申请者的身份审核范围分为:DV证书.OV证书.EV证书. 1.1.DV证书(域名证书) DV(Domain Val ...