Xcode中使用LLDB調(diào)試

在Xcode中調(diào)試程序

對于我們?nèi)粘5拈_發(fā)工作來說,更多的時候是在Xcode中進(jìn)行調(diào)試工作。因此上面所描述的流程,其實Xcode已經(jīng)幫我們完成了大部分的工作,而且很多東西也可以在Xcode里面看到。因此,我們可以把精力都集中在代碼層面上。

蘋果的官方文檔中列出了我們在調(diào)試中能用到的一些命令,我們在這重點講一些常用的命令。

打印

打印變量的值可以使用print命令,該命令如果打印的是簡單類型,則會列出簡單類型的類型和值。如果是對象,還會打印出對象指針地址,如下所示:

(lldb) print a
(NSInteger) $0 = 0
(lldb) print b
(NSInteger) $1 = 0
(lldb) print str
(NSString *) $2 = 0x0000000100001048 @"abc"
(lldb) print url
(NSURL *) $3 = 0x0000000100206cc0 @"abc"

在輸出結(jié)果中我們還能看到類似于$0,$1這樣的符號,我們可以將其看作是指向?qū)ο蟮囊粋€引用,我們在控制面板中可以直接使用這個符號來操作對應(yīng)的對象,這些東西存在于LLDB的全名空間中,目的是為了輔助調(diào)試。如下所示:

(lldb) exp $0 = 100
(NSInteger) $9 = 100
(lldb) p a
(NSInteger) $10 = 100

另外$后面的數(shù)值是遞增的,每打印一個與對象相關(guān)的命令,這個值都會加1。
上面的print命令會打印出對象的很多信息,如果我們只想查看對象的值的信息,則可以使用po(print object的縮寫)命令,如下所示:

(lldb) po str
abc

當(dāng)然,po命令是"exp -O --"命令的別名,使用"exp -O --"能達(dá)到同樣的效果。
對于簡單類型,我們還可以為其指定不同的打印格式,其命令格式是print/,如下所示:

(lldb) p/x a
(NSInteger) $13 = 0x0000000000000064

格式的完整清單可以參考Output Formats。

expression

在開發(fā)中,我們經(jīng)常會遇到這樣一種情況:我們設(shè)置一個視圖的背景顏色,運行后發(fā)現(xiàn)顏色不好看。嗯,好吧,在代碼里面修改一下,再編譯運行一下,嗯,還是不好看,然后再修改吧~~這樣無形中浪費了我們大把的時間。在這種情況下,expression命令強大的功能就能體現(xiàn)出來了,它不僅會改變調(diào)試器中的值,還改變了程序中的實際值。我們先來看看實際效果,如下所示:

(lldb) exp a = 10
(NSInteger) $0 = 10
(lldb) exp b = 100
(NSInteger) $1 = 100
2015-01-25 14:00:41.313 test[18064:71466] a + b = 110, abc

expression命令的功能不僅于此,正如上面的po命令,其實際也是"expression -O --"命令的別名。更詳細(xì)使用可以參考Evaluating Expressions。

image

image命令的用法也挺多,首先可以用它來查看工程中使用的庫,如下所示:

(lldb) image list
[  0] 432A6EBF-B9D2-3850-BCB2-821B9E62B1E0 0x0000000100000000 /Users/**/Library/Developer/Xcode/DerivedData/test-byjqwkhxixddxudlnvqhrfughkra/Build/Products/Debug/test 
[  1] 65DCCB06-339C-3E25-9702-600A28291D0E 0x00007fff5fc00000 /usr/lib/dyld 
[  2] E3746EDD-DFB1-3ECB-88ED-A91AC0EF3AAA 0x00007fff8d324000 /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation 
[  3] 759E155D-BC42-3D4E-869B-6F57D477177C 0x00007fff8869f000 /usr/lib/libobjc.A.dylib 
[  4] 5C161F1A-93BA-3221-A31D-F86222005B1B 0x00007fff8c75c000 /usr/lib/libSystem.B.dylib 
[  5] CBD1591C-405E-376E-87E9-B264610EBF49 0x00007fff8df0d000 /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation 
[  6] A260789B-D4D8-316A-9490-254767B8A5F1 0x00007fff8de36000 /usr/lib/libauto.dylib 

