日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

控制台命令调试(bt)

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 控制台命令调试(bt) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一、LLVM簡介

LLVM是構架編譯器(compiler)的框架系統,以C++編寫而成,用于優化以任意程序語言編寫的程序的編譯時間(compile-time)、鏈接時間(link-time)、運行時間(run-time)以及空閑時間(idle-time),對開發者保持開放,并兼容已有腳本。

第二、 對關注編譯技術的開發人員,LLVM提供了很多優點:

現代化的設計 LLVM的設計是高度模塊化的,使得其代碼更為清晰和便于排查問題所在。 語言無關的中間代碼 一方面,這使得透過LLVM能夠將不同的語言相互連結起來;也使得LLVM能夠緊密地與IDE交互和集成。 另一方面,發布中間代碼而非目標代碼能夠在目標系統上更好地發揮其潛能而又不傷害可調試性(i.e. 在目標系統上針對本機的硬件環境產生目標代碼,但又能夠直接通過中間代碼來進行行級調試) 作為工具和函數庫 使用LLVM提供的工具可以比較容易地實現新的編程語言的優化編譯器或VM,或為現有的編程語言引入一些更好的優化/調試特性。 第三、使用前提:

1.既然是調試命令,理所當然的,程序模式應該選擇Debug模式。

2.在Debug模式下,如果你的程序在運行中崩潰(Crash)掉,那么恭喜你,使用lldb調試的機會來了。

符合以上兩個條件之后,控制臺(即日志輸出窗口All Output)會自動打出一個(lldb)命令,此時你就可以進行調試。

第四、常用的調試命令

po

po是print-object的簡寫,可用來打印所有NSObject對象。sample code:

(lldb)?po self.view

<UITableView: 0xdb00200; frame = (0 20; 320 460); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8b3ca50>; layer = <CALayer: 0x8b3c110>; contentOffset: {0, 0}>

(lldb)?po self

<RootViewController: 0x9813e90>

p

p是print的簡寫,可以用來打印所有的簡單類型,如int, float,結構體等。sample code:

[objc]?view plaincopyprint?
  • ItemData?item;??
  • ????????item.nMainID=1;??
  • ????????item.nSubID=2;??
  • ????????item.pszTitle=@"hello";??
  • ??????
  • ????????NSRect?rect=NSMakeRect(0,?10,?10,?10);??
  • ? ?調試命令及輸出結果:

    (lldb)?print rect

    (NSRect) $0 = (x=0, y=10), (width=10, height=10)

    (lldb)?p item

    (ItemData) $3 = {

    ? pszTitle = 0x0000000100001370 @"hello"

    ? nMainID = 1

    ? nSubID = 2

    }

    call

    call即是調用的意思。其實上述的po和p也有調用的功能。因此一般只在不需要顯示輸出,或是方法無返回值時使用call

    bt

    這時Xcode會自動輸出最后的一次調用堆棧

    (lldb)?bt

    * thread #1: tid = 0x101ea, 0x00002cdf tabaleView`-[RootViewController initWithStyle:](self=0x09813e90, _cmd=0x009b99c2, style=UITableViewStylePlain) + 127 at RootViewController.m:23, queue = 'com.apple.main-thread, stop reason = breakpoint 1.1

    ? ? frame #0: 0x00002cdf tabaleView`-[RootViewController initWithStyle:](self=0x09813e90, _cmd=0x009b99c2, style=UITableViewStylePlain) + 127 at RootViewController.m:23

    ? ? frame #1: 0x004e5add UIKit`-[UITableViewController init] + 41

    ? ? frame #2: 0x00002852 tabaleView`-[AppDelegate application:didFinishLaunchingWithOptions:](self=0x08c0d610, _cmd=0x00998cd4, application=0x08a1f160, launchOptions=0x00000000) + 546 at AppDelegate.m:19

    ? ? frame #3: 0x00224355 UIKit`-[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 309

    ? ? frame #4: 0x00224b95 UIKit`-[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1536

    ? ? frame #5: 0x002293a8 UIKit`-[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 824

    ? ? frame #6: 0x0023d87c UIKit`-[UIApplication handleEvent:withNewEvent:] + 3447

    ? ? frame #7: 0x0023dde9 UIKit`-[UIApplication sendEvent:] + 85

    ? ? frame #8: 0x0022b025 UIKit`_UIApplicationHandleEvent + 736

    ? ? frame #9: 0x036e02f6 GraphicsServices`_PurpleEventCallback + 776

    ? ? frame #10: 0x036dfe01 GraphicsServices`PurpleEventCallback + 46

    ? ? frame #11: 0x016b4d65 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53

    ? ? frame #12: 0x016b4a9b CoreFoundation`__CFRunLoopDoSource1 + 523

    ? ? frame #13: 0x016df77c CoreFoundation`__CFRunLoopRun + 2156

    ? ? frame #14: 0x016deac3 CoreFoundation`CFRunLoopRunSpecific + 467

    ? ? frame #15: 0x016de8db CoreFoundation`CFRunLoopRunInMode + 123

    ? ? frame #16: 0x00228add UIKit`-[UIApplication _run] + 840

    ? ? frame #17: 0x0022ad3b UIKit`UIApplicationMain + 1225

    ? ? frame #18: 0x00002c2d tabaleView`main(argc=1, argv=0xbfffee5c) + 141 at main.m:16


    總結

    以上是生活随笔為你收集整理的控制台命令调试(bt)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。