青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

elva

關(guān)于DBG加載core文件

2.6 調(diào)試

2.6.1 調(diào)試器

  FreeBSD 自帶的調(diào)試器叫 gdb (GNU debugger)。要運(yùn)行,輸入

% gdb progname

  然而大多數(shù)人喜歡在 Emacs 中運(yùn)行這個(gè)命令。 可以這樣來(lái)起動(dòng)這個(gè)命令:

M-x gdb RET progname RET

  調(diào)試器能讓你在一個(gè)可控制的環(huán)境中運(yùn)行一個(gè)程序。例如,你可以一次運(yùn)行程 序的一行代碼,檢查變量的值,改變這些值,或者讓程序運(yùn)行到某個(gè)定點(diǎn)然后停止等 等。你甚至可以調(diào)試內(nèi)核,當(dāng)然這樣會(huì)比我們將要討論的問(wèn)題要多一點(diǎn)點(diǎn)技巧。

  gdb 有非常棒的在線幫助,還有同樣棒的 info 頁(yè)面。 因此這一章我們會(huì)把注意力集中到一些基本的命令上。

  最后,如果你不習(xí)慣這個(gè)命令的命令行界面,在 Ports 中還有一個(gè)它的圖形 前端 (devel/xxgdb)。

  這一章準(zhǔn)備只介紹 gdb 的使用方法,而不會(huì)牽涉到特殊 的問(wèn)題比如調(diào)試內(nèi)核。

2.6.2 在調(diào)試器中運(yùn)行一個(gè)程序

  要最大限度的利用 gdb,需要使用 -g 這個(gè)選項(xiàng)來(lái)編譯你的程序。如果你沒(méi)有這樣做,那么你只會(huì)看 到你正在調(diào)試的函數(shù)名字,而不是它的源代碼。如果 gdb起動(dòng) 時(shí)提示:

... (no debugging symbols found) ...

  你就知道你的程序在編譯的時(shí)候沒(méi)有使用 -g 選項(xiàng)。

  當(dāng) gdb 給出提示符,輸入 break main。 這就是告訴調(diào)試器你對(duì)正在運(yùn)行的程序中預(yù)先設(shè)置的代碼沒(méi)有興趣, 并且調(diào)試器應(yīng)該停在你的代碼的開頭。然后輸入 run 來(lái)開始你的程序──這會(huì)從 預(yù)先設(shè)置的代碼開始然后在調(diào)試器調(diào)用 main() 的時(shí)候就停 下來(lái)。(如果你曾迷惑 main() 是在哪里被調(diào)用的,現(xiàn)在應(yīng)該 明白了吧!)

  現(xiàn)在你可以一步一步來(lái)檢查你的程序,按下 n一次就查 一行。一旦你碰見了一個(gè)函數(shù)調(diào)用,可以輸入 f 從函數(shù)調(diào)用中 退出來(lái)。你可以輸入 up或 down 來(lái)快速 檢查這個(gè)調(diào)用。

  這里列出了一個(gè)簡(jiǎn)單的例子。展示了怎樣用 gdb 定位一個(gè)錯(cuò) 誤。這是我們的程序(其中有一個(gè)明顯的錯(cuò)誤):

#include <stdio.h>

int bazz(int anint);

main() {
    int i;

    printf("This is my program\n");
    bazz(i);
    return 0;
}

int bazz(int anint) {
    printf("You gave me %d\n", anint);
    return anint;
}

  這個(gè)程序給 i 賦值 5 并把它傳遞給 一個(gè)函數(shù) bazz(),這個(gè)函數(shù)將打印出我們給出的數(shù)值。

  我們現(xiàn)在編譯并運(yùn)行這個(gè)程序,我們會(huì)得到

% cc -g -o temp temp.c
% ./temp
This is my program
anint = 4231

  但這并不是我們想要的!應(yīng)該看看到底發(fā)生了什么!

% gdb temp
GDB is free software and you are welcome to 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.
GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
(gdb) break main               Skip the set-up code
Breakpoint 1 at 0x160f: file temp.c, line 9.    gdb puts breakpoint at main()
(gdb) run                   Run as far as main()
Starting program: /home/james/tmp/temp      Program starts running