我們還可以用它來查找可執(zhí)行文件或共享庫的原始地址,這一點還是很有用的,當(dāng)我們的程序崩潰時,我們可以使用這條命令來查找崩潰所在的具體位置,如下所示:

NSArray *array = @[@1, @2];
NSLog(@"item 3: %@", array[2]);

這段代碼在運行后會拋出如下異常:

2015-01-25 14:12:01.007 test[18122:76474] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 2 beyond bounds [0 .. 1]'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff8e06f66c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff886ad76e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff8df487de -[__NSArrayI objectAtIndex:] + 190
    3   test                                0x0000000100000de0 main + 384
    4   libdyld.dylib                       0x00007fff8f1b65c9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

根據(jù)以上信息,我們可以判斷崩潰位置是在main.m文件中,要想知道具體在哪一行,可以使用以下命令:

(lldb) image lookup --address 0x0000000100000de0
      Address: test[0x0000000100000de0] (test.__TEXT.__text + 384)
      Summary: test`main + 384 at main.m:23

可以看到,最后定位到了main.m文件的第23行,正是我們代碼所在的位置。
我們還可以使用image lookup命令來查看具體的類型,如下所示:

(lldb) image lookup --type NSURL
Best match found in /Users/**/Library/Developer/Xcode/DerivedData/test-byjqwkhxixddxudlnvqhrfughkra/Build/Products/Debug/test:
id = {0x100000157}, name = "NSURL", byte-size = 40, decl = NSURL.h:17, clang_type = "@interface NSURL : NSObject{
    NSString * _urlString;
    NSURL * _baseURL;
    void * _clients;
    void * _reserved;
}
@property ( readonly,getter = absoluteString,setter = <null selector>,nonatomic ) NSString * absoluteString;
@property ( readonly,getter = relativeString,setter = <null selector>,nonatomic ) NSString * relativeString;
@property ( readonly,getter = baseURL,setter = <null selector>,nonatomic ) NSURL * baseURL;
@property ( readonly,getter = absoluteURL,setter = <null selector>,nonatomic ) NSURL * absoluteURL;
@property ( readonly,getter = scheme,setter = <null selector>,nonatomic ) NSString * scheme;
@property ( readonly,getter = resourceSpecifier,setter = <null selector>,nonatomic ) NSString * resourceSpecifier;
@property ( readonly,getter = host,setter = <null selector>,nonatomic ) NSString * host;
@property ( readonly,getter = port,setter = <null selector>,nonatomic ) NSNumber * port;
@property ( readonly,getter = user,setter = <null selector>,nonatomic ) NSString * user;
@property ( readonly,getter = password,setter = <null selector>,nonatomic ) NSString * password;
@property ( readonly,getter = path,setter = <null selector>,nonatomic ) NSString * path;
@property ( readonly,getter = fragment,setter = <null selector>,nonatomic ) NSString * fragment;
@property ( readonly,getter = parameterString,setter = <null selector>,nonatomic ) NSString * parameterString;
@property ( readonly,getter = query,setter = <null selector>,nonatomic ) NSString * query;
@property ( readonly,getter = relativePath,setter = <null selector>,nonatomic ) NSString * relativePath;
@property ( readonly,getter = fileSystemRepresentation,setter = <null selector> ) const char * fileSystemRepresentation;
@property ( readonly,getter = isFileURL,setter = <null selector>,readwrite ) BOOL fileURL;
@property ( readonly,getter = standardizedURL,setter = <null selector>,nonatomic ) NSURL * standardizedURL;
@property ( readonly,getter = filePathURL,setter = <null selector>,nonatomic ) NSURL * filePathURL;
@end"

可以看到,輸出結(jié)果中列出了NSURL的一些成員變量及屬性信息。
image命令還有許多其它功能,具體可以參考Executable and Shared Library Query Commands。

參考

轉(zhuǎn)載自: 南峰子的技術(shù)博客 (LLDB調(diào)試器使用簡介)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容