【问题标题】:Xamarin.iOS- Debugging native crash in a bound library using GDBXamarin.iOS - 使用 GDB 在绑定库中调试本机崩溃
【发布时间】:2013-05-06 18:57:08
【问题描述】:

我有一个第三方库,我在该库上进行了绑定,并使用 XCode 为归档而构建。我在我的 C# Xamarin 应用程序中使用它。尽管如此,我还是遇到了无法通过 Xamarin Studio 调试的本机崩溃。我尝试将 gdb 附加到该进程,但收到以下警告:

warning: Could not find object file "/var/folders/mf/w59_1t797k3cfrp7hdmncvt40000gn/T/tmp42fc77da.tmp/libCouchCocoa.a(CouchEmbeddedServer.o)" - no debug information available for "CouchEmbeddedServer.m".


warning: Could not find object file "/var/folders/mf/w59_1t797k3cfrp7hdmncvt40000gn/T/tmp42fc77da.tmp/libCouchCocoa.a(CouchTouchDBDatabase.o)" - no debug information available for "CouchTouchDBDatabase.m".

[...]

然后,当 SIGSEGV 发生时,我使用 bt 函数并且我没有关于库中发生的事情的信息。我认为这与警告有关。

(gdb) continue
Continuing.

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000008
[Switching to process 98604 thread 0x28403]
0x0438509b in objc_msgSend ()
(gdb) bt
#0  0x0438509b in objc_msgSend ()
#1  0x112924f0 in ?? ()
#2  0x1714fdb0 in ?? ()
#3  0x17555a9c in ?? ()
#4  0x175557f6 in ?? ()
#5  0x17555200 in ?? ()
#6  0x17554c48 in ?? ()
#7  0x17554b4c in ?? ()
#8  0x17554af0 in ?? ()
#9  0x17554aac in ?? ()
#10 0x1718fb1c in ?? ()
#11 0x1718f6dc in ?? ()
#12 0x1718f5d8 in ?? ()
#13 0x0b6c0c8e in ?? ()
#14 0x000a3172 in mono_jit_runtime_invoke (method=0xca60dac, obj=0x10ec7490, params=0xb0974eec, exc=0xb0974ef4) at mini.c:5804
#15 0x0020840e in mono_runtime_invoke (method=0xca60dac, obj=0x10ec7490, params=0xb0974eec, exc=0xb0974ef4) at object.c:2790
#16 0x0020857c in mono_runtime_delegate_invoke (delegate=0x10ec7490, params=0xb0974eec, exc=0xb0974ef4) at object.c:3462
#17 0x002629b4 in mono_async_invoke [inlined] () at :626
#18 0x002629b4 in async_invoke_thread (data=0xc71f870) at threadpool.c:1443
#19 0x00268756 in start_wrapper_internal [inlined] () at :784
#20 0x00268756 in start_wrapper (data=0x1128e680) at threads.c:832
#21 0x0029a69a in thread_start_routine (args=0xfa46204) at wthreads.c:287
#22 0x00245540 in gc_start_thread (arg=0x112922a0) at sgen-gc.c:6280
#23 0x98a89ed9 in _pthread_start ()
#24 0x98a8d6de in thread_start ()
(gdb) 

我应该如何构建我的第三方库,以便 gdb 设法找到有关它们的调试信息?

编辑:使用 p mono_pmip,我设法获得了去符号化的方法名称,但有没有办法不必这样做并拥有调试符号?

【问题讨论】:

    标签: xamarin.ios gdb xamarin


    【解决方案1】:

    如果你在设备上使用 gdb,你可能会更幸运。

    这可以使用fruitstrap 来完成(请注意,Xamarin 不正式支持fruitstrap - 我只能说我自己偶尔也可以使用它)。

    在模拟器中更难的原因是因为我们在那里使用了 JIT——这意味着内存地址和函数名/行号之间的映射只存在于内存中,gdb 无法理解。在为设备构建时,我们将所有内容 AOT 到 ARM 程序集并且我们创建 gdb 可以理解的正确调试信息。

    【讨论】:

    • 所以基本上,在设备上,我会得到与 mono_pmip 相同的信息,或者我会在本机库中有更深的堆栈跟踪吗?因为这与您回答的另一个问题有关,我没有设法使用 gdb (stackoverflow.com/questions/15957609/…) 获得任何额外信息
    • 您将获得与 mono_pmip 相同的信息(无需使用 mono_pmip) - 此外 gdb 将能够检查局部变量并显示 C# 代码。
    • 目前,mono_pmip 能够对我的一些堆栈跟踪进行去符号化,但是在对堆栈跟踪的本机部分进行去符号化时,它没有成功。它必须与调试信息警告有关。我会按照你的建议尝试水果带,谢谢 Rolf!
    • mono_pmip 只能符号化托管帧。 gdb 应该能够符号化本机框架(它在您在此问题中发布的堆栈跟踪中所做的)。
    • 我尝试了 fruistrap,当我开始调试时,我收到以下错误(我不知道 XMCustomView 是什么):gist.github.com/airpaulg/d6a93b5e2f96d8f3f581
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多