Xamarin debugging documentation表示:
Use Xamarin Studio's native debugging support for debugging C# and other managed languages code and use LLDB when you need to debug C, C++ or Objective C codethat you might be linking with your Xamarin.iOS project.
但是我找不到任何关于如何使用 LLDB 调试 Xamarin 应用程序的文档。如果我在 iPhone 模拟器中运行我的应用程序并尝试使用 LLDB 附加到它,我会收到以下错误:
(lldb) attach --pid 37993
Process 37993 exited with status = -1 (0xffffffff) lost connection
error: attach failed: lost connection
使用 Xcode 附加也不起作用。我尝试了 attach
的不同变体,但没有一个起作用。
有人可以为我指明如何使用 LLDB 调试 Xamarin 应用程序的正确方向吗?此外,这是我可以在设备上做的事情,而不仅仅是在模拟器中吗?我没有找到有关如何使用 LLDB 附加到设备上的进程的任何信息。
更新
每当我使用 lldb
连接到我的二进制文件时,debugserver
进程似乎崩溃了。以下是 debugserver
崩溃报告的链接:
https://www.dropbox.com/s/9lizhl2quj9n0cc/debugserver_2015-07-07-131423_gauss.crash?dl=0
更新 2
当我在应用程序上运行 dtruss
时,它会打印系统调用,直到遇到
dtrace:启用探测 ID 2475 时出错(ID 194:系统调用::ptrace:返回):DIF 偏移量 0 处的操作 #5 中的用户访问无效
当某些东西调用 ptrace(PT_DENY_ATTACH, 0, 0, 0);
为什么要调用 PT_DENY_ATTACH
?
更新 3
我跟踪了对这个函数的 ptrace
系统调用:mono_assembly_init_with_opt
,它发生在程序生命周期的早期。该函数所做的只是调用 ptrace,因此如果我只是提前从该函数返回,我可以使用 lldb 进行调试。
基本上,我可以做到:
(lldb) process attach --name AppName --waitfor
# when the process starts
(lldb) b mono_assembly_init_with_opt
(lldb) c
# when the thread breaks
(lldb) thread return 0
(lldb) c
现在我可以愉快地使用 lldb 进行调试了。
但是,我不应该这样做。我的项目配置有问题吗(我可以使用 lldb 调试更简单的应用程序)或者 Xamarin 是邪恶的?
最佳答案
Mac OS X 上的协同设计应用程序只有在其应用程序列表中设置了特定属性时才能进行调试。你想要的东西看起来像:
<key>SecTaskAccess</key>
<array>
<string>allowed</string>
<string>debug</string>
</array>
您可以查看 taskgated
的手册页,以获得对该过程的简洁描述。
通常对于 Xcode 项目,此属性会被 Xcode 设置并插入到您的调试版本中,因此您无需执行任何操作即可实现此目的。
我不知道 Xamarin 是如何工作的,但它可能没有设置此属性。在旧的 OS X 系统上,root 可以调试任何东西,所以你可以尝试 sudo -s
然后从那里调试。但是从 Yosemite 开始,不被调试的请求得到了更广泛的尊重...
关于ios - 使用 lldb 通过 Xamarin 调试 native 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31191215/