在 Mono 上加载没有 PDB 的 StackTrace

StackTrace without PDB loaded on Mono

我正在尝试从我正在开发的游戏的一些堆栈跟踪中弄明白。这些是在 Mac 上使用 Mono 生成的。

at Microsoft.Xna.Framework.Game.Run () [0x0002c] in <9fdab2ac823a429cb7b8525426626ccc>:0

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

谁能给我解释一下这个数字是多少?我 objective 将这些信息组合在一起,然后与原始 PDB/MDB 文件一起重构适当的堆栈跟踪。

作为解决方法,我创建了自己的堆栈跟踪方法,该方法也输出元数据标记,但我更愿意使用 Mono 抛出的本机堆栈跟踪。

I have no idea what 9fdab2ac823a429cb7b8525426626ccc

哈希元素(在<>之间)是模块版本ID(方法所属的汇编模块的MVID

生成这些是为了通过

应用程序 compile/AOT 期间生成的 Mono 符号目录来符号化本机崩溃(来自 AOT 应用程序)

mono --aot=msym-dir=<msym dir> .....

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

mono-symbolicate store-symbols myExeWithDebugPDBsDirectory/msym-dir myExeWithDebugPDBsDirectory

这会生成包含以下内容的目录 (myEXEwithDebugPDBsDirectory/msym-dir):

The symbol directory contains subfolder named as a MVID or AOTID

  • MVID subfolders contain .dll/.exe and .mdb files.
  • AOTID subfolder contain .msym files.

您稍后可以使用 mono-symbolicate 来表示您的崩溃(使用来自匹配应用程序的 msym-dir)来生成看起来 exception/stacktrace 的 "normal" 托管代码。

注意:您还可以通过设置环境来关闭那些 Mono "compact" 序列点。变种。在你的 运行 你的 exe 之前:

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

回复:Why do my stack traces only include line numbers if the debugger is attached?