2015-02-09 24 views
-1

爲什麼lldb堅持要打印錯誤的數據 - 第一個ivar的價值,不管我要求哪個ivar?這是Xcode 5.1.1。是的,我用-O0編譯,符號不可剝離等爲什麼Xcode/lldb顯示錯誤數據?

(lldb) print *self (SMTestHarness) $13 = { NSObject = { isa = SMTestHarness } _dir = 0x00740520 @"/Users/lc/Projects/servermonitor/Test/unit-test" _ip = 0x007406b0 _domain = 0x007429f0 _sm = 0x00676900 _state = 0x00741980 _dsaSimulators = 0x00741d10 5 key/value pairs _timers = 0x00741f50 2 objects _originalWd = 0x007403f0 @"/Users/lc/Projects/servermonitor/Test" } (lldb) print _dir (NSString *) $14 = 0x00740520 @"/Users/lc/Projects/servermonitor/Test/unit-test" (lldb) print _ip (IPAddress *) $15 = 0x00740520 (lldb) print _domain (FirstPointDomain *) $16 = 0x00740520 (lldb) print _sm (ServerMonitorCrashTestDummy *) $17 = 0x00740520

有趣的是,在左側窗格中的變量顯示是正確的;它只是在lldb控制檯中的打印命令是錯誤的。

回答

0

如果您要打印對象,請使用「po」(打印對象)命令。

+0

這是無關緊要的。看看顯示的地址。他們錯了。 – 2015-02-09 23:44:24

1

的變量在Xcode查看不使用LLDB表達式分析器(即print命令)。主要這是因爲這將是非常低效的在每次步驟時間來解析表達式對每個局部變量&及其子元素。即使沒有這一點,全功能表達式解析器的方式也比您需要轉儲局部變量值的任務更具火力。

相反,LLDB有另一個子系統只是傾銷變量的內容(不調用函數或複雜的表達式,只是印刷值)。從命令行LLDB,你可以在與frame variable命令子系統。

瑣事該位可能不會幫你多,但也正因爲如此,你可以從「打印」運行於完全通用的表達式解析器和Xcode的當地人查看不同的結果...

你什麼但是,看到的是,lldb表達式解析器沒有獲取其包含的ObjC對象內的單個ivars的偏移值。表達式解析器認爲所有的ivars都是從對象開始的0偏移處 - 這實際上就是你的例子所顯示的。更具體地說 - 從你包含的例子 - 在使用1.0版Objective C Runtime調試32位應用程序時發生這種情況。

這是lldb中一個長期存在的bug。

如果您必須調試ObjectiveC 1.0 32位x86應用程序,那麼沒有很好的解決方法。如果你只有一個32位的機器,那麼你幾乎被卡在這裏,並且必須使用frame var。但是,如果您的計算機具有64位功能,除非有一些非常有說服力的理由來調試應用程序的32位分支,否則您可以轉而調試64位版本的應用程序,而這個問題應該消失。

請注意,儘管iOS模擬器運行32位代碼,但它使用的是ObjectiveC 2.0運行時,並沒有此錯誤。