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); }
测试效果截图
- 旧版调用栈不可见效果:

- 新版调用栈可见效果:

新版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,提问作者丁凌烁
相关产品推荐
相关产品推荐

