国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

GDB程序調試從初級到高級(一)

2019-11-09 16:42:43
字體:
來源:轉載
供稿:網友

轉自:http://blog.csdn.net/haoel/article/details/2879

用GDB調試程序 GDB概述 ———— GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許,各位比較喜歡那種圖形界面方式的,像VC、BCB等IDE的調試,但如果你是在UNIX平臺下做軟件,你會發現GDB這個調試工具有比VC、BCB的圖形化調試器更強大的功能。所謂“寸有所長,尺有所短”就是這個道理。 一般來說,GDB主要幫忙你完成下面四個方面的功能: 1、啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。 2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式) 3、當程序被停住時,可以檢查此時你的程序中所發生的事。 4、動態的改變你程序的執行環境。 從上面看來,GDB和一般的調試工具沒有什么兩樣,基本上也是完成這些功能,不過在細節上,你會發現GDB這個調試工具的強大,大家可能比較習慣了圖形化的調試工具,但有時候,命令行的調試工具卻有著圖形化工具所不能完成的功能。讓我們一一看來。 一個調試示例 源程序:test.c

1 #include <stdio.h> 2 3 int func(int n) 4 { 5 int sum=0,i; 6 for(i=0; i<n; i++) 7 { 8 sum+=i; 9 } 10 return sum; 11 } 14 main() 15 { 16 int i; 17 long result = 0; 18 for(i=1; i<=100; i++) 19 { 20 result += i; 21 } 22 23 編譯生成執行文件:(linux下) hchen/test> cc -g tst.c -o tst 使用GDB調試:

hchen/test> gdb tst <---------- 啟動GDBGNU gdb 5.1.1Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome 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 "i386-suse-linux"...(gdb) l <-------------------- l命令相當于list,從第一行開始例出原碼。1 #include <stdio.h>3 int func(int n)4 {5 int sum=0,i;6 for(i=0; i<n; i++)7 {8 sum+=i;9 }10 return sum;(gdb) <-------------------- 直接回車表示,重復上一次命令11 }14 main()15 {16 int i;17 long result = 0;18 for(i=1; i<=100; i++)19 {20 result += i; (gdb) break 16 <-------------------- 設置斷點,在源程序第16行處。Breakpoint 1 at 0x8048496: file tst.c, line 16.(gdb) break func <-------------------- 設置斷點,在函數func()入口處。Breakpoint 2 at 0x8048456: file tst.c, line 5.(gdb) info break <-------------------- 查看斷點信息。Num Type Disp Enb Address What1 breakpoint keep y 0x08048496 in main at tst.c:162 breakpoint keep y 0x08048456 in func at tst.c:5(gdb) r <--------------------- 運行程序,run命令簡寫Starting program: /home/hchen/test/tstBreakpoint 1, main () at tst.c:17 <---------- 在斷點處停住。17 long result = 0;(gdb) n <--------------------- 單條語句執行,next命令簡寫。18 for(i=1; i<=100; i++)(gdb) n20 result += i;(gdb) n18 for(i=1; i<=100; i++)(gdb) n20 result += i;(gdb) c <--------------------- 繼續運行程序,continue命令簡寫。Continuing.result[1-100] = 5050 <----------程序輸出。Breakpoint 2, func (n=250) at tst.c:55 int sum=0,i;(gdb) n6 for(i=1; i<=n; i++)(gdb) p i <--------------------- 打印變量i的值,print命令簡寫。$1 = 134513808(gdb) n8 sum+=i;(gdb) n6 for(i=1; i<=n; i++)(gdb) p sum$2 = 1(gdb) n8 sum+=i;(gdb) p i$3 = 2(gdb) n6 for(i=1; i<=n; i++)(gdb) p sum$4 = 3(gdb) bt <--------------------- 查看函數堆棧。#0 func (n=250) at tst.c:5#1 0x080484e4 in main () at tst.c:24#2 0x400409ed in __libc_start_main () from /lib/libc.so.6(gdb) finish <--------------------- 退出函數。Run till exit from #0 func (n=250) at tst.c:50x080484e4 in main () at tst.c:2424 printf("result[1-250] = %d /n", func(250) );Value returned is $6 = 31375(gdb) c <--------------------- 繼續運行。Continuing.result[1-250] = 31375 <----------程序輸出。Program exited with code 027. <--------程序退出,調試結束。(gdb) q <--------------------- 退出gdb。hchen/test>

好了,有了以上的感性認識,還是讓我們來系統地認識一下gdb吧。 使用GDB ————

一般來說GDB主要調試的是C/C++的程序。要調試C/C++的程序,首先在編譯時,我們必須要把調試信息加到可執行文件中。使用編譯器(cc/gcc/g++)的 -g 參數可以做到這一點。如:

> cc -g hello.c -o hello> g++ -g hello.cpp -o hello

如果沒有-g,你將看不見程序的函數名、變量名,所代替的全是運行時的內存地址。當你用-g把調試信息加入之后,并成功編譯目標代碼以后,讓我們來看看如何用gdb來調試他。

啟動GDB的方法有以下幾種:

1、gdb <program> program也就是你的執行文件,一般在當然目錄下。2、gdb <program> core 用gdb同時調試一個運行程序和core文件,core是程序非法執行后core dump后產生的文件。3、gdb <program> <PID> 如果你的程序是一個服務程序,那么你可以指定這個服務程序運行時的進程ID。gdb會自動attach上去,并調試他。program應該在PATH環境變量中搜索得到。

GDB啟動時,可以加上一些GDB的啟動開關,詳細的開關可以用gdb -help查看。我在下面只例舉一些比較常用的參數:

-symbols <file> -s <file> 從指定文件中讀取符號表。-se file 從指定文件中讀取符號表信息,并把他用在可執行文件中。-core <file>-c <file> 調試時core dump的core文件。-directory <directory>-d <directory>加入一個源文件的搜索路徑。默認搜索路徑是環境變量中PATH所定義的路徑。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 瑞昌市| 施甸县| 民丰县| 龙井市| 沽源县| 福鼎市| 彭山县| 广平县| 仙居县| 扬州市| 东阿县| 宜兰县| 定结县| 乐亭县| 威信县| 大田县| 民乐县| 武冈市| 枣强县| 涟源市| 闵行区| 盐源县| 布拖县| 清涧县| 鹿泉市| 浦东新区| 长武县| 彰化市| 黄龙县| 望谟县| 焉耆| 靖宇县| 潍坊市| 万荣县| 泸州市| 思南县| 汉源县| 汉源县| 望城县| 永顺县| 枞阳县|