先要說點關於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裏也比較經常使用 ,捕獲異常時很是方便,能讓開發人員很快的定位到代碼中拋異常的位置。
這3種point 在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
若是後面沒有斷點了.那就直接結束了.