2015-10-15 66 views
1

我得到這個錯誤,我是否需要使用特定語法來使用枚舉LLDB如何在lldb中使用枚舉

(lldb) expr NSString *$text = [[NSString alloc] initWithData:$data encoding:NSUTF8StringEncoding] 
error: use of undeclared identifier 'NSUTF8StringEncoding' 
error: 1 errors parsing expression 

注:使用而不是枚舉的實際數據時在我的背景和正確類型的

編輯有效,我得到

expr NSString *$text = [[NSString alloc] initWithData:$data encoding:(NSStringEncoding)4] 
error: no known method '-initWithData:encoding:'; cast the message send to the method's return type 
error: 1 errors parsing expression 

我有試過並且沒有投到(NSStringEncoding)

解決方案因爲我用-initWithData使用的值

expr NSString *$text = (NSString *)[[NSString alloc] initWithData:$data encoding:4] 

:編碼:(與編碼類型NSUInteger的)LLDB不能推斷出整個方法的返回類型,所以我不得不把返回類型好。

回答

4

有對枚舉調試信息和搜索符號LLDB的模式,因而是非常昂貴之間的不匹配來搜索特定的枚舉值,如果未指定枚舉名稱。目前,如果其他一些操作沒有導致enum調試信息被引入,lldb將不會找到它。不幸的是,NSStringEncoding枚舉是一個匿名枚舉,所以不可能通過name :: value指定一個值。

如果您正在使用的Xcode 7.x的,但是,你可以導入基礎模塊中進行表達LLDB使用與解析編譯:

(lldb) expr @import Foundation 

然後LLDB會發現這個枚舉值(和許多其他像宏和更精確的方法類型)

注意,如果你覺得這個很有用,並且你正在使用Xcode,你可以通過在main上設置一個符號斷點來自動實現這個,用這個調試器命令添加一個「action」 ,並將其設置爲自動繼續。

一旦該功能在野外有更多時間出現,我們可能會自動執行此操作。

+0

太棒了!感謝您的詳細解釋和提示。 – taiyungo

1

NSUTF8StringEncoding是NSUInteger枚舉,它等於4:

typedef NSUInteger NSStringEncoding; 
... 
NSUTF8StringEncoding = 4, 

所以對於LLDB命令,您可以通過水木清華這樣的:

(lldb) po [[NSString alloc] initWithData:$data encoding:4] 
+0

感謝您的答案我剛纔已經想通了,實際上有一種方法可以直接使用enum而不是它的值嗎? – taiyungo

1

請參閱本nice blog使用lldb調試器命令。

您的解決方案是直接通過枚舉值NSUTF8StringEncoding這樣的:

expr NSString *$text = (NSString *)[[NSString alloc] initWithData:data encoding:4] 
+0

感謝您的答案,我剛剛已經想通了,是否真的有直接使用enum而不是其值的方法? – taiyungo

+0

嗯,我不這麼認爲。儘管我很想看到這樣的選擇! – Abhinav

+0

'expr NSString * $ text = [[NSString alloc] initWithData:$ data encoding:(NSUInteger)4] 錯誤:沒有已知方法'-initWithData:encoding:';將消息發送到方法的返回類型 錯誤:解析表達式1錯誤你也明白了嗎? – taiyungo