You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity所用Mono升级后ETL文件托管调用栈可见性实现方式问询

关于Mono旧版本ETL文件托管调用栈不可见的问题分析需求

我正在开展一项研究,遇到Unity 2015-2016年使用的旧版Mono(版本未知)的问题:性能分析工具生成ETL文件时,托管调用栈无法显示;但2017年左右的版本更新后,托管调用栈变得可见。想了解这一功能的实现机制。

该性能分析工具仅从ETL文件和被分析可执行文件获取信息,我认为ETL中的调用栈信息主要来自MSNT_SystemTrace的StackWalk事件(其他事件提供函数名等细节,与核心问题无关)。尝试通过Windows API获取该提供者关联进程PID时结果为-1,无法理解原因。

猜测新版Mono或其依赖项的变更影响了事件记录,但大量搜索未发现相关差异。不确定其他提供者和事件是否影响调用栈可视化,初步判断无关联。

补充背景:在.NET Framework更新日志中发现4.0版本引入了部分性能测试支持,但不确定这些变更是否影响观察到的现象,或是对Mono产生影响。


测试代码

(旧版对应v2.0.50215,新版对应v4.0.30319)

int main(int argc, char** argv)
{
    Mono mono;
    char hello[] = "helloworld.exe";
    char* path[1] = { hello };
    MonoAssembly* assembly;
    MonoDomain* domain;
    getchar();

    puts(argv[0]);
    mono_api_init(&mono,".\\mono-2.0-bdwgc.dll");
    //mono_api_init(&mono, ".\\mono-2.0.dll");
    mono.set_assemblies_path(".\\lib");
    //domain = mono.jit_init_version("myapp", "v4.0.30319");
    domain = mono.jit_init_version("myapp", "v2.0.50215");
    if (!domain)
    {
        puts("err1");
        return -1;
    }

    getchar();
    assembly = mono.domain_assembly_open(domain, "helloworld.exe");
    puts("3");
    getchar();

    if (!assembly)
    {
        puts("err2");
        return -1;
    }
    mono.jit_exec(domain, assembly, 1, path);
}

测试效果截图

  • 旧版调用栈不可见效果:旧版Mono调用栈效果
  • 新版调用栈可见效果:新版Mono调用栈效果

新版StackWalk事件示例

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    <System>
        <Provider Guid="{9e814aad-3204-11d2-9a82-006008a86939}" />
        <EventID>0</EventID>
        <Version>2</Version>
        <Level>0</Level>
        <Task>0</Task>
        <Opcode>32</Opcode>
        <Keywords>0x0</Keywords>
        <TimeCreated SystemTime="2024-09-12T15:41:09.231603300+07:59" />
        <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
        <Execution ProcessID="4294967295" ThreadID="4294967295" ProcessorID="2" KernelTime="0" UserTime="0" />
        <Channel />
        <Computer />
    </System>
    <EventData>
        <Data Name="EventTimeStamp">5915705958622</Data>
        <Data Name="StackProcess">0x8BDC</Data>
        <Data Name="StackThread">   19588</Data>
        <Data Name="Stack1">0x77E31CF3</Data>
        <Data Name="Stack2">0x77E31CB4</Data>
        <Data Name="Stack3">0x77E31D75</Data>
        <Data Name="Stack4">0x7FFEFEE4EA8D</Data>
        <Data Name="Stack5">0x7FFEFEE4E18D</Data>
        <Data Name="Stack6">0x7FFF0112E57B</Data>
        <Data Name="Stack7">0x7FFF0111A86E</Data>
        <Data Name="Stack8">0x7FFF010C4383</Data>
        <Data Name="Stack9">0x7FFF010C42AE</Data>
        <Data Name="Stack10">0x7687122C</Data>
        <Data Name="Stack11">0x7A6FED10</Data>
        <Data Name="Stack12">0x7A64E138</Data>
        <Data Name="Stack13">0x7A64DBF3</Data>
        <Data Name="Stack14">0x7A6EF37E</Data>
        <Data Name="Stack15">0x7A6FBD77</Data>
        <Data Name="Stack16">0x7A6DCDFD</Data>
        <Data Name="Stack17">0x24A3480</Data>
        <Data Name="Stack18">0x3BC0447</Data>
        <Data Name="Stack19">0x7A6E52E7</Data>
        <Data Name="Stack20">0x77C53773</Data>
        <Data Name="Stack21">0x77C44596</Data>
        <Data Name="Stack22">0x77C43F07</Data>
        <Data Name="Stack23">0x7A6D9192</Data>
        <Data Name="Stack24">0x77C53773</Data>
        <Data Name="Stack25">0x77C44596</Data>
        <Data Name="Stack26">0x77C42E55</Data>
        <Data Name="Stack27">0x77C429A0</Data>
        <Data Name="Stack28">0x7A6FE642</Data>
        <Data Name="Stack29">0x3D9EA8A</Data>
        <Data Name="Stack30">0x3D9E7E6</Data>
        <Data Name="Stack31">0x3958E36</Data>
        <Data Name="Stack32">0x58AB93F</Data>
        <Data Name="win:ExtraPayload" Type="win:ErrorMoreData">0xA97BE275000000000BC1EA77000000008FC0EA7700000000</Data>
    </EventData>
    <RenderingInfo Culture="zh-CN">
        <Opcode>Stack</Opcode>
        <Provider>MSNT_SystemTrace</Provider>
        <EventName xmlns="http://schemas.microsoft.com/win/2004/08/events/trace">StackWalk</EventName>
    </RenderingInfo>
    <ExtendedTracingInfo xmlns="http://schemas.microsoft.com/win/2004/08/events/trace">
        <EventGuid>{def2fe46-7bd6-4b80-bd94-f57fe20d0ce3}</EventGuid>
    </ExtendedTracingInfo>
</Event>

希望有人能提供Mono如何更新以支持ETL文件中托管调用栈可见性的见解,或指向相关变更文档。

内容的提问来源于stack exchange,提问作者丁凌烁

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:24:56