Xamarin 和 Xamarin 表单的符号包(PDB 文件)

Posted

技术标签:

【中文标题】Xamarin 和 Xamarin 表单的符号包(PDB 文件)【英文标题】:Symbol Package (PDB-file) for Xamarin and Xamarin Forms 【发布时间】:2018-02-16 13:06:55 【问题描述】:

我们每天都在使用 Xamarin 和 Xamarin Forms,并且经常遇到异常而没有任何有用的调试信息。

有时这是我们的问题,有时是 Xamarin 中的错误,尤其是 Xamarin Forms。

最常见的例外是NullReferenceException,我们很难对其进行故障排除。

如果我们可以访问 Xamarin Forms 符号,那么通过单步调试我们的代码和 Xamarin 代码来查明问题会容易得多。

有没有办法获得 Xamarin 符号包,即带有 nuget 的 pdb 文件?

(直接从源代码编译会在使用 3rd 方包时产生问题)。

【问题讨论】:

【参考方案1】:

如果您检查 Xamarin.Forms 包,它包含 mdbpdb 文件,因此从技术上讲,您可以通过 Xamarin.Forms 代码进行调试。

如果你想通过 Xamarin.Forms 代码,你可以检查这个“hack”,它包括自动修改编译目标的 pdb 文件。

https://forums.xamarin.com/discussion/73572/debug-stepping-into-own-nuget-package


如果您发现错误并且堆栈仅显示本机代码

您可以使用单声道命令行。

您可以使用函数mono_print_method_from_ip(接受地址)来获取给定地址的方法的名称。这在检查堆栈跟踪时特别有用。该函数在 Mono 1.1.x 系列中被重命名为 mono_pmip(有一段时间该函数被称为 mono_print_method_from_ip)。

例如,当遇到堆栈跟踪时,如下所示:

(gdb) where
#0  ves_icall_System_String_GetHashCode (me=0x80795d0) at string-icalls.c:861
#1  0x0817f490 in ?? ()
#2  0x0817f42a in ?? ()
#3  0x0817f266 in ?? ()
#4  0x0817f1a5 in ?? ()

您可以使用 mono_print_method_from_ip 函数(如果您使用 Mono 1.1.x,则为 mono_pmip)找出每个地址的方法:

(gdb) p mono_pmip (0x0817f490)
IP 0x817f490 at offset 0x28 of method (wrapper managed-to-native) System.String:GetHashCode () (0x817f468 0x817f4a4)
$1 = void
(gdb) p mono_pmip (0x0817f42a)
IP 0x817f42a at offset 0x52 of method System.Collections.Hashtable:GetHash (object) (0x817f3d8 0x817f43b)
$2 = void

参考http://www.mono-project.com/docs/debug+profile/debug/

【讨论】:

以上是关于Xamarin 和 Xamarin 表单的符号包(PDB 文件)的主要内容,如果未能解决你的问题,请参考以下文章

从 xamarin.mac / xamarin.forms 的编辑菜单中删除表情符号和符号

带有 xamarin 表单的 xamarin 本机视图加载缓慢

Xamarin:用于 Android 和 Windows UWP 的 Xamarin 表单中的分组列表的垂直字母索引(跳转列表)

Xamarin 表单 TabbedPage

Xamarin 表单的 ANPR

TeamCity 上的 Xamarin 表单:Xamarin.Forms 任务与目标不匹配