Breakpoint 1, main () at temp.c:9       gdb stops at main()
(gdb) n                       Go to next line
This is my program              Program prints out
(gdb) s                       step into bazz()
bazz (anint=4231) at temp.c:17          gdb displays stack frame
(gdb)

  停住!怎么 anint 會(huì)是 4231?難道 我們沒(méi)有在函數(shù) main() 中設(shè)定為 5 嗎?現(xiàn)在我們轉(zhuǎn)到 main() 來(lái)看看。

(gdb) up                   Move up call stack
#1  0x1625 in main () at temp.c:11      gdb displays stack frame
(gdb) p i                   Show us the value of i
$1 = 4231                   gdb displays 4231

  哦,天哪!看看這代碼,我們忘了初始化 i 了。本來(lái)我們 是想的

...
main() {
    int i;

    i = 5;
    printf("This is my program\n");
...

  但是我們忘了 i=5; 這一行。因?yàn)槲覀儧](méi)有初始化 i,這個(gè)變量在程序運(yùn)行的時(shí)候就儲(chǔ)存了偶然在那塊內(nèi)存中存在的 任意值。

注意: gdb 會(huì)顯示我們進(jìn)入或離開一個(gè)函數(shù)時(shí)的棧的值。即 使是我們?cè)谑褂?nbsp;up 或 down 的時(shí)候。 這會(huì)顯示函數(shù)的名稱還有參數(shù)的值,讓我們知道自己的位置以及正在發(fā)生什么事情。 (棧能儲(chǔ)存程序在調(diào)用函數(shù)的時(shí)使用的參數(shù),以及調(diào)用時(shí)的位置,以便程序在從函 數(shù)調(diào)用結(jié)束后知道自己的位置。)

2.6.3 檢查 core 文件

  基本上 core 文件就是一個(gè)包含了程序崩潰時(shí)這個(gè)進(jìn)程的所有信息的文件。在那 “遙遠(yuǎn)的黃金年代”,程序員不得不把 core 文件以十六進(jìn)制的方式顯示 出來(lái),然后滿頭大汗的閱讀機(jī)器碼的手冊(cè),但是現(xiàn)在事情就簡(jiǎn)單得多了。順便說(shuō)一下, 在 FreeBSD 和其他的 4.4BSD 系統(tǒng)下,core 文件都叫作 progname.core 而不是簡(jiǎn)單叫 core,這樣可以很清楚的表示出這個(gè) core 文件是屬于哪個(gè) 程序。

  要檢查一個(gè) core 文件,以通常的方式起動(dòng) gdb。不要 輸入 break 或者 run,而要輸入

(gdb) core progname.core

  如果你沒(méi)有和 core 文件在同一個(gè)目錄,首先要執(zhí)行 dir /path/to/core/file

  你應(yīng)該可以看見:

