没有在Mono上加载PDB的StackTrace

时间:2018-05-09 00:52:12

标签: c# mono stack-trace pdb-files

我正试图从我正在进行的游戏的一些堆栈跟踪中理解。这些是使用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抛出的本机堆栈跟踪。

1 个答案:

答案 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?