C# Mono上未加载PDB的StackTrace

C# Mono上未加载PDB的StackTrace,c#,mono,stack-trace,pdb-files,C#,Mono,Stack Trace,Pdb Files,我试图从我正在做的一个游戏的一些痕迹中找到意义。这些都是用Mono在Mac上生成的 位于Microsoft.Xna.Framework.Game.Run()[0x0002c]中:0 这告诉我方法名(Microsoft.Xna.Framework.Game.Run)和ILOffset(0x0002c),但我不知道什么是9fdab2ac823a429cb7b852542662cc。它不是元数据标记,而是某种GUID 能给我解释一下这个号码是多少吗?我的目标是将这些信息组合在一起,然后与原始PDB/

我试图从我正在做的一个游戏的一些痕迹中找到意义。这些都是用Mono在Mac上生成的

位于Microsoft.Xna.Framework.Game.Run()[0x0002c]中:0

这告诉我方法名(
Microsoft.Xna.Framework.Game.Run
)和ILOffset(
0x0002c
),但我不知道什么是
9fdab2ac823a429cb7b852542662cc
。它不是元数据标记,而是某种GUID

能给我解释一下这个号码是多少吗?我的目标是将这些信息组合在一起,然后与原始PDB/MDB文件一起重新构造适当的堆栈跟踪

作为一种解决方法,我创建了自己的stacktrace方法,该方法还输出元数据令牌,但我更愿意使用Mono抛出的本机stacktrace

我不知道9fdab2ac823a429cb7b8525426626ccc是什么

散列元素(在
之间)是该方法所属的程序集模块的模块版本ID(
MVID

它们的产生使得本地崩溃(来自AOT的应用程序)可以通过Mono的符号目录进行符号化,该目录是在应用程序的编译/AOT过程中通过生成的

mono--aot=msym dir=

或者在编译阶段后使用
mono-symbolicate
(您需要所有原始构建工件):

mono symbolicate存储符号myExeWithDebugPDBsDirectory/msym dir myExeWithDebugPDBsDirectory

这将生成目录(
myEXEwithDebugPDBsDirectory/msym dir
),其中包含:

符号目录包含名为MVID或AOTID的子文件夹

  • MVID子文件夹包含.dll/.exe和.mdb文件
  • AOTID子文件夹包含.msym文件
然后,您可以稍后使用
mono-symbolicate
来表示崩溃(使用匹配应用程序中的
msym-dir
),以生成“正常”托管代码外观的异常/堆栈跟踪

注意:在运行exe之前,您还可以通过设置一个env.var来关闭这些Mono“compact”序列点:

MONO_DEBUG=no-compact-seq-points mono yourApp.exe

回复:

这是一个相当模糊的信息(我在谷歌上尝试了大量的组合来找到有用的东西)。非常感谢!我刚刚抓取了他们github的mono symbolicate,编译了它,然后在我的游戏输出文件夹(只包含.exe/.dll/.pdb文件)上使用了两个命令,我可以立即反转堆栈跟踪!如果我知道这一点,这将节省我几个小时来滚动我自己的解决方案,但这更优雅。再次感谢:)@LennardFonteijn没问题,很高兴它有帮助
mono symbolicate
根基于
Xamarin.iOS
Xamarin.Android
,因此您可以表示从ObjC和Java(通过CIL托管代码)移动应用发送到Google/Apple应用商店控制台的本地崩溃。但是,由于它是基于mono的,它当然适用于任何mono/.Net应用程序。很多信息都来自较旧的Xamarin版本的注释,很遗憾他们没有在更公开的文档中提供这些信息(除了mono repo中的“隐藏”自述和Xamarin的一些较旧版本注释)因为它确实派上了用场