自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux編程工具C編譯器和C編程工具GDB執(zhí)行步驟

系統(tǒng) Linux
本文詳細(xì)寫(xiě)出了Linux編程工具C編譯器和C編程工具GDB執(zhí)行時(shí)的具體代碼,并標(biāo)注了具體說(shuō)明,供開(kāi)發(fā)者們參考.

Linux編程工具gdb 支持很多與 UNIX shell 程序一樣的命令編輯特征. 你能象在 bash 或 tcsh里那樣按 Tab 鍵讓 gdb 幫你補(bǔ)齊一個(gè)唯一的命令, 如果不唯一的話(huà) gdb 會(huì)列出所有匹配的命令. 你也能用光標(biāo)鍵上下翻動(dòng)歷史命令.

Linux編程工具gdb 應(yīng)用舉例
本節(jié)用一個(gè)實(shí)例教你一步步的用Linux編程工具gdb 調(diào)試程序. 被調(diào)試的程序相當(dāng)?shù)暮?jiǎn)單, 但它展示了Linux編程工具gdb 的典型應(yīng)用.
下面列出了將被調(diào)試的程序. 這個(gè)程序被稱(chēng)為 hello , 它顯示一個(gè)簡(jiǎn)單的問(wèn)候, 再用反序?qū)⑺谐?
#include
static void my_print (char *);
static void my_print2 (char *);
main ()
{
char my_string[] = "hello world!";
my_print (my_string);
my_print2 (my_string);
}
void my_print (char *string)
{
printf ("The string is %s ", string);
}
void my_print2 (char *string)
{
char *string2;
int size, i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size - i] = string[i];
string2[size+1] = '';
printf ("The string printed backward is %s ", string2);
}

用下面的命令編譯它:
gcc -g -o hello hello.c
這個(gè)程序執(zhí)行時(shí)顯示如下結(jié)果:
./hello
The string is hello world!
The string printed backward is

輸出的***行是正確的, 但第二行打印出的東西并不是我們所期望的. 我們所設(shè)想的輸出應(yīng)該是:
The string printed backward is !dlrow olleh
由于某些原因, my_print2 函數(shù)沒(méi)有正常工作. 讓我們用 gdb 看看問(wèn)題究竟出在哪兒, 先鍵入如下命令:
gdb hello
如果你在輸入命令時(shí)忘了把要調(diào)試的程序作為參數(shù)傳給 gdb , 你可以在 gdb 提示符下用 file 命令來(lái)載入它:
(gdb) file hello
這個(gè)命令將載入 hello 可執(zhí)行文件就象你在 gdb 命令行里裝入它一樣.
這時(shí)你能用 gdb 的 run 命令來(lái)運(yùn)行 hello 了. 當(dāng)它在 gdb 里被運(yùn)行后結(jié)果大約會(huì)象這樣:
(gdb) run
Starting program: /root/hello
The string is hello world!
The string printed backward is
Program exited with code 040
這個(gè)輸出和在Linux編程工具gdb 外面運(yùn)行的結(jié)果一樣. 問(wèn)題是, 為什么反序打印沒(méi)有工作? 為了找出癥結(jié)所在, 我們可以在 my_print2 函數(shù)的 for 語(yǔ)句后設(shè)一個(gè)斷點(diǎn), 具體的做法是在 gdb 提示符下鍵入 list 命令三次, 列出源代碼:
(gdb) list
(gdb) list
(gdb) list

