【问题标题】:StackTrace without PDB loaded on Mono没有在 Mono 上加载 PDB 的 StackTrace
【发布时间】:2018-05-09 00:52:12
【问题描述】:

我试图从我正在开发的游戏的一些堆栈跟踪中找出意义。这些是在 Mac 上使用 Mono 生成的。

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我不知道 9fdab2ac823a429cb7b8525426626ccc 是什么

    哈希元素(在&lt;&gt; 之间)是模块版本ID(该方法所属的程序集模块的MVID

    这些是生成的,因此本机崩溃(来自 AOT 的应用程序)可以通过 Mono 的符号目录进行符号化,该目录在应用程序的编译/AOT 期间通过

    生成

    mono --aot=msym-dir=&lt;msym dir&gt; .....

    或在编译阶段之后使用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)来生成一个“正常”的托管代码看起来异常/堆栈跟踪。

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

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

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

    【讨论】:

    • 这是相当多的晦涩信息(我在 Google 上尝试了很多组合以找到有用的信息)。太感谢了!我只是抓住了他们的 github 的单符号,编译它,然后在我的游戏输出文件夹(仅包含 .exe/.dll/.pdb 文件)上执行两个命令,我可以立即反转我的堆栈跟踪!如果我知道这一点,这将为我节省几个小时滚动自己的解决方案,但这要优雅得多。再次感谢:)
    • @LennardFonteijn 没问题,很高兴它有帮助。 mono-symbolicate 根基于 Xamarin.iOSXamarin.Android,因此您可以象征从 ObjC 和 Java(通过 CIL 托管代码)移动应用程序发送到您的 Google/Apple 应用商店控制台的本机崩溃。但由于它是基于 mono 的,它当然适用于任何 Mono/.Net 应用程序。
    • 很多信息来自旧 Xamarin 版本的注释,很遗憾他们没有在更公开的文档中提供它(除了单存储库中的“隐藏”自述文件和Xamarin 的一些较旧的发行说明),因为它确实派上用场了 ?
    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2012-11-07
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多