Xamarin调试文档指出:
使用Xamarin Studio的本地调试支持来调试C#和其他托管语言的代码,当您需要调试C,C ++或Objective C代码时(这些可能与您的Xamarin.iOS项目链接),请使用LLDB。
然而,我找不到任何关于如何使用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:syscall :: ptrace:return)时出错:在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有问题?
ps auxwww | grep App
输出以便确认你要附加的pid吗? - Rolf Bjarne Kvingeps aux|grep App
通常会显示多个进程(如果从 IDE 启动),而在其他评论中,您没有给出任何关于此事实的指示,也没有说明您是如何在它们之间进行选择的。您能否在项目的 iOS 构建选项中添加 "-v -v -v -v" 到额外的 mtouch 参数,并提供构建日志?如果构建输出中有私人信息,则可以提交私人错误报告(http://bugzilla.xamarin.com),我们可以在那里继续讨论。 - Rolf Bjarne Kvinge