我正试图从我正在进行的游戏的一些堆栈跟踪中理解。这些是使用Mono在Mac上生成的。
at Microsoft.Xna.Framework.Game.Run () [0x0002c] in <9fdab2ac823a429cb7b8525426626ccc>:0
这告诉我方法名称(Microsoft.Xna.Framework.Game.Run
)和ILOffset(0x0002c
),但我不知道9fdab2ac823a429cb7b8525426626ccc
是什么。它不是元数据标记,它是某种GUID。
能告诉我这个号码是什么吗?我的目标是将这些信息组合在一起,然后与原始的PDB / MDB文件一起重新构建一个合适的堆栈跟踪。
作为一种解决方法,我制作了自己的stacktrace方法,该方法也输出了元数据令牌,但我更愿意使用Mono抛出的本机堆栈跟踪。
答案 0 :(得分:1)
我不知道9fdab2ac823a429cb7b8525426626ccc
哈希元素(在<>
之间)是该方法所属的汇编模块的模块版本ID(MVID
。
这些是生成的,所以本机崩溃(来自AOT的应用程序)可以通过Mono的符号目录进行符号化,该目录是在应用程序的编译/ AOT期间通过
生成的。 mono --aot=msym-dir=<msym dir> .....
或在编译阶段后使用mono-symbolicate
(您需要所有原始构建工件):
mono-symbolicate store-symbols myExeWithDebugPDBsDirectory/msym-dir myExeWithDebugPDBsDirectory
这会生成包含以下内容的目录(myEXEwithDebugPDBsDirectory/msym-dir
):
符号目录包含名为MVID或AOTID
的子文件夹
- MVID子文件夹包含.dll / .exe和.mdb文件。
- AOTID子文件夹包含.msym文件。
然后,您可以稍后使用mono-symbolicate
来表示崩溃(使用匹配应用程序中的msym-dir
)来生成查看异常/堆栈跟踪的“正常”托管代码。
注意:您还可以通过设置env来关闭Mono“紧凑”序列点。变种。在你运行你的exe之前:
MONO_DEBUG=no-compact-seq-points mono yourApp.exe
re:Why do my stack traces only include line numbers if the debugger is attached?