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

elva

關于DBG加載core文件

2.6 調試

2.6.1 調試器

  FreeBSD 自帶的調試器叫 gdb (GNU debugger)。要運行,輸入

% gdb progname

  然而大多數人喜歡在 Emacs 中運行這個命令。 可以這樣來起動這個命令:

M-x gdb RET progname RET

  調試器能讓你在一個可控制的環境中運行一個程序。例如,你可以一次運行程 序的一行代碼,檢查變量的值,改變這些值,或者讓程序運行到某個定點然后停止等 等。你甚至可以調試內核,當然這樣會比我們將要討論的問題要多一點點技巧。

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

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

  這一章準備只介紹 gdb 的使用方法,而不會牽涉到特殊 的問題比如調試內核。

2.6.2 在調試器中運行一個程序

  要最大限度的利用 gdb,需要使用 -g 這個選項來編譯你的程序。如果你沒有這樣做,那么你只會看 到你正在調試的函數名字,而不是它的源代碼。如果 gdb起動 時提示:

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

  你就知道你的程序在編譯的時候沒有使用 -g 選項。

  當 gdb 給出提示符,輸入 break main。 這就是告訴調試器你對正在運行的程序中預先設置的代碼沒有興趣, 并且調試器應該停在你的代碼的開頭。然后輸入 run 來開始你的程序──這會從 預先設置的代碼開始然后在調試器調用 main() 的時候就停 下來。(如果你曾迷惑 main() 是在哪里被調用的,現在應該 明白了吧!)

  現在你可以一步一步來檢查你的程序,按下 n一次就查 一行。一旦你碰見了一個函數調用,可以輸入 f 從函數調用中 退出來。你可以輸入 up或 down 來快速 檢查這個調用。

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

#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;
}

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

  我們現在編譯并運行這個程序,我們會得到

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

  但這并不是我們想要的!應該看看到底發生了什么!

% 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)

  停?。≡趺?nbsp;anint 會是 4231?難道 我們沒有在函數 main() 中設定為 5 嗎?現在我們轉到 main() 來看看。

