【问题标题】:Use lldb to debug native libraries with Xamarin使用 lldb 通过 Xamarin 调试本机库
【发布时间】:2015-09-20 09:00:04
【问题描述】:

Xamarin debugging documentation 表示:

使用 Xamarin Studio 的本机调试支持来调试 C# 和 其他托管语言代码并在需要调试 C 时使用 LLDB, 可能与 Xamarin.iOS 链接的 C++ 或 Objective C 代码 项目。

但是,我找不到任何有关如何使用 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: error on enabled probe ID 2475 (ID 194: syscall::ptrace:return): invalid user access in action #5 at DIF offset 0

当调用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 是邪恶的?

【问题讨论】:

  • 将 lldb 附加到 pid 应该可以,我一直这样做。你确定你使用的是正确的pid吗?你是从哪里弄来的?
  • 来自 Xcode。调试 -> 附加到进程 -> 可能的目标列出了我的应用程序及其 pid。 ps辅助www | grep App 给了我相同的 pid。应用是否需要处于特定状态?
  • 我几乎 100% 确定您正在尝试调试错误的 pid。你能显示完整的ps auxwww | grep App 输出你试图附加到其 pid 吗?
  • 嗯?在发表评论之前,您应该查看其他一些答案/cmets 和问题的更新。我 100% 确定我正在调试正确的 pid。
  • ps aux|grep App 通常会显示多个进程(如果从 IDE 启动),并且在其他任何一个 cmets 中,您都没有给出任何迹象表明这一事实,也没有在它们之间做出选择。您能否将“-v -v -v -v”添加到项目的 iOS 构建选项中的其他 mtouch 参数中并提供构建日志?如果构建输出中有私人信息,您可以提交私人错误 (bugzilla.xamarin.com),我们可以继续。

标签: ios xamarin xamarin.ios lldb xamarin-studio


【解决方案1】:

只有在其应用 plist 中设置了特定属性时,才能调试 Mac OS X 上的协同设计应用。你想要的东西看起来像:

<key>SecTaskAccess</key>
<array>
    <string>allowed</string>
    <string>debug</string>
</array>

您可以查看taskgated 的手册页,以获得对该过程的简要描述。

通常对于 Xcode 项目,此属性会被 Xcode 整合并插入到您的调试版本中,因此您无需执行任何操作即可实现此目的。

我不知道 Xamarin 是如何工作的,但它可能没有设置此属性。在旧的 OS X 系统上,root 可以调试任何东西,所以你可以尝试sudo -s,然后从那里调试。但是从优胜美地开始,不被调试的请求得到了更广泛的尊重......

【讨论】:

  • 谢谢。这很有趣,但它不起作用。修改 Info.plist 文件后,我得到同样的丢失连接错误。以 root 身份调试也有同样的错误。
  • 很奇怪。 lldb 使用一个调试代理(称为 debugserver),它实际上管理正在调试的程序。尝试运行失败的调试会话,然后在 Console.app 中查看系统日志并搜索 debugserver。您应该会看到来自 debugserver 的一些日志输出,并且通常如果负责执行这些策略的其他守护进程(通常是 taskgated)有任何安全问题,大约在同一时间会有一些来自它们的日志。那里可能有一些东西可以提供出问题的线索。
  • 每当我连接到进程时,调试服务器就会崩溃。崩溃报告链接:dropbox.com/s/9lizhl2quj9n0cc/…
  • 该崩溃是因为您尝试调试的应用程序已请求不通过使用“PT_DENY_ATTACH”控件调用 ptrace 函数来对其进行调试。当 debugserver(或任何调试代理)尝试附加到以这种方式标记自己的进程时,附加调用(崩溃日志中的 __ptrace)将完全像您的示例一样崩溃 - 执行此操作的苛刻方式,但它具有努力工作的优点。有人 - 大概是 Xamarin 的人 - 正在努力阻止您调试应用程序...您是否尝试过询问他们应该如何执行此操作?
  • 看起来 dtruss 有一个“-s”选项,当探针触发时会打印回溯。这可能会告诉你一些事情。
【解决方案2】:

您是否尝试过使用活动监视器中的 pid?在 Debug 中运行时,只需在 Activity Monitor 的搜索框中输入您的应用名称即可。

如果它仍然不起作用,您可以尝试创建一个新项目并附加到该项目以排除任何项目配置。

【讨论】:

  • 活动监视器中的 pid 与我使用 ps 得到的相同。但是,我确实尝试创建一个新的空项目,并且可以使用 lldb 附加到该应用程序。那么我的项目配置有什么问题呢?
【解决方案3】:

这恰好是 Xamarin 在试用版中施加的限制。升级到付费许可证后,这不再是问题。尽管 Xamarin 的网站说:

当您开始 Xamarin 试用版时,您可以访问完整的 Xamarin 业务功能集 30 天。

这显然不是完整的功能集,因为如果您使用的是本机库,它们会明确禁止将 lldb 附加到应用程序。我不确定这样做的原因,也许 Xamarin 的人可以对此发表评论。

说明

感谢 Jim Ingham 为我指明了正确的方向。 Xamarin 事件调试器附加到应用程序的方式是使用 PT_DENY_ATTACH 调用 ptrace。此系统调用使进程能够拒绝调试请求。 (Detailed Explanation)。

此外,Xamarin 不直接调用 ptrace 函数,而是尝试使用 syscall 方法 (link) 隐藏调用。

解决方法

如果您确实需要调试您的应用并且仍在使用试用版,这里有一个解决方法。 ptrace 系统调用是在函数mono_assembly_init_with_opt 中进行的,它发生在程序生命周期的早期。该函数不执行任何其他操作,可以跳过。由于函数是在进程开始时调用的,所以我们需要在调用函数之前附加 lldb。

步骤如下:

  1. 启动 lldb 并等待应用启动。
  2. 应用启动时,为mono_assembly_init_with_opt添加断点
  3. 恢复应用,当它在该函数处停止时,提前返回而不执行该函数。
  4. 之后,您可以使用 lldb 或将 Xcode 附加到应用程序并照常调试您的本机代码。

lldb 中的步骤:

(lldb) process attach --name AppName --waitfor
(lldb) b mono_assembly_init_with_opt    
(lldb) c
# when the thread breaks
(lldb) thread return 0
(lldb) c

【讨论】:

    猜你喜欢
    • 2020-08-07
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2015-12-20
    • 1970-01-01
    • 2016-01-02
    • 2022-12-07
    相关资源
    最近更新 更多