【发布时间】: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