本文通过实际例子来看看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#中的区别的更多相关文章

  1. DDD~Unity在DDD中的使用

    回到目录 上一讲介绍了DDD中的领域层,并提到下次要讲Unity,所以这篇文章当然就要介绍它了,呵呵,Unity是Microsoft.Practices中的一部分,主要实现了依赖注入的功能,或者叫它控 ...

  2. Unity制作游戏中的场景

    Unity制作游戏中的场景 1.2.3  场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...

  3. Unity3D 将 Unity 嵌入WPF中的一些研究笔记

     一. 在 WPF 中使用 WebBrowser,直接打开 WebPlayer.html 以这种方式有一个问题是. 无法在 WebBrowser 的上面 放置其它的控件, 在运行时,都不会显示 . 以 ...

  4. 【Unity游戏开发】浅谈Unity游戏开发中的单元测试

    一.单元测试的定义与作用 单元测试定义:单元测试在传统软件开发中是非常重要的工具,它是指对软件中的最小可测试单元进行检查和验证,一般情况下就是对代码中的一个函数去进行验证,检查它的正确性.一个单元测试 ...

  5. Unity项目开发过程中常见的问题,你遇到过吗?

    最近看到有朋友问一个unity游戏开发团队,需要掌握哪些知识之类的问题.事实上Unity引擎是一个很灵活的引擎,根据团队开发游戏类型的不同,对人员的要求也有差异,所以不能一概而论.但是,一些在Unit ...

  6. Unity 处理预设中的中文

    Unity 处理预设中的中文 需求由来 项目接入越南版本 需要解决的文本问题 获取UI预设Label里面的中文(没被代码控制)提供给越南 Label里面的中文替换成越南文 解决流程 迭代获取Asset ...

  7. Unity 4.0 中的新动画系统——MecAnim

    分享一个文档资料,关于动画系统的,版本应该很老了,但是有借鉴意义的: Unity 4.0 已于 2012 年 11 月 15 日正式发布,Unity 每一次版本的提升,都给游戏开发者带来惊喜,这一次也 ...

  8. [转] Draw Call未被批处理?告诉你在Unity 5.6中如何查找原因 [复制链接]

    Unity在5.6之前的版本中并未提供很直接的方式来查找Draw Call未被批处理的原因,但Unity 5.6在Frame Debugger中新增了一项功能,帮助开发者查找相关信息.今天这篇文章就为 ...

  9. Unity 5.6中的混合光照(下)

    https://mp.weixin.qq.com/s/DNQFsWpZm-ybIlF3DTAk2A 在<Unity 5.6中的混合光照(上)>中,我们介绍了混合模式,以及Subtracti ...

  10. Unity 5.6中的混合光照(上)

    https://mp.weixin.qq.com/s/AbWM21sihHw5pFdMzENDPg 在Unity 5中,光照得到了很大的改进.现在,创建高度逼真的游戏已成为可能.但是,出于对性能的考虑 ...

随机推荐

  1. SpringBoot yml 小格子 变 小叶子

    SpringBoot yml 小格子 变 小叶子 一般添加十多个模块后会出现这样的情况,正常情况下,看POM 文件里的 spring 引用是否异常 一般把 idea 关了再打开试试,有几次我是关了再开 ...

  2. ChatGpt玩法(一):prompt使用的重要性

    前言 登录https://www.topgpt.one即可免费体验ChatGPT带来的强大魅力. ChatGpt是一个强大的自然语言处理工具,可以用于多种任务,如文本生成.问答系统以及对话生成等等.其 ...

  3. VF01/VF11 创建和冲销开票凭证

    1.创建开票凭证 1.1.前台 VF01创建开票凭证 1.2.源代码 "--------------------@斌将军--------------------DATA:lt_billing ...

  4. HTML5 postMessage 跨域跨窗口传递消息

    父页面代码: <!DOCTYPE html> <html> <head> <title>选择位置demo</title> <meta ...

  5. 工程开发 | CMake工程目录结构和多线程

    CMake工程目录结构 lib: 生成的库文件 src: 源文件(.cpp .cc) include: 头文件(.h .hpp) build: 一般在这个文件夹下执行cmake ..(..之前有一个空 ...

  6. Mac | 解决 MacOS 配置 Maven 出现的 Java_Home Error

    1. 错误信息 2. 解决方案 2.1 对于Windows系统下解决方案 https://blog.csdn.net/frankarmstrong/article/details/69945774,在 ...

  7. ios-class-guard - iOS代码混淆与加固实践

    ​ 目录 ios-class-guard - iOS代码混淆与加固实践 摘要 引言 一.class-dump 二.ios-class-guard 混淆原理 三.ios-class-guard 混淆结果 ...

  8. kafka搭建 一、单机版

    系列导航 一.kafka搭建-单机版 二.kafka搭建-集群搭建 三.kafka集群增加密码验证 四.kafka集群权限增加ACL 五.kafka集群__consumer_offsets副本数修改 ...

  9. ASIC 功能验证VTB

    目标 设计流程 验证设计文档和RTL code之间的关系 RTL code(DUT) - 可以当作是一个黑盒,DUT内部是完全不可见的 白盒验证 - DUT内部RTL完全可见 灰盒验证 - DUT内部 ...

  10. jenkins构建报错: Send build artifacts over SSH' changed build result to UNSTABLE

    原因包括: ssh配置的用户没有相关的权限. 最好是配置root用户