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

酸菜豬蹄的程序人生
木下編程屯屯燙燙


作者:<leohe.leohe@gmail.com>

    Linux系統(tǒng)中在應(yīng)用程序運(yùn)行過程中經(jīng)常會遇到程序突然崩潰,提示:Segmentation fault,這是因?yàn)閼?yīng)用程序收到了SIGSEGV信號。這個信號提示當(dāng)進(jìn)程發(fā)生了無效的存儲訪問,當(dāng)接收到這個信號時,缺省動作是:終止w/core。 終止w/core的含義是:在進(jìn)程當(dāng)前目錄生成core文件,并將進(jìn)程的內(nèi)存映象復(fù)制到core文件中,core文件的默認(rèn)名稱就是“core”(這是 Unix類系統(tǒng)的一個由來已久的功能)。
    事實(shí)上,并不是只有SIGSEGV信號產(chǎn)生coredump,還有下面一些信號也產(chǎn)生coredump:SIGABRT(異常終止)、SIGBUS(硬件 故障)、SIGEMT(硬件故障)、SIGFPE(算術(shù)異常)、SIGILL(非法硬件指令)、SIGIOT(硬件故 障),SIGQUIT,SIGSYS(無效系統(tǒng)調(diào)用),SIGTRAP(硬件故障)等。
    在程序的開發(fā)調(diào)試階段(尤其是大型軟件開發(fā)),發(fā)生程序異常崩潰時常規(guī)的調(diào)試方法常常是無比的痛苦:無窮的log中也不見得有什么有意義的信息。好在GDB提供和利用core文件進(jìn)行調(diào)試的途徑,大大方便了這類問題的調(diào)試。

    下面我們通過一個簡單的例子來看看怎么通過GDB來調(diào)試一個違規(guī)訪問內(nèi)存導(dǎo)致的程序崩潰。這里我們順便講講動態(tài)庫的調(diào)試。

/******** mylib.h **********/
#ifndef __MY_LIB_H__
#define __MY_LIB_H__

int add(int x, int y);

#endif // __MY_LIB_H__
/******** end **********/



/******** mylib.c **********/
#include <stdlib.h>
#include "mylib.h"

int add(int x, int y)
{
    char* pc = NULL;
    *pc = 10;

    return x + y;
}
/******** end **********/

/******** main.c **********/

#include <stdio.h>
#include <stdlib.h>

#include "mylib.h"

int main (void)
{
    int ret = -1;
    int a = 10, b = 20;
    ret = add(a, b);

    printf("The result is: %d\n", ret);

    return 0;
}
/******** end **********/

#####################################
# File Name: Makefile
#
#####################################

CC = gcc
LD = gcc

all:
        $(CC) mylib.c -g -I. -fPIC -shared -o libmylib.so
        $(CC) main.c -g -I. -L. -lmylib -o test

clean:
        rm *.so test
#############   END   ###############

    首先將上面的代碼分別存儲到相應(yīng)的目錄,名稱為:mylib.h、mylib.c、main.c、Makefile。

1)編譯測試代碼。注)編譯時的 -g 選項(xiàng)是必須的。
[xxx@yyy]$ make
gcc mylib.c -g -I. -fPIC -shared -o libmylib.so
gcc main.c -g -I. -L. -lmylib -o t

通過ls命令我們可以看到生成了測試程序test.
[xxx@yyy]$ ls
libmylib.so main.c Makefile mylib.c mylib.h test

2)執(zhí)行測試程序
[xxx@yyy]$ ./test
./test: error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory

這個錯誤表明程序在運(yùn)行階段不能找到相應(yīng)的動態(tài)庫文件,此時需要通過環(huán)境變量 LD_LIBRARY_PATH 來指定運(yùn)行期動態(tài)庫的搜索目錄,我們的動態(tài)庫就在當(dāng)前目錄,如下:

[xxx@yyy]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

3)再次執(zhí)行測試程序
[leo@localhost debug]$ ./test
Segmentation fault
[leo@localhost debug]$ ls
libmylib.so main.c Makefile mylib.c mylib.h test

4)設(shè)置core文件大小
Segmentation fault如期而至,但是卻沒有我們更想見到的core文件!
原來系統(tǒng)在默認(rèn)情況下core文件的大小設(shè)置為0,換句話講也就是不產(chǎn)生core文件。我們可以通過 ulimit 命令來修改core文件的大小,unlimited表示不限制core文件的大小,如下(設(shè)置core文件的大小需要root權(quán)限):
[root@yyy]# ulimit -c unlimited
[root@yyy]# ./test
Segmentation fault (core dumped)
[root@yyy]# ls
core.2890 libmylib.so main.c Makefile mylib.c mylib.h test

