2012-04-20 16 views
7

我試圖通過一些時髦的UIView行爲進行調試,並且我一直在遇到LLDB絕對無用和誤導的情況。讓我告訴你我是什麼意思:爲什麼有效對象顯示爲無使用lldb? (Apple LLVM編譯器3.1,Xcode 4.3.1)

NSLog(@"myView: %@", myView); 

2012-04-20 15:24:57.070 myProj[35789:f803] myView: <MyView: 0x7cc7500; frame = (0 119; 768 885); layer = <CALayer: 0x7cc8030>> 

但是,當我就在那個時候設置一個斷點,並嘗試使用調試器,則返回nil:

(lldb) po myView 
(MyView *) $552 = 0x00000000 <nil> 

我會嘗試轉移到GCC 4.2看看它是否有幫助,但在LLVM GCC 4.2下編譯不是一個選項,因爲這是一個ARC項目。

當然,如果我已經知道查詢的正確地址,LLDB將工作。但是符號名稱和地址之間的鏈接似乎對於某些對象來說是破碎的,儘管它適用於大多數其他對象。

(lldb) po self 
(MyViewController *const) $51 = 0x07e92200 <MyViewController: 0x7e92200> 
(lldb) po myView 
(MyView *) $25 = 0x00000000 <nil> 
2012-04-20 15:44:17.250 myProject[37551:f803] myView: <MyView: 0x7e8e240; frame = (0 119; 768 885); layer = <CALayer: 0x7ea2330>> 
(lldb) po 0x7e8e240 
(int) $50 = 132702784 <MyView: 0x7e8e240; frame = (0 119; 768 885); layer = <CALayer: 0x7ea2330>> 

我該如何解決這個問題?我甚至嘗試過self> myView,這也沒有效果。

更新:(更糟糕!)

我要補充一點,MyView的是一個類變量,而不是一個屬性,在這個例子中(其中LLDB同夥它與無)。 如果我使myView屬性和@synthesize它,lldb將獲得一個不正確的但可預測的值,它會將myView符號與@synthesize之前最近綜合的屬性相關聯。所以在我的情況下,代碼是這樣的:

@synthesize myDate=myDate_; 
@synthesize myView; 

所以在評估來自LLDB MyView的屬性時,顯示存儲在myDate_日期:

(lldb) po myView 
(MyView *) $24 = 0x07ca0900 2008-01-08 05:00:00 +0000 

在最後一種情況,如果我做myView方法變量,LLDB將是正確的:

(lldb) po myView 
(UIView *) $7 = 0x07d81080 <MyView: 0x7d81080; frame = (0 119; 768 885); layer = <CALayer: 0x7d81b70>> 

這聽起來像是LLDB本身非常明顯的錯誤。

更新2:

進一步的研究:它看起來像所有的類屬性是錯誤的!列表中的第一個屬性在LLDB中顯示爲零值,其他所有屬性顯示在其之前合成的值。

難道這是一個奇怪的配置錯誤?

+0

順便說一句,你不必爲了使用gdb而重新編譯你的應用程序和gcc前端。如果您想使用gdb,只需將您的方案的調試器更改爲gdb。您可以繼續使用LLVM3和ARC進行編譯。 – 2012-04-20 22:20:25

+0

如果myView是一個屬性,你是否嘗試過訪問屬性本身:'po [self myView]' – 2012-04-20 22:22:37

+0

是的,我有。同樣的問題。 – AlleyGator 2012-04-23 16:32:07

回答

0

該解決方案似乎是:在嘗試使用調試器時避免在模擬器中進行測試。一旦我開始對設備進行測試,所有瘋狂都消失了,它開始按預期工作。如果我回到模擬器,我又看到了同樣的錯誤。屬性和方法變量似乎在模擬器中都有問題。

+0

很高興聽到你把它修好了! :) – slf 2012-04-23 13:52:46

+0

更新:Xcode 4.3.1上的lldb在使用模擬器時有一個錯誤。 我對此提出了一個雷達,並在4.4.1中修復了Apple。 http://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/_index.html#//apple_ref/doc/uid/TP40001051-SW163 – AlleyGator 2012-10-23 16:51:56

0
frame variable -o myView 

More here在「正在檢查棧幀狀態」標題下。

+0

(LLDB)幀可變MyView的 誤差:無命名變量在該幀中的 – AlleyGator 2012-04-20 20:31:51

+0

-O參數「MyView的」找到的工作方式類似於: (LLDB)幀可變-O MyView的 誤差:無命名變量在這個「MyView的」發現幀 – AlleyGator 2012-04-20 20:36:40

+0

所以我意識到我正在測試模擬器的速度,並對設備進行測試。 LLDB開始工作完美。 再次對模擬器進行測試:再次破壞。 對設備進行測試:再次固定。 所以我想這個故事的寓意是LLDB可能會在模擬器中有未定義的錯誤。 – AlleyGator 2012-04-20 21:20:52

8

確保您的生成配置設置爲調試,而不是AdHoc,Release或其他刪除調試符號或禁止在權利文件中進行調試的其他內容。

這只是因爲我忘了在爲我的設備創建ad hoc構建之後將配置切換回Debug。奇怪的是,大多數的應用程序工作,但某些堆棧框架將失敗默默無聞地莫名其妙,所有變量(包括self)無零或錯位。

+0

真棒。 :)你救了我一個$$ – alternatiph 2014-11-09 09:41:58

相關問題