一文入門Linux下gdb調(diào)試(一)

作者:良知猶存

轉(zhuǎn)載授權(quán)以及圍觀:歡迎添加微信號(hào):Conscience_Remains

總述

????在window下我們習(xí)慣了IDE的各種調(diào)試按鈕账阻,說實(shí)話確實(shí)挺方便的熔任,但到了Linux下,沒有那么多的IDE支持我們調(diào)試蠢琳,但是Linux有也有強(qiáng)大的命令行C/C++的調(diào)試工具——GDB啊终,GNU提供的開源調(diào)試工具。

????剛開始不習(xí)慣傲须,使用多了我們就會(huì)喜歡上他蓝牲,程序調(diào)試的單步執(zhí)行,跳入函數(shù)泰讽,跳出函數(shù)例衍,設(shè)置斷點(diǎn),設(shè)置觀察點(diǎn)已卸,查看變量佛玄。GDB都有,此外gdb還可以生成程序非法執(zhí)行后core dump文件咬最,這個(gè)文件有快照功能翎嫡,在程序崩潰的時(shí)候保存了程序的堆棧等信息,我們執(zhí)行core文件就可以方便的找程序崩潰的原因了永乌。

一惑申、編譯可以調(diào)試的代碼

? ??在linux下對于單個(gè)c/c++文件編譯通常就是加-o 進(jìn)行編譯成可執(zhí)行文件具伍,但是我們?nèi)绻枰{(diào)試,則需要加一個(gè) -g 用來向編譯器進(jìn)行表明該程序需要編譯成可以gdb調(diào)試的代碼圈驼,加上編譯信息人芽,生成的執(zhí)行文件就會(huì)變大,如圖所示绩脆。所以我們只在調(diào)試的時(shí)候進(jìn)行 -g 編譯萤厅。Java調(diào)試的時(shí)候也是類似后續(xù)也說一哈java的Linux。

Makefile的文件中我們也是如上靴迫,只不過是在Makefile文件中 -o 編譯的時(shí)候添加 -g

二惕味、調(diào)試過程

調(diào)用gdb調(diào)試,先查看電腦環(huán)境里面是否有g(shù)db調(diào)試器玉锌,一般我們安裝了gcc編譯器名挥,就默認(rèn)同時(shí)安裝了gdb調(diào)試器

沒有的話要安裝gdb調(diào)試器,使用apt-get 就可以快速安裝

apt-get?update
apt-get install gdb

gdb 調(diào)用執(zhí)行文件?

gdb?./big_endian /*執(zhí)行文件*/

最基本的GDB命令


示例執(zhí)行:

/*剛開始有很多打印的信息*/

book@lyn:~/Documents/linux/test/wds/wds_c++/c++_test1/c11th$ gdb person1

GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1

Copyright (C) 2016 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.? Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-linux-gnu".

Type "show configuration" for configuration details.

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>.

Find the GDB manual and other documentation resources online at:

<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".

Type "apropos word" to search for commands related to "word"...

Reading symbols from person1...done.

(gdb)?l?10??/*list?10??顯示10行代碼?方便下一步打斷點(diǎn)調(diào)試*/

5? ? ? using namespace std;

6

7? ? ? class Person {

8? ? ? private:

9? ? ? ? ? ? ? static int cnt;

10? ? ? ? ? ? ? char *name;

11? ? ? ? ? ? ? int age;

12

13? ? ? public:

14

(gdb)???/*不輸入?直接?Enter?鍵?重復(fù)上一步驟*/

15? ? ? ? ? ? ? static int getCount(void);

16

17? ? ? ? ? ? ? Person() {//cout <<"Pserson()"<<endl;

18? ? ? ? ? ? ? ? ? ? ? name = NULL;

19? ? ? ? ? ? ? ? ? ? ? cnt++;

20? ? ? ? ? ? ? }

21? ? ? ? ? ? ? Person(char *name)

22? ? ? ? ? ? ? {

23? ? ? ? ? ? ? ? ? ? ? //cout <<"Pserson(char *)"<<endl;

24? ? ? ? ? ? ? ? ? ? ? this->name = new char[strlen(name) + 1];

(gdb)

25? ? ? ? ? ? ? ? ? ? ? strcpy(this->name, name);

26? ? ? ? ? ? ? ? ? ? ? cnt++;

27? ? ? ? ? ? ? }

28

29? ? ? ? ? ? ? Person(char *name, int age)

30? ? ? ? ? ? ? {

31? ? ? ? ? ? ? ? ? ? ? cout <<"Pserson(char*, int), name = "<<name<<", age= "<<age<<endl;

32? ? ? ? ? ? ? ? ? ? ? this->age = age;

33

34? ? ? ? ? ? ? ? ? ? ? this->name = new char[strlen(name) + 1];

(gdb)?/*......*/

......

95

96? ? ? int main(int argc, char **argv)

97? ? ? {

98? ? ? ? ? ? ? Student p;

99? ? ? ? ? ? ? p.setName("zhangsan");

100? ? ? ? ? ? p.setAge(16);

101? ? ? ? ? ? p.printInfo();

102

103? ? ? ? ? ? return 0;

104? ? }

(gdb)?b?99?/*在顯示的?第?99行代碼處?打斷點(diǎn)*/

Breakpoint 1 at 0x400b5d: file person.cpp, line 99.

(gdb)?i?b?/*顯示?設(shè)置的斷點(diǎn)*/

Num? ? Type? ? ? ? ? Disp Enb Address? ? ? ? ? ? What

1? ? ? breakpoint? ? keep y? 0x0000000000400b5d in main(int, char**) at person.cpp:99

(gdb)?r??/*開始全速執(zhí)行代碼?直到第一個(gè)斷點(diǎn)處*/

Starting program: /home/book/Documents/linux/test/wds/wds_c++/c++

Breakpoint 1, main (argc=1, argv=0x7fffffffe3d8) at person.cpp:99

99? ? ? ? ? ? ? p.setName("zhangsan");

(gdb)?p?p??/*打印?p?變量信息*/

$1 = {<Person> = {static cnt = 1, name = 0x0, age = 0}, <No data fields>}

(gdb)?n??/*執(zhí)行下一步*/

100?????????????p.setAge(16);

(gdb)?q??/*退出?gdb?調(diào)試*/

A debugging session is active.

?

? ? ? ? Inferior 1 [process 3410] will be killed.

?

Quit anyway? (y or n) y

(gdb) s

hanoi (n=3, x=120 'x', y=121 'y', z=122 'z') at Hanoi.c:21

21? ? ? ? ? ? ? if(n==1)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //欲移動(dòng)n個(gè)圓盤主守,需先移動(dòng)其上的n-1個(gè)圓盤

(gdb) n

25??????????????????????hanoi(n-1,?x,?z,?y);????????????????????//將x上編號(hào)為1至n-1的圓盤移到y(tǒng)禀倔,z作輔助塔?



?這就是我分享的gdb調(diào)試一些方法,里面代碼是實(shí)踐過的参淫,如果大家有什么更好的思路救湖,歡迎分享交流哈

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涎才,隨后出現(xiàn)的幾起案子鞋既,更是在濱河造成了極大的恐慌,老刑警劉巖耍铜,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涛救,死亡現(xiàn)場離奇詭異,居然都是意外死亡业扒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門舒萎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來程储,“玉大人,你說我怎么就攤上這事臂寝≌吕穑” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵咆贬,是天一觀的道長败徊。 經(jīng)常有香客問我,道長掏缎,這世上最難降的妖魔是什么皱蹦? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任煤杀,我火速辦了婚禮,結(jié)果婚禮上沪哺,老公的妹妹穿的比我還像新娘沈自。我一直安慰自己,他們只是感情好辜妓,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布枯途。 她就那樣靜靜地躺著,像睡著了一般籍滴。 火紅的嫁衣襯著肌膚如雪酪夷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天孽惰,我揣著相機(jī)與錄音晚岭,去河邊找鬼。 笑死灰瞻,一個(gè)胖子當(dāng)著我的面吹牛腥例,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酝润,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼燎竖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了要销?” 一聲冷哼從身側(cè)響起构回,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疏咐,沒想到半個(gè)月后纤掸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浑塞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年借跪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酌壕。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掏愁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卵牍,到底是詐尸還是另有隱情果港,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布糊昙,位于F島的核電站辛掠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏释牺。R本人自食惡果不足惜萝衩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一回挽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧欠气,春花似錦厅各、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宜鸯,卻和暖如春憔古,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淋袖。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來泰國打工鸿市, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人即碗。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓焰情,卻偏偏與公主長得像,于是被迫代替她去往敵國和親剥懒。 傳聞我的和親對象是個(gè)殘疾皇子内舟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361