(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 了。本來我們 是想的

...
main() {
    int i;

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

  但是我們忘了 i=5; 這一行。因為我們沒有初始化 i,這個變量在程序運行的時候就儲存了偶然在那塊內存中存在的 任意值。

注意: gdb 會顯示我們進入或離開一個函數時的棧的值。即 使是我們在使用 up 或 down 的時候。 這會顯示函數的名稱還有參數的值,讓我們知道自己的位置以及正在發生什么事情。 (棧能儲存程序在調用函數的時使用的參數,以及調用時的位置,以便程序在從函 數調用結束后知道自己的位置。)

2.6.3 檢查 core 文件

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

  要檢查一個 core 文件,以通常的方式起動 gdb。不要 輸入 break 或者 run,而要輸入

(gdb) core progname.core

  如果你沒有和 core 文件在同一個目錄,首先要執行 dir /path/to/core/file。

  你應該可以看見:

% 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)

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

  有時候,能知道一個函數是怎么被調用的是非常有用處的。因為在一個復雜的 程序里面問題可能會發生在函數調用棧上面很遠的地方。命令bt 會讓 gdb 輸出函數調用棧的回溯追蹤。

(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)

  函數 end() 在一個程序崩潰的時候將被調用;在本例 中,函數 bazz() 是從 main() 中被 調用的。

2.6.4 粘付到一個正在運行的程序

  gdb 一個最精致的特性就是它能粘付到一個已經在運行 的程序上。當然,我們得首先假定你有足夠的權限這樣去做。一個常見的問題就是, 當我們在追蹤一個包含子進程的程序時,如果你要追蹤子進程,但是調試器只允許你 追蹤父進程。

  你要做的就是起動另一個 gdb,然后用 ps 找出子進程的進程號。然后在 gdb中執行

(gdb) attach pid

  就可以像平時一樣調試了。

  “這很好,”你可能在想,“當我這樣做了以后,子進程就 會不見了”。別怕,親愛的讀者,我們可以這樣來做(參照 gdb 的 info 頁)

...
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 */
    ...

  現在所有你要做的就是粘付到子進程,設置 PauseMode 為 0,然后等待函數 sleep 返回!

posted on 2010-08-06 12:03 葉子 閱讀(1078) 評論(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>
            欧美jizzhd精品欧美喷水| 亚洲精品日本| 久久另类ts人妖一区二区| 性欧美超级视频| 欧美一区二区在线| 久久久免费精品视频| 久久综合色婷婷| 欧美激情a∨在线视频播放| 欧美日韩大片| 国产精品一区2区| 黄色日韩精品| 99re6这里只有精品| 亚洲欧美成人一区二区在线电影| 午夜精品久久久99热福利| 久久精品视频在线观看| 欧美福利电影在线观看| 99国产精品私拍| 欧美在线视频导航| 欧美精品激情在线| 国产精品日韩在线一区| 激情五月婷婷综合| 亚洲一本视频| 欧美激情成人在线| 亚洲欧美国产三级| 欧美日韩大片| 国产精品久久久久国产a级| 在线观看成人网| 亚洲性av在线| 国产欧美精品va在线观看| 亚洲一级黄色| 久久久噜噜噜久久| 国产精品vvv| 亚洲国产婷婷香蕉久久久久久99 | 韩日在线一区| 国产精品99久久不卡二区| 久久综合久久88| 亚洲视频在线视频| 欧美伦理91i| 亚洲东热激情| 久久精品成人欧美大片古装| 亚洲欧洲精品一区二区三区不卡| 亚洲一区二区3| 欧美精品一区在线观看| 伊人久久综合97精品| 性色av香蕉一区二区| 亚洲精品一区二区三区樱花| 久久久噜噜噜久久中文字幕色伊伊| 国产精品久久久久久一区二区三区 | 欧美在线一二三四区| 国产精品v欧美精品v日韩精品| 亚洲成在人线av| 久久欧美肥婆一二区| 午夜久久久久| 国产精品亚洲美女av网站| 亚洲一区视频在线观看视频| 亚洲精品资源| 欧美日韩二区三区| 亚洲午夜电影| 亚洲图片欧美一区| 国产精品综合av一区二区国产馆| 亚洲欧美日韩视频二区| 亚洲一区二区成人| 国产手机视频精品| 久久久成人精品| 久久国产天堂福利天堂| 一区在线观看| 欧美大片免费久久精品三p| 蜜桃久久精品乱码一区二区| 91久久亚洲| 亚洲精品九九| 国产精品人人做人人爽| 久久精品国产99| 久久久久久久成人| 亚洲九九爱视频| 亚洲午夜电影在线观看| 国产亚洲网站| 欧美激情精品久久久久久久变态| 欧美高清在线播放| 亚洲综合日韩在线| 欧美在线亚洲综合一区| 亚洲日韩欧美一区二区在线| 另类专区欧美制服同性| 日韩亚洲国产精品| 欧美日本乱大交xxxxx| 妖精视频成人观看www| 久久九九久精品国产免费直播| 欧美日韩亚洲一区二区三区在线| 久久久久久久欧美精品| 国产一区二区高清不卡| 麻豆精品视频在线观看视频| 亚洲女人天堂av| 蜜月aⅴ免费一区二区三区| 亚洲人成亚洲人成在线观看图片 | 亚洲三级视频在线观看| 亚洲性色视频| 亚洲精品午夜| 韩国福利一区| 欧美午夜欧美| 欧美激情二区三区| 久久精彩免费视频| 亚洲欧美日本精品| 99国产精品久久久久久久| 免费日韩一区二区| 久久亚洲私人国产精品va| 亚洲一区三区电影在线观看| 在线亚洲伦理| 午夜精品美女久久久久av福利| 亚洲最新合集| 欧美伊人久久久久久午夜久久久久 | aa成人免费视频| 亚洲高清自拍| 在线日本成人| 国产一区再线| 日韩午夜在线| 欧美顶级艳妇交换群宴| 欧美成人亚洲成人日韩成人| 久久九九免费视频| 久久久999精品免费| 久久精品在线观看| 先锋a资源在线看亚洲| 久久久精品五月天| 久久精品一区二区三区四区| 美国十次成人| 亚洲精品免费观看| 亚洲综合电影| 美女诱惑一区| 国产精品一区在线观看你懂的| 国产伦精品一区二区三区免费| 国产亚洲欧美激情| 在线免费观看日本一区| 日韩午夜电影在线观看| 亚洲欧美影院| 亚洲大胆人体在线| 亚洲在线观看免费| 欧美精品成人在线| 国产亚洲综合在线| 在线中文字幕一区| 欧美成人午夜激情| 亚洲愉拍自拍另类高清精品| 欧美高清视频在线观看| 一区二区三区自拍| 性欧美暴力猛交69hd| av成人免费| 欧美三级小说| 亚洲一区二区三区四区视频| 亚洲大片一区二区三区| 久久五月天婷婷| 亚洲国产精品传媒在线观看| 久久人人97超碰国产公开结果| 国产精品亚发布| 欧美亚洲免费高清在线观看| 亚洲一区二区在线免费观看| 欧美亚洲视频| 午夜精品久久久久久99热软件| 国产精品久久久久久久第一福利| 一本大道av伊人久久综合| 亚洲茄子视频| 欧美日韩一区二区三区在线| 亚洲欧洲一区二区三区久久| 欧美电影资源| 欧美午夜性色大片在线观看| 欧美一区日韩一区| 久久精品在线播放| 亚洲人在线视频| 一区二区三区精品国产| 国产欧美一区二区精品仙草咪| 欧美在线视频免费| 美女视频黄a大片欧美| 在线视频日韩精品| 亚洲欧美国产高清va在线播| 国产中文一区二区三区| 亚洲国产va精品久久久不卡综合| 国产精品久久久久9999高清| 欧美影院成年免费版| 免费成人高清| 久久久成人网| 国产精品久久久久久久久久久久久 | 国产精品二区二区三区| 久久精品av麻豆的观看方式 | 一本一本久久a久久精品综合妖精| 国产精品激情偷乱一区二区∴| 免费欧美日韩| 国产一区二区三区在线观看视频 | 欧美精品在欧美一区二区少妇| 久久国产欧美日韩精品| 国产精品成人一区二区艾草| 黄色免费成人| 亚洲网站在线看| 午夜精品久久久| 欧美日韩少妇| 99综合电影在线视频| 在线亚洲观看| 国产欧美日韩激情| 久久国产精品99精品国产| 久久美女艺术照精彩视频福利播放| 国产免费一区二区三区香蕉精| 亚洲一区二区三区四区中文| 亚洲欧美日韩国产综合在线| 国产欧美日韩亚洲精品| 久久激情综合|