xcode ios gdb

先要說點關於ios的事.ios

你們開發ios時用的最多的軟件是xcode.在蘋果步步推廣llvm的同時。也在步步推廣lldb. (llvm對應gcc),(lldb對應gdb) 好在lldb裏面對應的調試命令跟gdb裏沒太大區別。因此學好gdb,到時轉lldb。能夠寫一篇10分鐘精通lldb..:) 學習起來能夠參考的東西也比較多。推薦看一本書《the art of debugging with gdb ,ddd and eclipse c++

gdb--命令行調試器。雖然說xcode比較強大,可是命令行調試可讓你更精確的調試。並且這在不少操做系統裏都是能夠通用的命令。因此學好gdb這個調試器祖先。應付xcode的調試就能夠輕車熟路。xcode

先入個門.而後像跑hello,world同樣跑一個hello,gdb,因此,主要說如下兩點app

 

1.配置gdb調試環境 eclipse

2.hello gdb!學習

3.FAQ 優化

 

 

 

配置gdb調試環境spa

 

若是你環境已經正確.請跳過這節.驗證方式 在命令行裏敲gdb,會出現gdb的版權信息.操作系統

   1: bogon:enviro zk$ gdb命令行

   2: GNU gdb 6.3.50-20050815 (Apple version gdb-1820) (Sat Jun 16 02:40:11 UTC 2012)

   3: Copyright 2004 Free Software Foundation, Inc.

   4: GDB is free software, covered by the GNU General Public License, and you are

   5: welcome to change it and/or distribute copies of it under certain conditions.

   6: Type "show copying" to see the conditions.

   7: There is absolutely no warranty for GDB.  Type "show warranty" for details.

   8: This GDB was configured as "x86_64-apple-darwin".

   9: (gdb) 

xcode4.3後。在xcode以單獨的app發佈。至關於綠色軟件。因此,若是你以前用如下命令行卸載過xcode

 

sudo /Developer/Library/uninstall-devtools --mode=all

 