% gdb a.out
GDB is free software and you are welcome to 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.
GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
(gdb) core a.out.core
Core was generated by `a.out'.
Program terminated with signal 11, Segmentation fault.
Cannot access memory at address 0x7020796d.
#0  0x164a in bazz (anint=0x5) at temp.c:17
(gdb)

  這種情況下,運(yùn)行的程序叫 a.out,因此 core 文件 就叫 a.out.core。我們知道程序崩潰的原因就是函數(shù) bazz 試圖訪問(wèn)一塊不屬于它的內(nèi)存。

  有時(shí)候,能知道一個(gè)函數(shù)是怎么被調(diào)用的是非常有用處的。因?yàn)樵谝粋€(gè)復(fù)雜的 程序里面問(wèn)題可能會(huì)發(fā)生在函數(shù)調(diào)用棧上面很遠(yuǎn)的地方。命令bt 會(huì)讓 gdb 輸出函數(shù)調(diào)用棧的回溯追蹤。

(gdb) bt
#0  0x164a in bazz (anint=0x5) at temp.c:17
#1  0xefbfd888 in end ()
#2  0x162c in main () at temp.c:11
(gdb)

  函數(shù) end() 在一個(gè)程序崩潰的時(shí)候?qū)⒈徽{(diào)用;在本例 中,函數(shù) bazz() 是從 main() 中被 調(diào)用的。

2.6.4 粘付到一個(gè)正在運(yùn)行的程序

  gdb 一個(gè)最精致的特性就是它能粘付到一個(gè)已經(jīng)在運(yùn)行 的程序上。當(dāng)然,我們得首先假定你有足夠的權(quán)限這樣去做。一個(gè)常見的問(wèn)題就是, 當(dāng)我們?cè)谧粉櫼粋€(gè)包含子進(jìn)程的程序時(shí),如果你要追蹤子進(jìn)程,但是調(diào)試器只允許你 追蹤父進(jìn)程。

  你要做的就是起動(dòng)另一個(gè) gdb,然后用 ps 找出子進(jìn)程的進(jìn)程號(hào)。然后在 gdb中執(zhí)行

(gdb) attach pid

  就可以像平時(shí)一樣調(diào)試了。

  “這很好,”你可能在想,“當(dāng)我這樣做了以后,子進(jìn)程就 會(huì)不見了”。別怕,親愛的讀者,我們可以這樣來(lái)做(參照 gdb 的 info 頁(yè))

...
if ((pid = fork()) < 0)      /* _Always_ check this */
    error();
else if (pid == 0) {        /* child */
    int PauseMode = 1;

    while (PauseMode)
        sleep(10);  /* Wait until someone attaches to us */
    ...
} else {            /* parent */
    ...

  現(xiàn)在所有你要做的就是粘付到子進(jìn)程,設(shè)置 PauseMode 為 0,然后等待函數(shù) sleep 返回!

posted on 2010-08-06 12:03 葉子 閱讀(1079) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C\C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成人自拍| 久久国产精品久久w女人spa| 国外视频精品毛片| 亚洲美女色禁图| 亚洲国产成人一区| 欧美一区二区三区免费看| 亚洲视频一二区| 欧美精品日韩| 欧美激情一级片一区二区| 国产亚洲福利社区一区| 亚洲一区二区在线| 亚洲天堂男人| 欧美日韩免费在线观看| 亚洲激情中文1区| 亚洲黄色在线观看| 久久免费高清视频| 久热这里只精品99re8久| 国产亚洲一区在线播放| 亚洲欧美在线免费| 欧美在线观看视频一区二区三区| 欧美日韩在线视频首页| 亚洲精选在线| 亚洲永久视频| 国产精品男女猛烈高潮激情| 亚洲一级在线观看| 欧美诱惑福利视频| 国产日韩欧美日韩| 久久成人国产| 欧美a级片网站| 亚洲激情二区| 欧美激情四色| 中文一区在线| 久久久久久久999| 激情视频一区二区三区| 久久综合狠狠综合久久激情| 欧美电影资源| 日韩系列在线| 国产精品日本一区二区| 亚洲新中文字幕| 久久久久久久尹人综合网亚洲| 国产一区二区三区在线观看精品 | 妖精视频成人观看www| 一区二区三区日韩精品视频| 欧美色欧美亚洲高清在线视频| 一区二区成人精品| 久久精品123| 亚洲电影观看| 欧美日韩在线不卡| 欧美一级黄色录像| 亚洲第一精品福利| 亚洲综合成人婷婷小说| 国内成+人亚洲+欧美+综合在线| 久久婷婷蜜乳一本欲蜜臀| 亚洲人成人77777线观看| 亚洲欧美日韩综合国产aⅴ | 欧美性做爰猛烈叫床潮| 午夜精品在线看| 能在线观看的日韩av| 日韩一级片网址| 国产麻豆日韩| 奶水喷射视频一区| 亚洲视频在线观看| 男同欧美伦乱| 午夜日韩福利| 亚洲国产精品国自产拍av秋霞| 欧美视频官网| 另类酷文…触手系列精品集v1小说| 99在线|亚洲一区二区| 久久婷婷亚洲| 性欧美video另类hd性玩具| 亚洲国产mv| 国产精品视频久久一区| 欧美高清在线视频观看不卡| 亚洲欧美一区二区三区极速播放| 亚洲黄网站黄| 久久综合久久综合九色| 午夜精品www| 夜色激情一区二区| 黄色成人av网| 国产精品综合久久久| 欧美日韩三级电影在线| 久久米奇亚洲| 久久精品国产免费观看| 中文在线资源观看网站视频免费不卡 | 欧美国产专区| 久久久亚洲精品一区二区三区| 亚洲无毛电影| 日韩视频免费在线| 亚洲国产综合视频在线观看| 国产一区二区中文| 国产精品国产三级欧美二区 | 国产美女扒开尿口久久久| 欧美极品在线播放| 蜜臀久久99精品久久久久久9| 欧美一区三区二区在线观看| 亚洲香蕉伊综合在人在线视看| 亚洲三级视频在线观看| 欧美成在线观看| 免费成人网www| 久久婷婷色综合| 久久久噜噜噜久久久| 欧美综合国产| 欧美在线日韩精品| 香蕉尹人综合在线观看| 亚洲一区在线观看免费观看电影高清| 亚洲人成在线观看| 亚洲区一区二| 99热在这里有精品免费| 日韩亚洲不卡在线| 亚洲日韩视频| 日韩视频在线一区| 亚洲精品在线一区二区| 亚洲六月丁香色婷婷综合久久| 亚洲精品裸体| 夜夜嗨av色综合久久久综合网| 99视频+国产日韩欧美| 99视频在线观看一区三区| 夜夜嗨av色一区二区不卡| 日韩午夜三级在线| 中日韩高清电影网| 亚洲欧美日韩天堂一区二区| 欧美在线影院在线视频| 久久久久久久久久久久久女国产乱| 久久青青草原一区二区| 欧美不卡在线视频| 亚洲精品一二三区| 亚洲永久免费视频| 久久精品国产免费观看| 欧美ed2k| 国产精品福利网| 韩国在线一区| 9i看片成人免费高清| 午夜国产精品影院在线观看 | a91a精品视频在线观看| 亚洲先锋成人| 久久这里有精品视频| 欧美日韩国产bt| 国产中文一区二区| 亚洲乱码国产乱码精品精98午夜| 亚洲欧美国内爽妇网| 久久久久久久精| 亚洲精品一区二区三区蜜桃久| 亚洲一区二区三区在线视频| 久久免费视频在线观看| 欧美三级视频| 在线国产日韩| 欧美一级一区| 欧美国产日韩亚洲一区| 亚洲午夜免费福利视频| 久久综合久久综合久久| 欧美午夜精品理论片a级大开眼界| 国产一二精品视频| 亚洲视频一二| 欧美激情影院| 欧美在线播放一区二区| 欧美日韩国产免费| 亚洲第一黄网| 欧美一区二区三区四区高清| 亚洲欧洲另类国产综合| 欧美一区国产一区| 欧美特黄视频| 亚洲欧洲精品成人久久奇米网| 欧美一区二区在线播放| 日韩写真视频在线观看| 久久亚洲欧美| 国产亚洲第一区| 亚洲欧美日韩直播| 最新高清无码专区| 久久综合婷婷| 国内精品久久久久久影视8| 亚洲综合激情| 日韩一级网站| 欧美日韩人人澡狠狠躁视频| 亚洲国产老妈| 蜜桃久久精品一区二区| 欧美一区二区高清在线观看| 国产精品激情电影| 亚洲天堂免费在线观看视频| 亚洲国产精品尤物yw在线观看 | 免费久久精品视频| 激情欧美一区二区三区在线观看| 欧美一级在线视频| 一区二区久久久久久| 欧美区一区二区三区| 亚洲精品在线视频观看| 亚洲国产精品黑人久久久| 久久在线免费视频| 在线观看欧美激情| 欧美va亚洲va国产综合| 久久久久国产精品人| 黄色影院成人| 免费日韩成人| 另类专区欧美制服同性| 亚洲国产精品一区制服丝袜| 欧美黑人在线观看| 欧美成人免费va影院高清| 日韩视频三区| 一区二区三区高清在线| 欧美亚州一区二区三区| 欧美一区二区三区男人的天堂|