5)設(shè)置core文件的格式,輸出路徑
通過下面命令我們還可以指定core文件的命名格式,路徑等(需要root權(quán)限):
[root@yyy]# echo "core_%e_%s" >/proc/sys/kernel/core_pattern
[root@yyy]# ./test
Segmentation fault (core dumped)
[root@yyy]# ls
core.2890 core_test_11.2898 libmylib.so main.c Makefile mylib.c mylib.h test

6)調(diào)試
[root@yyy]# gdb test core.2890
GNU gdb Red Hat Linux (6.5-8.fc6rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome 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-redhat-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
Error while mapping shared library sections:
libmylib.so: Success.
Reading symbols from /home/xxx/tst/libmylib.so...done.
Loaded symbols for libmylib.so
Reading symbols from /lib/i686/libc.so.6...done.
Loaded symbols for /lib/i686/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0 0x00a8969c in ?? ()
(gdb)

鍵入GDB命令 where
(gdb) where
#0 0x001ec44c in ?? ()
#1 0x00000000 in ?? ()

?? ()并不是我們想看到的,之所以這樣,是因?yàn)镚DB不能正確加載我們編寫的動態(tài)庫libmylib.so,我們需要在這里設(shè)置GDB的動態(tài)庫搜索路徑,如下:

(gdb) set solib-search-path .
Reading symbols from /home/xxx/test/tst/libmylib.so...done.
Loaded symbols for /home/xxx/test/tst/libmylib.so
Reading symbols from /lib/i686/libc.so.6...done.
Loaded symbols for /lib/i686/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2

可以看到GDB已經(jīng)加載了libmylib.so,再次鍵入where命令:
(gdb) where
#0 0x001ec44c in add (x=10, y=20) at mylib.c:8
#1 0x0804847c in main () at main.c:12
(gdb)