請在命令行下執行,否則你會在命令行中找不到gdb :(

 

xcode-select -swith  當前xcode.app/Contents/Developer 所在路徑 

 

好比說,我如今的的xcode.app 放在

 

/Volums/Workspace/Xcode.app

 

那麼就執行

xcode-select -switch /Volums/Workspace/Xcode.app/Contents/Developer 

 

 

 

hello gdb!

 

首先準備好咱們的調試文件test.cpp  以下

#include <iostream>

int main()

{

  int i=0;

  i=10;

  std::cout<<"hello,gdb"<<i<<std::endl;

   return 0;

 

  

 

編譯之。。

 

gcc -lStdC++ -g -Wall -o test test.cpp  

 

或者用  

 

g++ -g -o test test.cpp   

 

爲簡單起見 之後通用g++  ,這是GNU默認的c++編譯器。
   參數解釋:
      -g 產生相應的調試信息,
      -o 編譯產生後的文件名 在這裏也就test準備開始調試 執行gdb載入要調試的程序(注意,這裏並沒開始執行test,只是載入)

 

gdb test

 

這個時候。你會看到命令行以下輸出

Codebogon:pg_019 cubase01$ gdb test 

GNU gdb 6.3.50-20050815 (Apple version gdb-1820) (Sat Jun 16 02:40:11 UTC 2012) 

Copyright 2004 Free Software Foundation, Inc. 

GDB is free software, covered by the GNU General Public License, and you are 

welcome to change it and/or distribute copies of it under certain conditions. 

Type "show copying" to see the conditions. 

There is absolutely no warranty for GDB.  Type "show warranty" for details. 

This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries ... done 

(gdb) 

 

此時,讓咱們開始在調試環境下執行test,輸入

run

 

 

你將看到輸出

 

(gdb) run 

Starting program: /Users/Desktop/Debugging/test 

Reading symbols for shared libraries ++......................... done 

hello,gdb10 

Program exited normally. 

 

好了,以上的步驟,就至關於你在xcode裏用debug模式運行程序。

讓程序在運行中停下來
gdb中,有3種方式讓程序停下來。

1.breakpoint  這種形式是咱們最經常使用的,反映在xcode裏就是在行前雙擊。產生一個藍色的標籤。
2.watchpoint  這種用的也多,若是你要監測一段內存是否發生變化。或者說一個變量是否發生變化,能夠用它。
3.catchpoint  這種形式是當特色形式的事件發生時,會中止程序運行。好比說,系統拋異常了。這個在xcode裏也比較經常使用 ,捕獲異常時很是方便,能讓開發人員很快的定位到代碼中拋異常的位置。

3point GNU中統稱breakpoint--斷點GNU 參考 。比較囧 ,固然。重點說1.breakpoint 的應用。

有如下用法

break 3       //在當前調試的文件中的第3行中止程序
break main   //在當前調試的文件中的symbol table中找main這樣的名字。若是找到。則中止程序。
break test.cpp:3    // test.cpp文件中的第3行中止程序
break test.cpp:main  //test.cpp文件的symbol table中找main這樣的名字。若是找到。則中止程序。

你能夠在命令行裏執行以上全部

 

(gdb) b 3   

Breakpoint 1 at 0x100000d34: file test.cpp, line 3. 

(gdb) b main 

Note: breakpoint 1 also set at pc 0x100000d34. 

Breakpoint 2 at 0x100000d34: file test.cpp, line 4. 

(gdb) b test.cpp:3 

Note: breakpoints 1 and 2 also set at pc 0x100000d34. 

Breakpoint 3 at 0x100000d34: file test.cpp, line 4. 

(gdb) b test.cpp:main 

Note: breakpoints 1, 2 and 3 also set at pc 0x100000d34. 

Breakpoint 4 at 0x100000d34: file test.cpp, line 4. 

 

查看一下斷點的狀況

執行

 

info break  

 

這命令有點長,你能夠用縮寫 i b
關於縮寫,gdb遵循一個這樣的原則。只要縮寫不會產生歧義。任何縮寫均可以
好比說 info break
我打如下命令均可以 

 

i b 

i bre 

i break 

i bre 

 

執行i b 後,顯示以下

gdb) i b 

Num Type           Disp Enb Address            What 

1   breakpoint     keep y   0x0000000100000d34 in main at test.cpp:3 

2   breakpoint     keep y   0x0000000100000d34 in main at test.cpp:4 

3   breakpoint     keep y   0x0000000100000d34 in main at test.cpp:4 

4   breakpoint     keep y   0x0000000100000d34 in main at test.

 

 

以上各行含義解釋以下
Num
這是一個斷點的標示id,之後有須要索引這個斷點的地方全靠它。
Type

如咱們前面所說。這是3個斷點中的一種
Disp

縮寫(Dispensable),表明的意思就說能不能被自動刪掉。有一處斷點叫臨時斷點。就是中斷一次後。斷點就被刪除了,下次再通過時,不會中斷 tbreak  3 (在第3行設置臨時斷點) 這裏顯示的是keep ,表明永久斷點。
Enb

縮寫(Enable)xcode中。你能夠暫時性的不激活斷點,可是斷點還存在,y表明激活。n表明不激活。
Address           
這個表明的是斷點在內存中設置的具體位置。通常彙編人員用。。普通青年用不上。
What

這個是對斷點的一些信息描述。

如上所示。咱們在第3行打一個斷點。以某種方式在第4行打了3個斷點。重複的斷點只會停一次。

如今,讓我再次以調試模式運行test 。輸入

run

 

 

顯示

 

Starting program: 

/Users/cubase01/Desktop/Debugging/Chapter_01/insert_sort/pg_019/test 

Breakpoint 1, main () at test.cpp:4 

4               int i=0; 

 

程序停下來了。。此時程序並無執行第4行,是將要執行這一行,切記。

我想。你有如下這幾個疑問,FAQ時間到。

 

FAQ:

1.不是說在第3行有斷點嗎?怎麼先到了第4行?

xcode裏調試。開發人員會有一種錯覺。就是認爲源文件與調試的行是一一對應的。實際上不是。g++ 在編譯時經過 -g命令生成一個叫symbol table的東東,翻成中文叫符號表。做用就是將二進制代碼與源文件對應起來。  將斷點斷在main上。gdb認爲這對調試沒有任何做用。因此會自動優化到int i=0 。這種優化在-g命令時還不是很明顯。當你開啓g++ -O9時,g++會強力優化代碼 。好比說如下代碼

 

int i=0; 

i=1; 

i=2; 

i=3; 

 

g++ -O9編譯後。會被優化成int i=3;若是你用優化後的代碼去調試。。要獲得準確的行號是很難的。這能夠算是一個比較麻煩的地方。由於優化極可能優化出bug。致使沒法正常調試。

2.怎麼查看i的值?

在命令行裏輸入

 

print i  (縮寫 p i)

 

輸出

 

(gdb) p i 

$1 = 0 

(gdb) 

 

3 怎麼單步調試?

在命令行裏輸入

next (縮寫 n)

 

輸出

 

(gdb) next 

5               i=10; 

 

 4.我這樣一步一步點好累啊!!能一次走兩步麼

n 3

 

一次走3步。

5.我想從新調試程序,怎麼辦啊! 再次運行

run  

 

6 我想直接執行到下一個斷點,怎麼辦

 

continue

 

若是後面沒有斷點了.那就直接結束了.

相關文章
相關標籤/搜索