2015-07-02 33 views
13

Xamarin debugging documentation表示:使用LLDB調試機庫與Xamarin

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進程崩潰。下面是崩潰報告的鏈接debugserverhttps://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是邪惡的?

+0

附加LLDB到PID應該工作,我做這一切的時候。你確定你使用正確的PID嗎?你從哪裏得到它的? –

+0

來自Xcode。調試 - >附加到進程 - >可能目標列出我的應用程序和它的PID。 ps auxwww | grep App給了我相同的pid。該應用程序是否需要處於特定狀態? –

+0

我幾乎100%肯定你正在嘗試調試錯誤的pid。你可以顯示完整的'ps auxwww | grep應用程序'輸出其pid你試圖附加? –

回答

0

這恰好是Xamarin在試用版中強加的限制。升級到付費許可後,這不再是問題。儘管Xamarin的網站上說:

When you begin a Xamarin Trial, you get access to the full Xamarin Business feature set for 30 days.

這顯然不是完整的功能集,因爲他們明確禁用,如果您使用的是本機庫安裝到LLDB應用。我不確定這麼做的原因,也許Xamarin的某個人可以對此發表評論。

說明

感謝Jim英厄姆指着我在正確的方向。 Xamarin事件調試器附加到應用程序的方式是通過PT_DENY_ATTACH調用ptrace。該系統調用使進程拒絕調試請求。 (Detailed Explanation)。

而不是直接調用ptrace函數,Xamarin試圖通過使用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 
1

您是否嘗試過使用活動監視器中的pid?在Debug中運行它時,只需在Activity Monitor的搜索框中輸入您的應用程序名稱即可。

如果它仍然無法正常工作,您可以嘗試創建一個新項目並附加到該項目上,以排除任何項目配置。

+0

Activity Monitor中的pid與我使用ps的pid相同。但是,我嘗試創建一個新的空項目,並使用lldb附加到該應用程序。那麼我的項目配置有什麼問題? –

2

Mac OS X上的代碼簽名應用只有在其應用plist中設置了特定屬性後才能進行調試。你想要的東西,看起來像:

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

你可以看一下的手冊頁taskgated這個過程有點簡潔的描述。

通常對於Xcode項目來說,這個屬性會被聚集起來並被Xcode插入到你的調試版本中,所以你不需要做任何事情就可以實現這一點。

我不知道Xamarin是如何工作的,但有可能它沒有設置這個屬性。在較舊的OS X系統上,root可以調試任何東西,所以你可以嘗試sudo -s,然後從那裏調試。但從優勝美地開始,請求不被調試正在得到更廣泛的尊重...

+0

謝謝。這很有趣,但它沒有奏效。修改Info.plist文件後,我得到相同的連接丟失錯誤。以root身份進行調試也具有相同的錯誤。 –

+1

很奇怪。 lldb使用調試代理(稱爲調試服務器)來實際管理正在調試的程序。嘗試運行失敗的調試會話,然後查看Console.app中的系統日誌並搜索調試服務器。您應該看到debugserver的一些日誌輸出,並且通常如果其他守護進程(通常是任務執行)有任何安全問題負責執行這些策略,則會在同一時間從它們接收一些日誌。那裏可能有些東西給出了錯誤的線索。 –

+0

當我連接到進程時,debugserver崩潰。鏈接到崩潰報告:https://www.dropbox.com/s/9lizhl2quj9n0cc/debugserver_2015-07-07-131423_gauss.crash?dl=0 –