***次鍵入 list 命令的輸出如下:
#include
static void my_print (char *);
static void my_print2 (char *);
main ()
{
char my_string[] = "hello world!";
my_print (my_string);
my_print2 (my_string);

再按一次回車(chē)將列出 hello 程序的剩余部分:

根據(jù)列出的源程序, 你能看到要設(shè)斷點(diǎn)的地方在第26行, 在 gdb 命令行提示符下鍵入如下命令設(shè)置斷點(diǎn):
(gdb) break 26
gdb 將作出如下的響應(yīng):
Breakpoint 1 at 0x804857c: file hello.c, line 26.
(gdb)
現(xiàn)在再鍵入 run 命令, 將產(chǎn)生如下的輸出:
Starting program: /root/hello
The string is hello world!
Breakpoint 1, my_print2 (string=0xbffffab0 "hello world!") at hello.c:26
26 string2[size - i] = string[i];

你能通過(guò)設(shè)置一個(gè)觀(guān)察 string2[size - i] 變量的值的觀(guān)察點(diǎn)來(lái)看出錯(cuò)誤是怎樣產(chǎn)生的, 做法是鍵入:
(gdb) watch string2[size - i]
gdb 將作出如下回應(yīng):
Hardware watchpoint 2: string2[size - i]
現(xiàn)在可以用 next 命令來(lái)一步步的執(zhí)行 for 循環(huán)了:
(gdb) next
經(jīng)過(guò)***次循環(huán)后, gdb 告訴我們 string2[size - i] 的值是 `h`. gdb 用如下的顯示來(lái)告訴你這個(gè)信息:
Hardware watchpoint 2: string2[size - i]
Old value = 0 '00'
New value = 104 'h'
my_print2 (string=0xbffffab0 "hello world!") at hello.c:25
25 for (i = 0; i < size; i++)
這個(gè)值正是期望的. 后來(lái)的數(shù)次循環(huán)的結(jié)果都是正確的. 當(dāng) i=11 時(shí), 表達(dá)式 string2[size - i] 的值等于 `!`, size - i 的值等于 1, ***一個(gè)字符已經(jīng)拷到新串里了.

如果你再把循環(huán)執(zhí)行下去, 你會(huì)看到已經(jīng)沒(méi)有值分配給 string2[0] 了, 而它是新串的***個(gè)字符, 因?yàn)?malloc 函數(shù)在分配內(nèi)存時(shí)把它們初始化為空(null)字符. 所以 string2 的***個(gè)字符是空字符. 這解釋了為什么在打印 string2 時(shí)沒(méi)有任何輸出了.

現(xiàn)在找出了問(wèn)題出在哪里, 修正這個(gè)錯(cuò)誤是很容易的. 你得把代碼里寫(xiě)入 string2 的***個(gè)字符的的偏移量改為 size - 1 而不是 size. 這是因?yàn)?string2 的大小為 12, 但起始偏移量是 0, 串內(nèi)的字符從偏移量 0 到 偏移量 10, 偏移量 11 為空字符保留.

【編輯推薦】

  1. 詳解Linux開(kāi)發(fā)領(lǐng)域
  2. 騰訊Linux QQ團(tuán)隊(duì)現(xiàn)招聘:Linux開(kāi)發(fā)與測(cè)試工程師
  3. 英特爾欲借基于Linux開(kāi)發(fā)Moblin挑戰(zhàn)微軟
  4. 開(kāi)源大師齊聚京城 Linux開(kāi)發(fā)者研討會(huì)開(kāi)幕
  5. Linux開(kāi)發(fā)現(xiàn)狀的“天氣預(yù)報(bào)”
責(zé)任編輯:chenqingxiang
相關(guān)推薦

2010-05-28 14:55:17

Linux編程工具

2010-06-04 17:37:45

Linux編程工具

2010-06-04 17:48:20

Linux編程工具

2011-04-08 17:24:05

c++工具編程

2009-08-10 17:12:54

C#編譯器

2010-05-28 14:14:37

Linux開(kāi)發(fā)工具

2009-08-25 17:13:57

C#串口編程

2010-01-18 10:34:21

C++編譯器

2010-01-21 09:11:38

C++編譯器

2020-10-26 11:33:45

編程語(yǔ)言編譯器軟件

2009-08-25 15:52:27

C#工具欄

2021-12-23 23:11:37

C語(yǔ)言編程工具

2009-08-06 14:59:36

C#編譯器

2010-01-27 13:53:40

強(qiáng)大的CC++編譯器

2013-12-10 10:53:47

shellcode

2010-01-18 10:28:15

C++編譯器

2009-08-14 11:34:26

Mono C#編譯器

2010-06-03 13:01:25

Linux 編程工具

2009-08-18 11:27:56

配置C#命令行編譯器

2010-06-09 17:48:15

Linux 編程工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)