這次我們期待的結(jié)果出現(xiàn)了,GDB清楚的列出了錯誤出現(xiàn)的位置:mylib.c的第8行,好了,到那里去改code吧!
posted on 2010-11-16 10:40 cooelaf 閱讀(1483) 評論(0)  編輯 收藏 引用 所屬分類: Linux
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美精品在线视频观看| 久久久久久9| 亚洲欧美日韩国产成人精品影院 | 久久精品99国产精品日本| 欧美日韩国产bt| 在线视频欧美日韩精品| 亚洲欧洲综合| 欧美大片一区| 欧美在线视频播放| 国产视频一区在线观看| 欧美在线免费| 欧美风情在线观看| 在线一区观看| 麻豆av一区二区三区久久| 亚洲一区二区三区在线观看视频| 亚洲欧美春色| 亚洲欧美日韩国产综合在线| 蜜臀久久99精品久久久久久9 | 国内揄拍国内精品久久| 美女日韩欧美| 国产精品无码专区在线观看| 亚洲经典视频在线观看| 激情文学一区| 久久久精彩视频| 欧美在线free| 国产精品一区免费视频| 一区二区三区欧美| 亚洲一区二区三区三| 欧美视频一区| 亚洲一区二区三区视频播放| 亚洲一区久久| 国产精品久久久一区二区三区 | 欧美日韩无遮挡| 亚洲美女免费精品视频在线观看| 亚洲欧洲精品一区二区三区| 麻豆国产精品777777在线| 欧美成人精品1314www| 亚洲国产成人不卡| 欧美成人中文字幕| 日韩视频一区二区三区在线播放免费观看| 91久久夜色精品国产九色| 欧美好骚综合网| 精品成人一区二区| 久久尤物视频| 亚洲人www| 亚洲欧美日韩视频一区| 韩日欧美一区| 欧美日本高清| 久久av一区二区三区漫画| 亚洲二区视频| 欧美一区二区三区视频在线观看| 激情婷婷亚洲| 国产精品久久久久久久一区探花 | 欧美日韩国产在线播放网站| 一区二区三区 在线观看视频| 欧美专区日韩视频| 亚洲视频一二三| 亚洲欧洲一区二区三区在线观看| 欧美视频在线一区二区三区| 久久国产加勒比精品无码| 一区二区精品| 亚洲高清123| 免费不卡欧美自拍视频| 一区二区三区成人 | 激情偷拍久久| 国产毛片精品视频| 欧美日韩国产页| 欧美小视频在线| 欧美日韩一二三四五区| 久久女同精品一区二区| 亚洲永久免费| 欧美一级黄色录像| 午夜宅男欧美| 亚洲伊人网站| 亚洲一二三区视频在线观看| 日韩午夜电影av| 一本久久综合亚洲鲁鲁| 宅男精品视频| 国产精品99久久久久久久vr| 亚洲国产成人一区| 亚洲大胆美女视频| 亚洲精品久久久蜜桃| 日韩视频中文字幕| 一区二区三区回区在观看免费视频| 最新亚洲视频| 亚洲欧美日韩精品久久| 欧美在线啊v一区| 裸体一区二区三区| 亚洲三级免费观看| 亚洲综合色婷婷| 免费欧美在线视频| 国产精品国内视频| 国产一区二区三区久久| 亚洲国产日韩一区| 性欧美xxxx大乳国产app| 久久人人爽国产| 一区二区三区精品视频| 久久成人综合视频| 欧美四级伦理在线| 韩日精品视频一区| 亚洲欧美日本在线| 亚洲春色另类小说| 午夜在线a亚洲v天堂网2018| 欧美日韩国产不卡在线看| 国产一区二区欧美日韩| 亚洲在线一区二区三区| 亚洲国产精品美女| 欧美伊人精品成人久久综合97| 欧美国产日韩一区二区| 国内精品久久久久久久影视麻豆| 一本大道久久a久久精品综合| 久久精品国产久精国产思思| 亚洲人成在线播放| 欧美高清视频免费观看| 亚洲成人在线观看视频| 免费在线播放第一区高清av| 亚洲免费视频网站| 国产精品永久| 久久婷婷国产综合国色天香| 午夜在线播放视频欧美| 国产亚洲精品自拍| 国产一区二区欧美日韩| 欧美jizz19性欧美| 日韩亚洲视频在线| 亚洲精品看片| 国产精品麻豆欧美日韩ww| 亚洲直播在线一区| 欧美一区二区日韩一区二区| 国产亚洲第一区| 欧美三区视频| 久久精品久久综合| 麻豆久久婷婷| 亚洲线精品一区二区三区八戒| 一区电影在线观看| 国产一区二区无遮挡| 欧美视频一区二区三区在线观看| 亚洲欧美日韩精品综合在线观看| 亚洲女同精品视频| 亚洲精品欧美专区| 亚洲欧美在线网| 亚洲人在线视频| 欧美亚洲综合网| 夜夜爽99久久国产综合精品女不卡| 中文国产一区| 亚洲精品免费网站| 欧美一区二区观看视频| 亚洲视频在线观看视频| 久久精品中文| 欧美专区中文字幕| 国产精品久久97| 日韩午夜av电影| 99国产精品国产精品久久| 久久久久久久久久久一区| 亚洲一区美女视频在线观看免费| 久久久久www| 久久久久久久国产| 国产丝袜一区二区| 午夜精品久久久久久久99水蜜桃| 亚洲伊人一本大道中文字幕| 欧美乱妇高清无乱码| 亚洲另类在线一区| av成人免费在线观看| 欧美日韩亚洲国产精品| 亚洲日本电影在线| 亚洲免费在线精品一区| 国产精品天天摸av网| 午夜精品在线| 久久久久中文| 久久亚洲综合色| 免费观看成人鲁鲁鲁鲁鲁视频| 国产亚洲激情| 欧美国产精品专区| 日韩一区二区免费看| 亚洲在线观看| 精品动漫av| 欧美激情一区二区三区在线视频 | 久久成人一区二区| 欧美激情精品久久久久久黑人| 一本色道久久88综合日韩精品| 亚洲三级网站| 久久精品二区| 一本色道久久综合精品竹菊 | 国产精品视频久久一区| 久久深夜福利免费观看| 亚洲视频日本| 亚洲人精品午夜| 另类欧美日韩国产在线| 亚洲无限乱码一二三四麻| 在线成人av| 激情视频一区二区| 国产目拍亚洲精品99久久精品| 欧美激情第3页| 久久九九免费视频| 翔田千里一区二区| 亚洲视频在线观看网站| 亚洲精品中文字幕在线观看| 欧美成人嫩草网站| 免费在线成人av| 猛男gaygay欧美视频| 欧美在线播放一区二区|