Linux下C應用程序開(kāi)發(fā)
xxgdb
xxgdb 是 gdb 的一個(gè)基于 X Window 系統的圖形界面. xxgdb 包括了命令行版的 gdb 上的所有特性. xxgdb 使你能通過(guò)按按鈕來(lái)執行常用的命令. 設置了斷點(diǎn)的地方也用圖形來(lái)顯示.
xxgdb 是 gdb 的一個(gè)基于 X Window 系統的圖形界面. xxgdb 包括了命令行版的 gdb 上的所有特性. xxgdb 使你能通過(guò)按按鈕來(lái)執行常用的命令. 設置了斷點(diǎn)的地方也用圖形來(lái)顯示.
你能在一個(gè) Xterm 窗口里鍵入下面的命令來(lái)運行它:
xxgdb
你能用 gdb 里任何有效的命令行選項來(lái)初始化 xxgdb . 此外 xxgdb 也有一些特有的命令行選項, 表 27.2 列出了這些選項.
你能用 gdb 里任何有效的命令行選項來(lái)初始化 xxgdb . 此外 xxgdb 也有一些特有的命令行選項, 表 27.2 列出了這些選項.
表 27.2. xxgdb 命令行選項.
選 項 描 述
db_name 指定所用調試器的名字, 缺省是 gdb.
db_prompt 指定調試器提示符, 缺省為 gdb.
gdbinit 指定初始化 gdb 的命令文件的文件名, 缺省為 .gdbinit.
db_name 指定所用調試器的名字, 缺省是 gdb.
db_prompt 指定調試器提示符, 缺省為 gdb.
gdbinit 指定初始化 gdb 的命令文件的文件名, 缺省為 .gdbinit.
nx 告訴 xxgdb 不執行 .gdbinit 文件.
bigicon 使用大圖標.
bigicon 使用大圖標.
calls
你可以在 sunsite.unc.edu FTP 站點(diǎn)用下面的路徑:
/pub/Linux/devel/lang/c/calls.tar.Z
來(lái)取得 calls , 一些舊版本的 Linux CD-ROM 發(fā)行版里也附帶有. 因為它是一個(gè)有用的工具, 我們在這里也介紹一下. 如果你覺(jué)得有用的話(huà), 從 BBS, FTP, 或另一張CD-ROM 上弄一個(gè)拷貝. calls 調用 GCC 的預處理器來(lái)處理給出的源程序文件, 然后輸出這些文件的里的函數調用樹(shù)圖.
你可以在 sunsite.unc.edu FTP 站點(diǎn)用下面的路徑:
/pub/Linux/devel/lang/c/calls.tar.Z
來(lái)取得 calls , 一些舊版本的 Linux CD-ROM 發(fā)行版里也附帶有. 因為它是一個(gè)有用的工具, 我們在這里也介紹一下. 如果你覺(jué)得有用的話(huà), 從 BBS, FTP, 或另一張CD-ROM 上弄一個(gè)拷貝. calls 調用 GCC 的預處理器來(lái)處理給出的源程序文件, 然后輸出這些文件的里的函數調用樹(shù)圖.
注意: 在你的系統上安裝 calls , 以超級用戶(hù)身份登錄后執行下面的步驟: 1. 解壓和 untar 文件. 2. cd 進(jìn)入 calls untar 后建立的子目錄. 3. 把名叫 calls 的文件移動(dòng)到 /usr/bin 目錄. 4. 把名叫 calls.1 的文件移動(dòng)到目錄 /usr/man/man1 . 5. 刪除 /tmp/calls 目錄. 這些步驟將把 calls 程序和它的指南頁(yè)安裝載你的系統上.
------------------------------------------------------------------------------
--
--
當 calls 打印出調用跟蹤結果時(shí), 它在函數后面用中括號給出了函數所在文件的文件名:
main [hello.c]
如果函數并不是向 calls 給出的文件里的, calls 不知道所調用的函數來(lái)自哪里, 則只顯示函數的名字:
如果函數并不是向 calls 給出的文件里的, calls 不知道所調用的函數來(lái)自哪里, 則只顯示函數的名字:
printf
calls 不對遞歸和靜態(tài)函數輸出. 遞歸函數顯示成下面的樣子:
calls 不對遞歸和靜態(tài)函數輸出. 遞歸函數顯示成下面的樣子:
fact recursive in factorial.c >;>;>;
靜態(tài)函數象這樣顯示:
靜態(tài)函數象這樣顯示:
total [static in calculate.c]
作為一個(gè)例子, 假設用 calls 處理下面的程序:
作為一個(gè)例子, 假設用 calls 處理下面的程序:
#include stdio.h>;
static void my_print (char *);
static void my_print2 (char *);
static void my_print2 (char *);
main ()
{
char my_string[] = hello world!;
my_print (my_string);
my_print2 (my_string);
my_print (my_string);
}
{
char my_string[] = hello world!;
my_print (my_string);
my_print2 (my_string);
my_print (my_string);
}
void count_sum()
{
int i,sum=0;
for(i=0; i1000000; i++)
sum += i;
}
{
int i,sum=0;
for(i=0; i1000000; i++)
sum += i;
}
void my_print (char *string)
{
count_sum();
(The string is %s , string);
}
{
count_sum();
(The string is %s , string);
}
void my_print2 (char *string)
{
char *string2;
int size, i,sum =0;
{
char *string2;
int size, i,sum =0;
printf (The string printed backward is %s , string2);
}
將產(chǎn)生如下的輸出:
}
將產(chǎn)生如下的輸出:
1 __underflow [hello.c]
2 main
3 my_print [hello.c]
4 count_sum [hello.c]
5 printf
6 my_print2 [hello.c]
7 count_sum
8 strlen
9 malloc
10 printf
calls 有很多命令行選項來(lái)設置不同的輸出格式, 有關(guān)這些選項的更多信息請參考 calls 的指南頁(yè). 方法是在命令行上鍵入 calls -h .
2 main
3 my_print [hello.c]
4 count_sum [hello.c]
5 printf
6 my_print2 [hello.c]
7 count_sum
8 strlen
9 malloc
10 printf
calls 有很多命令行選項來(lái)設置不同的輸出格式, 有關(guān)這些選項的更多信息請參考 calls 的指南頁(yè). 方法是在命令行上鍵入 calls -h .
calltree
calltree與calls類(lèi)似,初了輸出函數調用樹(shù)圖外,還有其它詳細的信息??梢詮膕unsite.unc.edu FTP 站點(diǎn)用下面的路徑
:/pub/Linux/devel/lang/c/calltree.tar.gz得到calltree.
calltree與calls類(lèi)似,初了輸出函數調用樹(shù)圖外,還有其它詳細的信息??梢詮膕unsite.unc.edu FTP 站點(diǎn)用下面的路徑
:/pub/Linux/devel/lang/c/calltree.tar.gz得到calltree.
cproto
cproto 讀入 C 源程序文件并自動(dòng)為每個(gè)函數產(chǎn)生原型申明. 用 cproto 可以在寫(xiě)程序時(shí)為你節省大量用來(lái)定義函數原型的時(shí)間.
如果你讓 cproto 處理下面的代碼(cproto hello.c):
cproto 讀入 C 源程序文件并自動(dòng)為每個(gè)函數產(chǎn)生原型申明. 用 cproto 可以在寫(xiě)程序時(shí)為你節省大量用來(lái)定義函數原型的時(shí)間.
如果你讓 cproto 處理下面的代碼(cproto hello.c):
#include stdio.h>;
static void my_print (char *);
static void my_print2 (char *);
static void my_print2 (char *);
main ()
{
char my_string[] = hello world!;
my_print (my_string);
my_print2 (my_string);
}
{
char my_string[] = hello world!;
my_print (my_string);
my_print2 (my_string);
}
void my_print (char *string)
{
printf (The string is %s , string);
}
{
printf (The string is %s , string);
}
void my_print2 (char *string)
{
char *string2;
int size, i;
{
char *string2;
int size, i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i size; i++)
string2[size -1 - i] = string;
string2[size] = '';
string2 = (char *) malloc (size + 1);
for (i = 0; i size; i++)
string2[size -1 - i] = string;
string2[size] = '';
printf (The string printed backward is %s , string2);
}
你將得到下面的輸出:
}
你將得到下面的輸出:
/* hello.c */
int main(void);
int my_print(char *string);
int my_print2(char *string);
這個(gè)輸出可以重定向到一個(gè)定義函數原型的包含文件里.
這個(gè)輸出可以重定向到一個(gè)定義函數原型的包含文件里.
indent
indent 實(shí)用程序是 Linux 里包含的另一個(gè)編程實(shí)用工具. 這個(gè)工具簡(jiǎn)單的說(shuō)就為你的代碼產(chǎn)生美觀(guān)的縮進(jìn)的格式. indent 也有很多選項來(lái)指定如何格式化你的源代碼.這些選項的更多信息請看indent 的指南頁(yè), 在命令行上鍵入 indent -h .
indent 實(shí)用程序是 Linux 里包含的另一個(gè)編程實(shí)用工具. 這個(gè)工具簡(jiǎn)單的說(shuō)就為你的代碼產(chǎn)生美觀(guān)的縮進(jìn)的格式. indent 也有很多選項來(lái)指定如何格式化你的源代碼.這些選項的更多信息請看indent 的指南頁(yè), 在命令行上鍵入 indent -h .
下面的例子是 indent 的缺省輸出:
運行 indent 以前的 C 代碼:
#include stdio.h>;
static void my_print (char *);
static void my_print2 (char *);
static void my_print2 (char *);
main ()
{
char my_string[] = hello world!;
my_print (my_string);
my_print2 (my_string);
}
{
char my_string[] = hello world!;
my_print (my_string);
my_print2 (my_string);
}
void my_print (char *string)
{
printf (The string is %s , string);
}
{
printf (The string is %s , string);
}
void my_print2 (char *string)
{
char *string2; int size, i;
{
char *string2; int size, i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i size; i++) string2[size -1 - i] = string;
string2[size] = '';
string2 = (char *) malloc (size + 1);
for (i = 0; i size; i++) string2[size -1 - i] = string;
string2[size] = '';
printf (The string printed backward is %s , string2);
}
運行 indent 后的 C 代碼:
}
運行 indent 后的 C 代碼:
#include stdio.h>;
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 - 1 - i] = string;
string2[size] = '';
printf (The string printed backward is %s , string2);
}
indent 并不改變代碼的實(shí)質(zhì)內容, 而只是改變代碼的外觀(guān). 使它變得更可讀, 這永遠是一件好事.
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 - 1 - i] = string;
string2[size] = '';
printf (The string printed backward is %s , string2);
}
indent 并不改變代碼的實(shí)質(zhì)內容, 而只是改變代碼的外觀(guān). 使它變得更可讀, 這永遠是一件好事.
gprof
gprof 是安裝在你的 Linux 系統的 /usr/bin 目錄下的一個(gè)程序. 它使你能剖析你的程序從而知道程序的哪一個(gè)部分在執行時(shí)最費時(shí)間.
gprof 是安裝在你的 Linux 系統的 /usr/bin 目錄下的一個(gè)程序. 它使你能剖析你的程序從而知道程序的哪一個(gè)部分在執行時(shí)最費時(shí)間.
gprof 將告訴你程序里每個(gè)函數被調用的次數和每個(gè)函數執行時(shí)所占時(shí)間的百分比. 你如果想提高你的程序性能的話(huà)這些信息非常有用.
為了在你的程序上使用 gprof, 你必須在編譯程序時(shí)加上 -pg 選項. 這將使程序在每次執行時(shí)產(chǎn)生一個(gè)叫 gmon.out 的文件. gprof 用這個(gè)文件產(chǎn)生剖析信息.
在你運行了你的程序并產(chǎn)生了 gmon.out 文件后你能用下面的命令獲得剖析信息:
gprof program_name>;
參數 program_name 是產(chǎn)生 gmon.out 文件的程序的名字.
參數 program_name 是產(chǎn)生 gmon.out 文件的程序的名字.
為了說(shuō)明問(wèn)題,在程序中增加了函數count_sum()以消耗CPU時(shí)間,程序如下
#include stdio.h>;
#include stdio.h>;
static void my_print (char *);
static void my_print2 (char *);
static void my_print2 (char *);
main ()
{
char my_string[] = hello world!;
my_print (my_string);
my_print2 (my_string);
my_print (my_string);
}
{
char my_string[] = hello world!;
my_print (my_string);
my_print2 (my_string);
my_print (my_string);
}
void count_sum()
{
int i,sum=0;
for(i=0; i1000000; i++)
sum += i;
}
{
int i,sum=0;
for(i=0; i1000000; i++)
sum += i;
}
void my_print (char *string)
{
count_sum();
printf (The string is %s , string);
}
{
count_sum();
printf (The string is %s , string);
}
void my_print2 (char *string)
{
char *string2;
int size, i,sum =0;
{
char *string2;
int size, i,sum =0;
count_sum();
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i size; i++) string2[size -1 - i] = string;
string2[size] = '';
for(i=0; i5000000; i++)
sum += i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i size; i++) string2[size -1 - i] = string;
string2[size] = '';
for(i=0; i5000000; i++)
sum += i;
printf (The string printed backward is %s , string2);
}
$ gcc -pg -o hello hello.c
$ ./hello
$ gprof hello | more
將產(chǎn)生以下的輸出
Flat profile:
}
$ gcc -pg -o hello hello.c
$ ./hello
$ gprof hello | more
將產(chǎn)生以下的輸出
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls us/call us/call name
69.23 0.09 0.09 1 90000.00 103333.33 my_print2
30.77 0.13 0.04 3 13333.33 13333.33 count_sum
0.00 0.13 0.00 2 0.00 13333.33 my_print
% cumulative self self total
time seconds seconds calls us/call us/call name
69.23 0.09 0.09 1 90000.00 103333.33 my_print2
30.77 0.13 0.04 3 13333.33 13333.33 count_sum
0.00 0.13 0.00 2 0.00 13333.33 my_print
% 執行此函數所占用的時(shí)間占程序總
time 執行時(shí)間的百分比
time 執行時(shí)間的百分比
cumulative 累計秒數 執行此函數花費的時(shí)間
seconds (包括此函數調用其它函數花費的時(shí)間)
seconds (包括此函數調用其它函數花費的時(shí)間)
self 執行此函數花費的時(shí)間
seconds (調用其它函數花費的時(shí)間不計算在內)
seconds (調用其它函數花費的時(shí)間不計算在內)
calls 調用次數
self 每此執行此函數花費的微秒時(shí)間
us/call
us/call
total 每此執行此函數加上它調用其它函數
us/call 花費的微秒時(shí)間
us/call 花費的微秒時(shí)間
name 函數名
由以上數據可以看出,執行my_print()函數本身沒(méi)花費什么時(shí)間,但是它又調用了
count_sum()函數,所以累計秒數為0.13.
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
count_sum()函數,所以累計秒數為0.13.
技巧: gprof 產(chǎn)生的剖析數據很大, 如果你想檢查這些數據的話(huà)最好把輸出重定向到一個(gè)文件里.
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
linux相關(guān)文章:linux教程
關(guān)鍵詞:
程序開(kāi)發(fā)
應用
Linux
相關(guān)推薦
技術(shù)專(zhuān)區
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線(xiàn)
- 開(kāi)關(guān)電源
- 單片機
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機控制
- 藍牙
- PLC
- PWM
- 汽車(chē)電子
- 轉換器
- 電源管理
- 信號放大器
評論